100行系列-Python贪吃蛇小游戏

今天来尝试下用python写一个贪吃小游戏,哈哈哈哈,毕竟贪吃蛇,大家小时候都玩过,但现在却有机会自己实现一个!!!

视频:Python100行系列-贪吃蛇小游戏_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

原文:https://hzeyuan.cn/

效果图

在这里插入图片描述

下面是学习的过程啦!

1.如何画turtle画一个正方形?

其实就是一个点,往右,往下,往左,往上,回到原点…

# 座标,长度,颜色名称
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.画出多个连续的正方形,来模拟蛇的身子。

蛇的身子其实就是一个一个方块列表,所以我们来尝试画多个方块。

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):代表向下移动
aim = [0, 10]
# 设置方向
def change_direction(x, y):
    aim[0] = x
    aim[1] = y

3.2有了移动方向,我们就可以开始写移动的逻辑啦

思路是这样的:我们把列表看成一条蛇,这条蛇的右边在右边,尾部在左边!

  • 移动时,我们消除尾部的一个方块。
  • 根据方向,在头部添加一个方块。
  • 然后在刷新动画。
  • 就可以完成蛇移动的效果啦。

下面是代码

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现在蛇就可以移动啦,但是我们还不能控制它的方向!

我们来监听键盘的按键,用上下左右来控制蛇的移动!

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.设置随机产生食物

首先一个食物被吃掉时,我们就在一个指定的区间里,随机产生食物。

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.设置边界条件

当蛇碰到自己或者当蛇碰到边界的时候,我们就算输啦!!

# 先给屏幕设定一个初始值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()

6.结尾

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

发布了64 篇原创文章 · 获赞 30 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章