[Python100行系列]-贪吃蛇小游戏

[Python100行系列]-贪吃蛇小游戏

Posted by Hzy on January 11, 2020

Hzy的博客

今天来尝试下用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()

结尾

这样我们就我完成了一个简单的贪吃蛇的游戏啦,我们还可以调成速度,记录分数,还有更多的功能,大家可以自行添加。