今天来尝试下用python写一个贪吃小游戏,哈哈哈哈,毕竟贪吃蛇,大家小时候都玩过,但现在却有机会自己实现一个!!!
先上效果图:
接下来就是学习的过程啦!
1.如何画turtle画一个正方形?
其实就是一个点,往右,往下,往左,往上,回到原点..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 坐标,长度,颜色名称
def square(x, y, size, name):
import turtle
turtle.up()
turtle.goto(x, y)
turtle.down()
turtle.color(name)
turtle.begin_fill()
for count in range(4):
turtle.forward(size)
turtle.left(90)
turtle.end_fill()
然后我们就可以画出一个正方啦。
效果图:
2.画出多个连续的正方形,来模拟蛇的身子。
蛇的身子其实就是一个一个方块列表,所以我们来尝试画多个方块
1
2
3
snake = [[0,0],[0,10]]
for body in snake:
square(body[0], body[1], 10, 'black')
3.那我们如何模拟蛇的移动呢?
3.1 蛇需要可以朝四个方向移动。
x,y代表坐标
- (10,0):代表向右移动
- (-10,0):代表想左移动
- (0,10):代表向上移动
- (0,-10):代表向下移动
1
2
3
4
5
aim = [0, 10]
# 设置方向
def change_direction(x, y):
aim[0] = x
aim[1] = y
3.2 有了移动方向,我们就可以开始写移动的逻辑啦
思路是这样的: 我们把列表看成一条蛇,这条蛇的头部在右边,尾部在左边!
- 移动时,我们去除尾部的一个方块。
- 根据方向,在头部添加一个方块。
- 然后在刷新动画。
- 就可以完成蛇移动的效果啦。
下面是代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import copy
def snake_move():
head = copy.deepcopy(snake[-1]) # 深度拷贝一份头部的方块
head = [head[0] + aim[0], head[1] + aim[1]] # 头部的方块,朝一方向移动
snake.append(head) # 蛇的头部添加这个新的方块
snake.pop(0) # 蛇的尾部,去除一个方块
turtle.clear()# 清除方块
# 重新画一遍蛇的整个身子
for body in snake:
square(body[0], body[1], 10, 'black')
turtle.update()# 更新动画
turtle.ontimer(snake_move, 300)
turtle.hideturtle()
turtle.tracer(False)
3.3 现在蛇就可以移动啦,但是我们还不能控制它的方向!
我们来监听键盘的按键,用上下左右来控制蛇的移动!
1
2
3
4
5
turtle.listen()
turtle.onkey(lambda: change_direction(10, 0), "Right") # 右
turtle.onkey(lambda: change_direction(-10, 0), "Left") # 左
turtle.onkey(lambda: change_direction(0, 10), "Up") # 上
turtle.onkey(lambda: change_direction(0, -10), "Down") # 下
4.设置随机产生食物
每当一个食物被吃掉时,我们就在一个指定的区间里,随机产生食物。
1
2
3
4
5
6
if head == food: # 如果蛇头吃到了食物,我们就不删除蛇的尾巴最后一个方块
print("snake的长度", len(snake))
food[0] = randrange(-15, 15)*10 # 设置食物的区间,必须是10的倍数
food[1] = randrange(-15, 15)*10
else:
snake.pop(0) # 蛇的尾部,去除一个方块
5. 设置边界条件
当蛇碰到自己或者当蛇碰到边界的时候,我们就算输啦!!
1
2
3
4
5
6
7
8
9
10
# 先给屏幕设定一个初始值500*500
turtle.setup(500, 500)
# 设置边界条件判断
def inside(head):
return -250 < head[0] < 250 and -250 < head[1] < 250
# 在蛇移动的过程中进行判断,如果发生碰撞我们就把头部标记为红色,结束游戏。
if head in snake or not inside(head):
print(head)
square(head[0], head[1], 10, 'red')
turtle.update()
结尾
这样我们就我完成了一个简单的贪吃蛇的游戏啦,我们还可以调成速度,记录分数,还有更多的功能,大家可以自行添加。