Python入门: 贪吃蛇详解

贪吃蛇

用python3实现小时候非常喜欢的: Gluttonous Snake 😛 来玩~

前期准备
  1. pip3 下载 pygame 模块
➜  ~ pip3 install pygame
Collecting pygame
  Downloading pygame-2.0.1-cp37-cp37m-macosx_10_9_intel.whl (6.9 MB)
     |████████████████████████████████| 6.9 MB 368 kB/s
Installing collected packages: pygame
Successfully installed pygame-2.0.1
  1. 测试 pygame 是否下载成功
➜  ~ python3
Python 3.7.8 (default, Jul  8 2020, 14:18:28)
[Clang 11.0.3 (clang-1103.0.32.62)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygame
pygame 2.0.1 (SDL 2.0.14, Python 3.7.8)
Hello from the pygame community. https://www.pygame.org/contribute.html
思路梳理

a. 定义变量

  1. 背景(大小、颜色、名称)
  2. 贪吃蛇身(坐标、颜色)
  3. 蛇头坐标
  4. 食物块(坐标、颜色)
  5. 贪吃蛇初始前进方向
  6. 移动速度
  7. 改变方向

b. 如何改变运行方向 ?

答: 接收键盘输入方向信息后, 相应控制蛇头的坐标做出改变

c. 如何记录移动过程中的蛇身坐标的变化 ?

答: 栈, 先入后出, 蛇头每次移动到新位置, 将新位置入栈作为新蛇头, 将旧尾巴弹栈保证蛇身长度不变.

代码完全体(直接粘贴运行即可)
import pygame, sys, random
from pygame.locals import *

# 定义颜色变量:0-255,0黑色 255白色
redColor = pygame.Color(255, 0, 0)
blackColor = pygame.Color(0, 0, 0)
whiteColor = pygame.Color(255, 255, 255)

# 定义游戏结束
def gameover():
    pygame.quit()
    sys.exit()

# 入口函数:定义游戏开始
def main():
    # 0.初始化pygame模块,创建显示界面playSurface
    pygame.init()
    playSurface = pygame.display.set_mode((640, 480))
    pygame.display.set_caption('贪吃蛇')

    # 1.初始化贪吃蛇身体,列表中三个元素表示三个身体块的坐标
    snakeBody = [[100, 100], [80, 100], [60, 100]]
    # 2.指定蛇头坐标
    snakePosition = [100, 100]
    # 3.初始化食物块坐标与状态(0被吃掉、1未被吃掉)
    targetPosition = [300, 300]
    targetFlag = 1
    # 4.初始化贪吃蛇前进方向
    direction = 'right'
    # 5.贪吃蛇移动速度
    fpsClock = pygame.time.Clock()
    # 6.改变方向
    changeDirection = direction
    
    while True:
        # 识别键盘输入的方向信息
        for event in pygame.event.get():
            if event.type == QUIT:
                gameover()
            elif event.type == KEYDOWN:
                # 用'wasd'和'方向键'两种方式来表示上下左右️,esc退出游戏
                if event.key == K_d or event.key == K_RIGHT:
                    changeDirection = 'right'
                if event.key == K_a or event.key == K_LEFT:
                    changeDirection = 'left'
                if event.key == K_w or event.key == K_UP:
                    changeDirection = 'up'
                if event.key == K_s or event.key == K_DOWN:
                    changeDirection = 'down'
                if event.key == K_ESCAPE:
                    gameover()

        # 确定贪吃蛇前进方向(不能直接反方向行驶)
        if changeDirection == 'left' and not direction == 'right':
            direction = changeDirection
        if changeDirection == 'right' and not direction == 'left':
            direction = changeDirection
        if changeDirection == 'up' and not direction == 'down':
            direction = changeDirection
        if changeDirection == 'down' and not direction == 'up':
            direction = changeDirection

        # 根据方向移动时,蛇头的坐标发生改变
        if direction == 'right':
            snakePosition[0] += 20
        if direction == 'left':
            snakePosition[0] -= 20
        if direction == 'up':
            snakePosition[1] -= 20
        if direction == 'down':
            snakePosition[1] += 20

        # *** 移动过程中的蛇身坐标的变化 ***
        # 核心:栈的先入后出,蛇头移动到新坐标,将新坐标入栈而后弹栈去除最后一项,从而保证蛇身长度不变
        snakeBody.insert(0, list(snakePosition))
        # 如果蛇头和目标方块的位置重合,代表吃掉食物块,此时蛇身增长一块,列表中新增一项
        if snakePosition[0] == targetPosition[0] and snakePosition[1] == targetPosition[1]:
            targetFlag = 0
        # 弹栈:正常移动未吃掉食物块时,去除列表最后一项(保证蛇身长度不变)
        else:
            snakeBody.pop()

        # 食物块被吃掉后随机生成
        if targetFlag == 0:
            x = random.randrange(1, 32)
            y = random.randrange(1, 24)
            targetPosition = [int(x * 20), int(y * 20)]
            targetFlag = 1

        # 对playSurface界面进行颜色填充
        playSurface.fill(blackColor)
        for position in snakeBody:
            # playSurface界面中,使用redColor颜色,对蛇身每一块position位置长20宽20的方块,进行填充(0代表填充)
            pygame.draw.rect(playSurface, redColor, Rect(position[0], position[1], 20, 20),0)
        # 食物块颜色填充
        pygame.draw.rect(playSurface, whiteColor, Rect(targetPosition[0], targetPosition[1], 20, 20),0)

        # 更新显示到屏幕表面
        pygame.display.flip()
        # 判断是否游戏结束(仅考虑撞墙结束,可自行添加撞身体结束判断)
        if snakePosition[0] > 620 or snakePosition[0] < 0:
            gameover()
        elif snakePosition[1] > 460 or snakePosition[1] < 0:
            gameover()

        # 控制贪吃蛇移动速度:每秒调用5次tick函数,达到设置页面刷新率的效果
        fpsClock.tick(5)

# 启动入口函数
if __name__ == '__main__':
    main()
效果

在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现移动,吃食变长游戏把子上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,更不能咬自己的尾巴,等到了一定的分数,就能过关,然后继续玩下一关。[3] 二、“贪吃蛇”游戏的发展编辑 改变此款游戏的特别多。比如在蛋的方面,可能放上带道具的蛋,使蛇吃完后具有保护,穿墙等特种功能,而且难度逐渐变难,游戏制作的精细度和画面的质量也随着版本的提高而不断提高,且有单人及团队联机对战版本陆续推出。 参考资料游戏把子上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,更不能咬自己的尾巴,等到了一定的分数,就能过关,然后继续玩下一关。[3] 二、“贪吃蛇”游戏的发展编辑 改变此款游戏的特别多。比如在蛋的方面,可能放上带道具的蛋,使蛇吃完后具有保护,穿墙等特种功能,而且难度逐渐变难,游戏制作的精细度和画面的质量也随着版本的提高而不断提高,且有单人及团队联机对战版本陆续推出。 游戏把子上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,更不能咬自己的尾巴,等到了一定的分数,就能过关,然后继续玩下一关。[3] 二、“贪吃蛇”游戏的发展编辑 改变此款游戏的特别多。比如在蛋的方面,可能放上带道具的蛋,使蛇吃完后具有保护,穿墙等特种功能,而且难度逐渐变难,游戏制作的精细度和画面的质量也随着版本的提高而不断提高,且有单人及团队联机对战版本陆续推出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值