当前位置: 首页 > news >正文

使用Python写贪吃蛇游戏

贪吃蛇游戏是一款经典的小游戏,玩家通过控制蛇的移动来吃食物,蛇的身体会随着吃到的食物越来越多而变长。本文将介绍如何使用Python来创建一个简单的贪吃蛇游戏。

 

 

代码解析

1. 设置窗口

首先,我们需要设置游戏窗口。使用 turtle.Screen() 创建一个窗口,并设置窗口的标题、背景颜色和大小。通过 window.tracer(0) 关闭自动更新屏幕,以提高性能。

import turtle
import time
import randomwindow = turtle.Screen()window.title("XXX")window.bgcolor("black")window.setup(width=800, height=600)window.tracer(0)

 

2. 创建蛇头

接下来,我们创建蛇头。使用 turtle.Turtle() 创建一个 Turtle 对象,设置其速度、形状、颜色,并将其移动到屏幕中央。

head = turtle.Turtle()
head.speed(0)head.shape("square")head.color("white")head.direction = "stop"

 

3. 创建蛇身体和食物

我们使用一个列表 segments 来存储蛇的身体部分。食物也是一个 Turtle 对象,随机生成在屏幕上。

segments = []food = turtle.Turtle()
food.speed(0)food.goto(random.randint(-14, 14) * 20, random.randint(-14, 14) * 20)

 

4. 移动函数

定义一个 move 函数来控制蛇的移动。根据蛇头的方向,更新其坐标。

def move():if head.direction == "up":elif head.direction == "down":elif head.direction == "left":elif head.direction == "right":

 

5. 键盘绑定

通过键盘绑定函数来控制蛇的移动方向。使用 window.listen() 和 window.onkeypress() 来监听键盘事件。

def go_up():if head.direction != "down":head.direction = "up"
def go_down():if head.direction != "up":head.direction = "down"
def go_left():if head.direction != "right":head.direction = "left"
def go_right():if head.direction != "left":head.direction = "right"window.listen()
window.onkeypress(go_up, "Up")
window.onkeypress(go_down, "Down")
window.onkeypress(go_left, "Left")
window.onkeypress(go_right, "Right")

 

6. 主循环

在主循环中,我们更新屏幕、检查边界碰撞、食物碰撞,并移动蛇的身体。通过 time.sleep(0.1 / speed) 来控制游戏速度。

while True:window.update()
if head.xcor() > 290 or head.xcor() < -290 or head.ycor() > 290 or head.ycor() < -290:time.sleep(1)head.goto(0, 0)head.direction = "stop"for segment in segments:segment.goto(1000, 1000)segments.clear()
if head.distance(food) < 20:food.goto(random.randint(-14, 14) * 20, random.randint(-14, 14) * 20)new_segment = turtle.Turtle()new_segment.speed(0)new_segment.shape("square")new_segment.color("grey")new_segment.penup()segments.append(new_segment)
for index in range(len(segments) - 1, 0, -1):x = segments[index - 1].xcor()y = segments[index - 1].ycor()segments[index].goto(x, y)
if len(segments) > 0:x = head.xcor()y = head.ycor()segments[0].goto(x, y)move()
for segment in segments:if segment.distance(head) < 20:time.sleep(1)head.goto(0, 0)head.direction = "stop"for segment in segments:segment.goto(1000, 1000)segments.clear()time.sleep(0.1 / speed)

 

 

完整代码

import turtle
import time
import randomwindow = turtle.Screen()
window.title("贪吃蛇小游戏")
window.bgcolor("black")
window.setup(width=800, height=600)
window.tracer(0)head = turtle.Turtle()
head.speed(0)
head.shape("square")
head.color("white")
head.penup()
head.goto(0, 0)
head.direction = "stop"segments = []food = turtle.Turtle()
food.speed(0)
food.shape("circle")
food.color("red")
food.penup()
food.goto(random.randint(-14, 14) * 20, random.randint(-14, 14) * 20)def move():if head.direction == "up":y = head.ycor()head.sety(y + 20)elif head.direction == "down":y = head.ycor()head.sety(y - 20)elif head.direction == "left":x = head.xcor()head.setx(x - 20)elif head.direction == "right":x = head.xcor()head.setx(x + 20)def go_up():if head.direction != "down":head.direction = "up"
def go_down():if head.direction != "up":head.direction = "down"
def go_left():if head.direction != "right":head.direction = "left"
def go_right():if head.direction != "left":head.direction = "right"window.listen()
window.onkeypress(go_up, "Up")
window.onkeypress(go_down, "Down")
window.onkeypress(go_left, "Left")
window.onkeypress(go_right, "Right")speed = 0.7
while True:window.update()if head.xcor() > 290 or head.xcor() < -290 or head.ycor() > 290 or head.ycor() < -290:time.sleep(1)head.goto(0, 0)head.direction = "stop"for segment in segments:segment.goto(1000, 1000)segments.clear()if head.distance(food) < 20:food.goto(random.randint(-14, 14) * 20, random.randint(-14, 14) * 20)new_segment = turtle.Turtle()new_segment.speed(0)new_segment.shape("square")new_segment.color("grey")new_segment.penup()segments.append(new_segment)for index in range(len(segments) - 1, 0, -1):x = segments[index - 1].xcor()y = segments[index - 1].ycor()segments[index].goto(x, y)if len(segments) > 0:x = head.xcor()y = head.ycor()segments[0].goto(x, y)move()for segment in segments:if segment.distance(head) < 20:time.sleep(1)head.goto(0, 0)head.direction = "stop"for segment in segments:segment.goto(1000, 1000)segments.clear()time.sleep(0.1 / speed)

 

通过以上步骤,我们成功创建了一个简单的贪吃蛇游戏。后续可以根据需要进一步优化和扩展游戏功能,例如增加得分系统、难度级别等!

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 计算机网络概述(分组延时、丢失和吞吐量)
  • python-矩阵交换行
  • 基于detectron2框架的深度学习模型载入自定义数据集
  • Flink1.14.* 各种算子在StreamTask控制下如何调用的源码
  • FPGA第 5 篇,FPGA技术优略势,FPGA学习方向,FPGA学习路线(FPGA专业知识的学习方向,FPGA现场可编程门阵列学习路线和方向)
  • 深入浅出:关系数据库中的基础概念与形式化定义
  • 提交保存,要做重复请求拦截,避免出现重复保存的问题
  • vue3图片找不到用一个其他图片代替
  • 跳跃游戏 II
  • Sinc Function介绍
  • C++:引用
  • 【Python报错已解决】`TypeError: an integer is required (got type bytes)`
  • 原码 补码 反码
  • 常用开发工具配置笔记
  • 保存大量数据用sqllite还是indexdb
  • 分享一款快速APP功能测试工具
  • 【Leetcode】104. 二叉树的最大深度
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【技术性】Search知识
  • 【译】理解JavaScript:new 关键字
  • Android系统模拟器绘制实现概述
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • emacs初体验
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Java 内存分配及垃圾回收机制初探
  • JavaScript异步流程控制的前世今生
  • JS基础之数据类型、对象、原型、原型链、继承
  • Laravel 中的一个后期静态绑定
  • Map集合、散列表、红黑树介绍
  • maya建模与骨骼动画快速实现人工鱼
  • oschina
  • php的插入排序,通过双层for循环
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • 记录:CentOS7.2配置LNMP环境记录
  • 如何进阶一名有竞争力的程序员?
  • 实现菜单下拉伸展折叠效果demo
  • 算法之不定期更新(一)(2018-04-12)
  • k8s使用glusterfs实现动态持久化存储
  • Nginx实现动静分离
  • ​​​​​​​​​​​​​​Γ函数
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • (06)Hive——正则表达式
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (WSI分类)WSI分类文献小综述 2024
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (五)c52学习之旅-静态数码管
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)关于pipe()的详细解析
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .form文件_一篇文章学会文件上传
  • .Net IE10 _doPostBack 未定义
  • .NET 依赖注入和配置系统