用pygame来编写简单的贪吃蛇项目

用pygame来编写简单的贪吃蛇项目

pygame库是python中非常强大的库,依靠pygame库就可以自己制作很多的游戏包括小型和大型的游戏,比如;坦克大战、超级玛丽、俄罗斯方块等等

pygame库中包含了很多内容,想要深入研究pygame库可以上pygame官网中查询pygame中的方法
https://www.pygame.org/docs/

1、导入模块

在这里插入图片描述
这次贪吃蛇的设计主要涉及了三个模块,pygame、sys、random。
其中sys和random模块是python内部自带的,直接导入就可以了,不用下载,而pygame是需要下载的。pygame模块如果用pip install的方式下载是不行的,需要下载一个pygame-1.9.3-cp36-cp36m-win_amd64.whl文件,然后将文件放入python安装目录下的Lib文件中,然后在这个文件夹打开cmd,然后用pip install pygame安装就可以了

文件分享链接如下:
链接:https://pan.baidu.com/s/11SEw1bltYUVfLYPOQ7GWIw
提取码:ol8o

2、定义游戏背景颜色和蛇、果实的颜色

class Snake(object):
    def __init__(self):
        self.black = pygame.Color(0, 0, 0)
        self.red = pygame.Color(255, 0, 0)
        self.white = pygame.Color(255, 255, 255)

用面向对象的方式编写,更有利于维护和调整
0~255代表颜色,0,0,0代表黑色,255,0,0是代表红色,255,255,255是代表白色,如果想要设置其他颜色只需要调整数值就可以了

3、定义一个游戏结束的方法

def gameover(self):
    pygame.quit()
    sys.exit()

这里要引用到sys的库,如果不了解sys库的作用,也可以上python的官网查询

4、初始化pygame里面的元素

    def initialize(self):
        pygame.init()
        # 定义蛇运动的速度
        clock = pygame.time.Clock()
        # 定义一个游戏界面
        playSurface = pygame.display.set_mode((900, 800))
        # 设置界面名字
        pygame.display.set_caption('贪吃蛇')
        # 初始化变量
        snakePosition = [80, 80]  # 贪吃蛇起始位置,前面的参数数水平方向的距离,后面的参数是垂直方向的距离
        # 贪吃蛇的长度,设定为方块的三倍,每个方块的长度为20
        snakebody = [[80, 80], [60, 80], [40, 80]]
        targetPosition = [200, 400]  # 方块的初始位置
        targetflag = 1  # 定义一个标记,目的用来判断果实是否被吃掉
        direction = 'right'  # 初始化运动方向
        changeDirection = direction  # 改变方向变量
        self.main(snakebody,targetPosition,targetflag,direction,changeDirection,snakePosition,playSurface,clock)

设定蛇原始运动方向为向右,果实没被吃就targetflag = 1,果实被吃后targetflag = 0

5、用循环获得pygame的全部事件

        while True:
            # 用循环来获得pygame中的所有事件
            for event in pygame.event.get():
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()

6、创建一个键盘的事件

                elif event.type == KEYDOWN:
                    # 判断键盘的方向
                    if event.key == K_RIGHT:
                        changeDirection = 'right'
                        print('向右')
                    if event.key == K_LEFT:
                        changeDirection = 'left'
                        print("向左")
                    if event.key == K_DOWN:
                        print('向下')
                        changeDirection = 'down'
                    if event.key == K_UP:
                        print('向上')
                        changeDirection = 'up'
                        # 判断是否按下了esc键
                    if event.key == K_ESCAPE:
                        pygame.event.post(pygame.event.Event(QUIT))

7、根据按键的事件来修改蛇头的方向和运动方向

            if (changeDirection == 'left' and not direction == 'right'):
                direction = changeDirection
            if (changeDirection == 'right' and not direction == 'left'):
                direction = changeDirection
            if (changeDirection == 'down' and not direction == 'up'):
                direction = changeDirection
            if (changeDirection == 'up' and not direction == 'down'):
                direction = changeDirection

因为如果我们原本蛇头向右,如果还按下向左的键盘,蛇头是不变化的,这才符合贪吃蛇的原理,这里的 if (changeDirection == ‘left’ and not direction == ‘right’):就是用来避免这种情况的。

8、设定蛇移动的方向

            if direction == 'right':
                snakePosition[0] += 20
            if direction == 'left':
                snakePosition[0] -= 20
            if direction == 'up':
                snakePosition[1] -= 20
            if direction == 'down':
                snakePosition[1] += 20

9、判断蛇是否吃掉果实

snakebody.insert(0, list(snakePosition))
            if (snakePosition[0] == targetPosition[0] and snakePosition[1] == targetPosition[1]):
                targetflag = 0
            else:
                snakebody.pop()

判断果实是否被吃掉,如果吃掉了蛇的身体就变长,然后赋值targetflag = 0,这里的逻辑是:先增加蛇的身体,然后判断,如果果实被吃掉了就赋值targetflag = 0,如果果实没被吃掉就减短蛇的长度。一增一减就没变化

10、随机生成果实位置

            if targetflag == 0:
                x = random.randrange(1, 45)  # 水平方向
                y = random.randrange(1, 40)  # 垂直方向
                targetPosition = [int(x * 20), int(y * 20)]
                targetflag = 1

这里引用到random模块,如果不了解random模块可以上python官网学习

11、绘制显示图

 playSurface.fill(self.black)  # 背景
            for position in snakebody:
                pygame.draw.rect(playSurface, self.white, Rect(position[0], position[1], 20, 20))  # 蛇的身体
                pygame.draw.rect(playSurface, self.red, Rect(targetPosition[0], targetPosition[1], 20, 20))  # 果实
            # 游戏结束
            pygame.display.flip()

如果游戏结束就退出画面

12、设定游戏结束

            if (snakePosition[0] > 900 or snakePosition[0] < 0):
                gameover()
            elif (snakePosition[1] > 800 or snakePosition[1] < 0):
                gameover()
            for i in snakebody[1:]:
                if(snakePosition[0] == i[0] and snakePosition[1] == i[1]):
                    gameover()

这里游戏结束有两种可能,撞墙和吃到自己的尾巴

13、设置游戏运行的速度,也就是蛇运动的速度

clock.tick(5)

14、最后调用

snake = Snake()
snake.initialize()

源代码

import pygame
import sys
import random
from pygame.locals import *
class Snake(object):
    #定义一个颜色的类
    #制作背景和蛇、果实的的颜色,o~255,0,0,0,是代表黑色,255,255,255代表白色
    def __init__(self):
        self.black = pygame.Color(0, 0, 0)
        self.red = pygame.Color(255, 0, 0)
        self.white = pygame.Color(255, 255, 255)
    #定义一个游戏结束的类
    def gameover(self):
        pygame.quit()
        sys.exit()
    #定义一个初始化的类
    def initialize(self):
        pygame.init()
        # 定义蛇运动的速度
        clock = pygame.time.Clock()
        # 定义一个游戏界面
        playSurface = pygame.display.set_mode((800, 600))
        # 设置界面名字
        pygame.display.set_caption('贪吃蛇')
        # 初始化变量
        snakePosition = [80, 80]  # 贪吃蛇起始位置,前面的参数数水平方向的距离,后面的参数是垂直方向的距离
        # 贪吃蛇的长度,设定为方块的三百,每个方块的长度为25
        snakebody = [[80, 80], [60, 80], [40, 80]]
        targetPosition = [200, 400]  # 方块的初始位置
        targetflag = 1  # 定义一个标记,目的用来判断果实是否被吃掉
        direction = 'right'  # 初始化运动方向
        changeDirection = direction  # 改变方向变量
        self.main(snakebody,targetPosition,targetflag,direction,changeDirection,snakePosition,playSurface,clock)
    #定义一个主要程序的类
    def main(self,snakebody,targetPosition,targetflag,direction,changeDirection,snakePosition,playSurface,clock):
        while True:
            # 用循环来获得pygame中的所有事件
            for event in pygame.event.get():
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()

                # 创建一个键盘的事件
                elif event.type == KEYDOWN:
                    # 判断键盘的方向
                    if event.key == K_RIGHT:
                        changeDirection = 'right'
                        print('向右')
                    if event.key == K_LEFT:
                        changeDirection = 'left'
                        print("向左")
                    if event.key == K_DOWN:
                        print('向下')
                        changeDirection = 'down'
                    if event.key == K_UP:
                        print('向上')
                        changeDirection = 'up'
                        # 判断是否按下了esc键
                    if event.key == K_ESCAPE:
                        pygame.event.post(pygame.event.Event(QUIT))

                # 判断蛇的方向
            if (changeDirection == 'left' and not direction == 'right'):
                direction = changeDirection
            if (changeDirection == 'right' and not direction == 'left'):
                direction = changeDirection
            if (changeDirection == 'down' and not direction == 'up'):
                direction = changeDirection
            if (changeDirection == 'up' and not direction == 'down'):
                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, 40)  # 水平方向
                y = random.randrange(1, 30)  # 垂直方向
                targetPosition = [int(x * 20), int(y * 20)]
                targetflag = 1
            # 绘制显示图
            playSurface.fill(self.black)  # 背景
            for position in snakebody:
                pygame.draw.rect(playSurface, self.white, Rect(position[0], position[1], 20, 20))  # 蛇的身体
                pygame.draw.rect(playSurface, self.red, Rect(targetPosition[0], targetPosition[1], 20, 20))  # 果实
            # 游戏结束
            pygame.display.flip()
            if (snakePosition[0] > 900 or snakePosition[0] < 0):
                gameover()
            elif (snakePosition[1] > 800 or snakePosition[1] < 0):
                gameover()
            for i in snakebody[1:]:
                if(snakePosition[0] == i[0] and snakePosition[1] == i[1]):
                    gameover()

            # 控制游戏速度,值越大速度越快
            clock.tick(5)

snake = Snake()
snake.initialize()
发布了28 篇原创文章 · 获赞 14 · 访问量 6786

猜你喜欢

转载自blog.csdn.net/weixin_42304193/article/details/88559274