python笔记—>贪吃蛇游戏制作

1、安装需要的库pygame

Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows、Linux、Mac OS 等操作系统,具有良好的跨平台性。Pygame 由  Pete Shinners 于 2000 年开发而成,是一款免费、开源的的软件包,因此您可以放心地使用它来开发游戏,不用担心有任何费用产生。

终端安装执行命令为        pip install pygame

本人采用的是pycharm编译器, 在pycharm中可以在设置中的python解释器中安装pygame包。

2、创建文件夹

用于保存代码及其所需要的字体和图片

 1、其中字体用到的文件为s.ttf,可在网站中下载喜欢的字体,将字体另存为s.ttf放在fonts文件夹中。

2、images中的图片文件为cookie.jpg        snake1.jpg

3、创建python文件为 snake.py

3、游戏代码解析

1、导入需要的库

import pgzrun  # 导入游戏库
import random # 导入随机库

 2、界面大小及蛇大小

TILE_SIZE = 20  # 小蛇方块的大小,20*20
WIDTH = 40*TILE_SIZE  # 设置窗口的宽度 800
HEIGHT = 30*TILE_SIZE  # 设置窗口的高度 600

3、导入蛇头及食物

snkaeHead = Actor('snake1')  # 导入蛇头方块图片
snkaeHead.x = WIDTH/2   # 蛇头方块图片的x坐标
snkaeHead.y = HEIGHT/2  # 蛇头方块图片的y坐标

cookie = Actor('cookie')  # 导入食物方块图片
cookie.x = random.randint(10, 30)*TILE_SIZE  # 食物方块图片的x坐标
cookie.y = random.randint(10, 30)*TILE_SIZE  # 食物方块图片的y坐标
Snake = []  # 存储蛇的列表
Snake.append(snkaeHead)  # 把蛇头加入到列表中

for i in range(4):  # 再为蛇添加4段蛇身
    snakebody = Actor('snake1')  # 导入蛇身方块图片
    snakebody.x = Snake[i].x - TILE_SIZE  # 蛇身方块图片的x坐标
    snakebody.y = Snake[i].y  # 蛇身方块图片的y坐标
    Snake.append(snakebody)   # 把蛇身加入到列表中

  4、 初始运动方向、分数及成败

direction = 'up'  # 控制小蛇运动方向
isLoose = False # 游戏是否失败
score = 0 # 游戏得分

5、绘图

def draw():  # 绘制模块,每帧重复执行
    screen.clear()  # 每帧清除屏幕,便于重新绘制
    for snkaebody in Snake:  # 绘制蛇
        snkaebody.draw()
    cookie.draw() # 食物的绘制
    screen.draw.text("得分:"+str(score), (360, 20), fontsize=25,
                     fontname='s', color='white')
    if isLoose:  # 显示游戏失败信息
        screen.draw.text("游戏失败!", (180, HEIGHT/2-100),
                         fontsize=100, fontname='s', color='blue')

6、键盘操作运动方向

def update():  # 更新模块,每帧重复操作
    global direction
    if keyboard.left:  # 如果按下键盘左键
        direction = 'left'  # 小蛇要向左移
    if keyboard.right:  # 如果按下键盘右键
        direction = 'right'  # 小蛇要向右移
    if keyboard.up:  # 如果按下键盘上键
        direction = 'up'  # 小蛇要向上移
    if keyboard.down:  # 如果按下键盘下键
        direction = 'down'  # 小蛇要向下移

7、蛇运动及碰撞效果

def moveSnake(): # 和蛇相关的一些操作
    global direction, isLoose, score
    if isLoose:
        return
    newSnakeHead = Actor('snake1')  # 创建新蛇头的图片
    # 根据direction变量设定新蛇头的坐标,比如小蛇向下移动,就在旧蛇头的下边
    newSnakeHead = Actor('snake1')
    if direction == 'right':  # 小蛇向右移动
        newSnakeHead.x = Snake[0].x + TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'left':  # 小蛇向左移动
        newSnakeHead.x = Snake[0].x - TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'up':  # 小蛇向上移动
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y - TILE_SIZE
    if direction == 'down':  # 小蛇向下移动
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y + TILE_SIZE

    # 当小蛇(新蛇头)超出边框时游戏失败
    if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT \
        or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH:
        isLoose = True
    # 当小蛇蛇头碰到自身时,游戏失败
    for snakebody in Snake: # 对所有蛇身循环,判断是否和蛇头坐标一致
        if newSnakeHead.x == snakebody.x and newSnakeHead.y == snakebody.y:
            isLoose = True
            break
    # 当小蛇头碰到食物时,不处理,也就是长度+1;饼干重新随机位置出现;
    if newSnakeHead.x == cookie.x and newSnakeHead.y == cookie.y:
        cookie.x = random.randint(5, 35)*TILE_SIZE
        cookie.y = random.randint(5, 25)*TILE_SIZE
        score = score + 1  # 得分加1
    else:  # 否则,删除掉旧蛇尾,也就是蛇的长度保持不变
        del Snake[len(Snake)-1]
    Snake.insert(0, newSnakeHead)  # 把新蛇头加到列表的最前面
    # time.sleep(0.2)  # 暂停0.2秒
    clock.schedule_unique(moveSnake, 0.2)  # 下一次隔0.2秒调用

8、调用函数及执行游戏

moveSnake()  # 调用移动蛇的函数
pgzrun.go()  # 开始执行游戏

4、游戏完整代码

import pgzrun  # 导入游戏库
import random # 导入随机库

TILE_SIZE = 20  # 小蛇方块的大小,20*20
WIDTH = 40*TILE_SIZE  # 设置窗口的宽度 800
HEIGHT = 30*TILE_SIZE  # 设置窗口的高度 600

snkaeHead = Actor('snake1')  # 导入蛇头方块图片
snkaeHead.x = WIDTH/2   # 蛇头方块图片的x坐标
snkaeHead.y = HEIGHT/2  # 蛇头方块图片的y坐标

cookie = Actor('cookie')  # 导入食物方块图片
cookie.x = random.randint(10, 30)*TILE_SIZE  # 食物方块图片的x坐标
cookie.y = random.randint(10, 30)*TILE_SIZE  # 食物方块图片的y坐标

Snake = []  # 存储蛇的列表
Snake.append(snkaeHead)  # 把蛇头加入到列表中
for i in range(4):  # 再为蛇添加4段蛇身
    snakebody = Actor('snake1')  # 导入蛇身方块图片
    snakebody.x = Snake[i].x - TILE_SIZE  # 蛇身方块图片的x坐标
    snakebody.y = Snake[i].y  # 蛇身方块图片的y坐标
    Snake.append(snakebody)   # 把蛇身加入到列表中

direction = 'up'  # 控制小蛇运动方向
isLoose = False # 游戏是否失败
score = 0 # 游戏得分

def draw():  # 绘制模块,每帧重复执行
    screen.clear()  # 每帧清除屏幕,便于重新绘制
    for snkaebody in Snake:  # 绘制蛇
        snkaebody.draw()
    cookie.draw() # 食物的绘制
    screen.draw.text("得分:"+str(score), (360, 20), fontsize=25,
                     fontname='s', color='white')
    if isLoose:  # 显示游戏失败信息
        screen.draw.text("游戏失败!", (180, HEIGHT/2-100),
                         fontsize=100, fontname='s', color='blue')

def update():  # 更新模块,每帧重复操作
    global direction
    if keyboard.left:  # 如果按下键盘左键
        direction = 'left'  # 小蛇要向左移
    if keyboard.right:  # 如果按下键盘右键
        direction = 'right'  # 小蛇要向右移
    if keyboard.up:  # 如果按下键盘上键
        direction = 'up'  # 小蛇要向上移
    if keyboard.down:  # 如果按下键盘下键
        direction = 'down'  # 小蛇要向下移

def moveSnake(): # 和蛇相关的一些操作
    global direction, isLoose, score
    if isLoose:
        return
    newSnakeHead = Actor('snake1')  # 创建新蛇头的图片
    # 根据direction变量设定新蛇头的坐标,比如小蛇向下移动,就在旧蛇头的下边
    newSnakeHead = Actor('snake1')
    if direction == 'right':  # 小蛇向右移动
        newSnakeHead.x = Snake[0].x + TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'left':  # 小蛇向左移动
        newSnakeHead.x = Snake[0].x - TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'up':  # 小蛇向上移动
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y - TILE_SIZE
    if direction == 'down':  # 小蛇向下移动
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y + TILE_SIZE

    # 当小蛇(新蛇头)超出边框时游戏失败
    if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT \
        or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH:
        isLoose = True
    # 当小蛇蛇头碰到自身时,游戏失败
    for snakebody in Snake: # 对所有蛇身循环,判断是否和蛇头坐标一致
        if newSnakeHead.x == snakebody.x and newSnakeHead.y == snakebody.y:
            isLoose = True
            break
    # 当小蛇头碰到食物时,不处理,也就是长度+1;饼干重新随机位置出现;
    if newSnakeHead.x == cookie.x and newSnakeHead.y == cookie.y:
        cookie.x = random.randint(5, 35)*TILE_SIZE
        cookie.y = random.randint(5, 25)*TILE_SIZE
        score = score + 1  # 得分加1
    else:  # 否则,删除掉旧蛇尾,也就是蛇的长度保持不变
        del Snake[len(Snake)-1]
    Snake.insert(0, newSnakeHead)  # 把新蛇头加到列表的最前面
    # time.sleep(0.2)  # 暂停0.2秒
    clock.schedule_unique(moveSnake, 0.2)  # 下一次隔0.2秒调用
moveSnake()  # 调用移动蛇的函数
pgzrun.go()  # 开始执行游戏

5、游戏效果

QQ录屏20221002232005

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱发呆的光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值