网站怎么做百度能搜到,形象设计师培训网课,lnmp wordpress 换域名,关于节约化建设网站的表态发言文章目录 #x1f525;一、运行效果#x1f4a5;二、游戏教程✈1. 导入模块❤️2. 初始化游戏元素☔3. 改变蛇移动的方向#x1f44a;4. 绘制方块#x1f680;5. 检查蛇头是否在游戏区域内#x1f308;6. 定义蛇的移动函数#x1f3ac;7. 绑定键盘事件 ⭐三、完整代码 一、运行效果二、游戏教程✈1. 导入模块❤️2. 初始化游戏元素☔3. 改变蛇移动的方向4. 绘制方块5. 检查蛇头是否在游戏区域内6. 定义蛇的移动函数7. 绑定键盘事件 ⭐三、完整代码 一、运行效果 Python实现贪吃蛇 二、游戏教程
turtle模块 Python的turtle模块是一个非常基础的绘图库它允许用户创建一个画布并在上面绘制图形。这个模块通常用于教学目的特别是适合初学者学习编程和理解基本的图形概念。 turtle的一些关键特性 画布和乌龟turtle模块提供了一个名为“乌龟”的画笔可以在一个名为“画布”的窗口上绘制图形。用户可以控制乌龟的移动来画出各种图案。前进和后退可以使用forward()和backward()方法让乌龟在画布上前进或后退。转向left()和right()方法可以让乌龟左转或右转可以通过度数参数指定转向的角度。抬笔和落笔penup()和pendown()方法分别用于抬起和放下乌龟的笔抬起笔时乌龟移动不会绘制线条而放下笔时会绘制线条。颜色和填充可以设置乌龟绘制的颜色并且可以填充封闭图形的内部。速度控制可以设置乌龟的移动速度从最快到最慢。监听事件turtle模块可以监听键盘和鼠标事件这使得它可以用来创建简单的交互式图形应用。设置画布可以设置画布的大小、背景颜色等。坐标系统turtle模块使用笛卡尔坐标系原点在画布的中心x轴向右y轴向上。子图和窗口可以在一个窗口中创建多个乌龟对象或者在多个窗口中绘图。更新和动画通过update()方法可以刷新画布显示实现动画效果。事件循环turtle模块提供了事件循环允许程序保持运行状态直到用户关闭窗口。 turtle模块非常适合用来创建游戏、绘制复杂的几何图形或者作为教授编程逻辑和控制结构的工具。
✈1. 导入模块
import turtle
import copy
from random import randrangeturtle用于绘制图形和动画。copy用于复制蛇的头部坐标避免在移动蛇时直接修改原始列表。randrange从random模块中导入用于生成随机数这里用来随机放置食物。
❤️2. 初始化游戏元素
创建画布和设置标题
wn turtle.Screen()
wn.title(贪吃蛇游戏)保持打开绘图窗口
# 不让屏幕立马消失
turtle.done()turtle.done()是一个非常重要的函数它用于结束绘图操作并保持打开绘图窗口直到用户关闭该窗口。这允许用户观察绘制的图形而不会因为程序的结束而丢失绘图结果。 使用场景 在绘制图形或动画的最后你会调用turtle.done()来结束你的绘图脚本。例如在绘制完一个图形或完成一个动画循环后你可以使用它来防止程序立即退出从而让用户有足够的时间来查看结果。 注意事项
如果在调用turtle.done()之前程序崩溃或被强制终止绘图窗口可能会立即关闭。在某些IDE如Jupyter Notebook中turtle.done()可能不会按预期工作因为这些环境可能不支持turtle模块的图形窗口特性。
设置蛇的长度
snake [[0, 0], [0, 10], [0, 20]]这里初始化了蛇的三个部分每个部分由一个列表表示列表包含两个元素分别代表蛇的x和y坐标。在这个例子中蛇有三个部分初始位置分别是(0, 0)、(0, 10)和(0, 20)。
蛇移动的方向
aim [0, 10]aim列表定义了蛇的移动方向其中第一个元素是水平方向向右为正向左为负第二个元素是垂直方向向下为正向上为负。这里蛇默认向上移动。
设置食物
food [-10, 0]food列表定义了食物的初始位置同样使用x和y坐标表示。这里食物的初始位置是(-10, 0)。
这些初始化步骤为游戏设置了基本的起点包括蛇的初始位置和方向、食物的位置以及游戏窗口的标题。
☔3. 改变蛇移动的方向
# 改变蛇移动的方向
def change_direction(x, y):aim[0] xaim[1] ydef 是 Python 中用来定义函数的关键字。change_direction 是函数名这里表示改变方向的功能。x 和 y 是函数的参数分别代表蛇在水平x轴和垂直y轴方向上的移动增量。
参数作用
aim[0] x这行代码将水平方向的移动增量更新为参数 x 的值。如果 x 为正蛇将向右移动如果为负则向左移动如果为0则蛇的水平位置不变。aim[1] y这行代码将垂直方向的移动增量更新为参数 y 的值。如果 y 为正蛇将向下移动如果为负则向上移动如果为0则蛇的垂直位置不变。
注意事项
在实际的游戏实现中需要确保蛇的移动方向不会违反游戏规则例如蛇不能瞬间反向移动这可能需要额外的逻辑来处理。该函数直接修改了全局变量 aim这意味着它对所有使用 aim 的代码都是可见的。在更复杂的程序中可能需要考虑使用类和方法来封装数据和行为。
4. 绘制方块
def square(x, y, size, color):# 抬起画笔turtle.penup()# 画笔痕迹turtle.goto(x, y)# 放下画笔turtle.pendown()# 进行渲染turtle.color(color)turtle.begin_fill()# 在画布上画四笔转一圈生成一个方块for i in range(4):turtle.forward(size)turtle.left(90)turtle.end_fill()turtle.penup() 这是让画笔抬起这样当乌龟移动到绘制方块的起始位置时不会在画布上留下痕迹。turtle.goto(x, y) 这是让乌龟移动到坐标 (x, y) 的位置即方块左上角的起始位置。 turtle.pendown() 放下画笔这样接下来的移动就会在画布上绘制线条。 turtle.color(color) 设置接下来绘制的图形的颜色。 turtle.begin_fill() 这行代码指示 turtle 开始填充封闭图形的内部。 turtle.end_fill() 结束填充过程封闭图形的最后面完成方块的绘制。
for i in range(4):turtle.forward(size)turtle.left(90)循环执行四次每次绘制方块的一边。turtle.forward(size) 让乌龟前进 size 个单位turtle.left(90) 让乌龟左转90度从而改变方向绘制下一条边。
这个函数可以被用来在 turtle 画布上绘制贪吃蛇游戏中的蛇的身体部分和食物。通过改变 size 和 color 参数可以创建不同大小和颜色的方块。
5. 检查蛇头是否在游戏区域内
def inside(head):return -250 head[0] 250 and -250 head[1] 250函数体内的 return 语句包含了一个布尔表达式用于检查 head 中的 x 和 y 坐标是否同时满足以下条件
head[0]即蛇头的 x 坐标大于 -250 并且小于 250。head[1]即蛇头的 y 坐标大于 -250 并且小于 250。
如果两个条件都为真函数返回 True表示蛇头在游戏窗口内如果任一条件不满足即蛇头坐标超出了这个范围函数返回 False表示蛇头已经撞到了游戏边界。
注意事项 在实际的游戏实现中你需要根据实际的游戏窗口大小来调整函数中的边界值。上面的代码中使用的边界值 -250 和 250 是示例具体值应根据你的游戏设计来设定。
6. 定义蛇的移动函数
# 定义蛇的移动的函数
def sanke_move():head copy.deepcopy(snake[-1])head [head[0] aim[0], head[1] aim[1]]print(head[0], head[1])# 判断是否发生了碰撞if head in snake or not inside(head):print(Game Over!)square(head[0], head[1], 10, red)return# 判断蛇碰到食物后的操作if head food:food[0] randrange(-15, 15) * 10food[1] randrange(-15, 15) * 10else:snake.pop(0)snake.append(head)turtle.clear()square(food[0], food[1], 10, blue)# 遍历蛇的列表画出蛇的长度for body in snake:square(body[0], body[1], 10, black)# 更新使动画的出现不是那么突兀turtle.update()turtle.ontimer(sanke_move, 300)sanke_move 函数是贪吃蛇游戏中控制蛇移动的核心函数。 蛇头位置更新通过将蛇的最后一个部分尾部的坐标与蛇的移动方向aim相加计算出蛇头的新位置。游戏结束判断检查新计算出的蛇头位置是否超出了游戏边界通过inside函数判断或者蛇头是否与蛇身的其他部分重叠即蛇撞到自己了。如果是则结束游戏并在蛇头位置绘制一个红色方块表示碰撞点。食物碰撞检测如果蛇头位置与食物位置相同表示蛇吃到食物。此时生成新的食物位置并让蛇增长不移除蛇身的最前部分。蛇身更新如果蛇没有吃到食物移除蛇身的最前部分模拟蛇的移动效果。然后将新计算的蛇头位置添加到蛇身列表的末尾。绘制更新清除画布重新绘制食物和蛇身。食物用蓝色方块表示蛇身用黑色方块表示。动画效果使用turtle.update()刷新屏幕显示使上述绘制更新生效。循环调用通过turtle.ontimer设置定时器每隔300毫秒自动调用一次sanke_move函数从而实现蛇的连续移动形成动画效果。 sanke_move函数负责根据用户的操作更新蛇的位置检查游戏状态如是否吃到食物或游戏是否结束并更新屏幕上的显示是贪吃蛇游戏的控制中心。
7. 绑定键盘事件
设置屏幕大小
turtle.setup(500, 500)这行代码设置了turtle画布的宽度和高度为500像素。这意味着蛇将在一个500x500像素的窗口内移动。
去除绘制动画
turtle.tracer(False)turtle.tracer()函数控制是否在绘制图形时显示动画。将其设置为False可以关闭绘制方块时的动画效果使方块几乎是立即出现的这对于需要快速更新屏幕的游戏来说是必要的。
隐藏画笔乌龟
turtle.hideturtle()这行代码隐藏了turtle模块中用于绘制的“乌龟”即画笔。在大多数游戏中我们不需要看到这个画笔只需要看到它绘制的图形。
监听键盘事件
turtle.listen()turtle.listen()开始监听键盘事件使得我们可以为特定的按键绑定特定的函数。
绑定键盘按键
turtle.onkey(lambda: change_direction(0, 10), Up)
turtle.onkey(lambda: change_direction(0, -10), Down)
turtle.onkey(lambda: change_direction(-10, 0), Left)
turtle.onkey(lambda: change_direction(10, 0), Right)这四行代码将键盘的上下左右箭头键与change_direction函数绑定。当用户按下相应的箭头键时会调用change_direction函数并传入相应的参数这些参数定义了蛇的新移动方向。 “Up” 箭头蛇向上移动减少y坐标。“Down” 箭头蛇向下移动增加y坐标。“Left” 箭头蛇向左移动减少x坐标。“Right” 箭头蛇向右移动增加x坐标。 lambda函数是一个匿名函数它创建了一个新的函数对象这里用于简化onkey的回调函数。
⭐三、完整代码
import turtle
import copy
from random import randrange# 设置蛇的长度
snake [[0, 0], [0, 10], [0, 20]]
# 蛇移动的方向(默认向上移动)
aim [0, 10]
# 设置食物
food [-10, 0]
wn turtle.Screen()
# 设置标题
wn.title(贪吃蛇游戏)# 改变蛇移动的方向
def change_direction(x, y):aim[0] xaim[1] ydef square(x, y, size, color):# 抬起画笔turtle.penup()# 画笔痕迹turtle.goto(x, y)# 放下画笔turtle.pendown()# 进行渲染turtle.color(color)turtle.begin_fill()# 在画布上画四笔转一圈生成一个方块for i in range(4):turtle.forward(size)turtle.left(90)turtle.end_fill()def inside(head):return -250 head[0] 250 and -250 head[1] 250# 定义蛇的移动的函数
def sanke_move():head copy.deepcopy(snake[-1])head [head[0] aim[0], head[1] aim[1]]print(head[0], head[1])# 判断是否发生了碰撞if head in snake or not inside(head):print(Game Over!)square(head[0], head[1], 10, red)return# 判断蛇碰到食物后的操作if head food:food[0] randrange(-15, 15) * 10food[1] randrange(-15, 15) * 10else:snake.pop(0)snake.append(head)turtle.clear()square(food[0], food[1], 10, blue)# 遍历蛇的列表画出蛇的长度for body in snake:square(body[0], body[1], 10, black)# 更新使动画的出现不是那么突兀turtle.update()turtle.ontimer(sanke_move, 300)# 设置屏幕的大小
turtle.setup(500, 500)
# 去除一个一个画方块的动画
turtle.tracer(False)
# 去掉箭头画画用的画笔
turtle.hideturtle()
# 用来监听键盘获取键盘的事件
turtle.listen()
# 用来监听函数(通过控制转向函数达到让蛇转向的目的
turtle.onkey(lambda: change_direction(0, 10), Up)
turtle.onkey(lambda: change_direction(0, -10), Down)
turtle.onkey(lambda: change_direction(-10, 0), Left)
turtle.onkey(lambda: change_direction(10, 0), Right)
sanke_move()
# 不让屏幕立马消失
turtle.done()