python-简单版贪吃蛇游戏

在开始讲解之前先来感受下游戏
在这里插入图片描述
好了废话不多说上代码

1.初始化游戏界面和一些必要的全局变量

 # 游戏窗口的长和宽
    X = 640
    Y = 480
    def __init__(self):
        # 初始化Pygame库
        pygame.init()
        # 初始化一个游戏界面窗口
        self.DISPLAY = pygame.display.set_mode((self.X,self.Y))
        # 设置游戏窗口的标题
        pygame.display.set_caption('Snake Game')
        # 定义一个变量来控制游戏速度
        self.FPSCLOCK = pygame.time.Clock()
        # 初始化游戏界面内使用的字体
        self.BASICFONT = pygame.font.SysFont("SIMYOU.TTF", 80)
        # 定义颜色变量
        self.BLACK = pygame.Color(0, 0, 0)
        self.WHITE = pygame.Color(255, 255, 255)
        self.RED = pygame.Color(255, 0, 0)
        self.GREY = pygame.Color(150, 150, 150)
        # 蛇的初始方向
        self.direction = "right"
        # 食物标记:0代表食物已被吃掉;1代表未被吃掉。
        self.food_flag = 1
        self.UP = 'up'
        self.DOWN = 'down'
        self.LEFT = 'left'
        self.RIGHT = 'right'

2.定义随机产生位置的函数

    def random_position(self):
        """
        蛇或者食物产生随机的位置,但是不能超过窗口的大小
        :return:
        """
        x = random.randint(20,self.X-20)
        y = random.randint(20,self.Y-20)
        return [x,y]

3.画出蛇的函数

    def drawSnake(self,snake_Body):
        """
        画出蛇的位置 蛇的默认大小设为20,20
        :return:
        """
        # 画出贪吃蛇
        for i in snake_Body:
            pygame.draw.rect(self.DISPLAY, self.WHITE, Rect(i[0], i[1], 20, 20))

4.画出食物


    # 画出食物的位置
    def drawFood(self,food_Position):
        pygame.draw.rect(self.DISPLAY, self.RED, Rect(food_Position[0], food_Position[1], 20, 20))

5.定义键盘事件

    def press(self):
        # 检测按键等Pygame事件
        for event in pygame.event.get():
            if event.type == QUIT:
                # 接收到退出事件后,退出程序
                pygame.quit()
                sys.exit()
            # 判断键盘事件,用 方向键 或 wsad 来表示上下左右
            elif event.type == KEYDOWN:
                if (event.key == K_UP or event.key == K_w) and self.direction != self.DOWN:
                    self.direction = self.UP
                    print(1111111111111111111111111)
                if (event.key == K_DOWN or event.key == K_s) and self.direction != self.UP:
                    self.direction = self.DOWN
                if (event.key == K_LEFT or event.key == K_a) and self.direction != self.RIGHT:
                    self.direction = self.LEFT
                if (event.key == K_RIGHT or event.key == K_d) and self.direction != self.LEFT:
                    self.direction = self.RIGHT

5.改变方向

 def change_head(self,snake_Head):
        # 根据键盘的输入,改变蛇的头部,进行转弯操作
        if self.direction == self.LEFT:
            snake_Head[0] -= 20
        if self.direction == self.RIGHT:
            snake_Head[0] += 20
        if self.direction == self.UP:
            snake_Head[1] -= 20
        if self.direction == self.DOWN:
            snake_Head[1] += 20

6.判断是否被吃

    def is_eaten(self,snake_Head,food_Position,snake_Body):
        # 判断是否吃掉食物
        if snake_Head[0] == food_Position[0] and snake_Head[1] == food_Position[1]:
            self.food_flag = 0
        else:
            # 因为每一次循环会加入一个头部,所以需要删除一个
            snake_Body.pop()

7.定义打印当前得分

    def drawScore(self,score):
        # 设置分数的显示颜色
        score_Surf = self.BASICFONT.render('%s' % (score), True, self.GREY)
        # 设置分数的位置
        score_Rect = score_Surf.get_rect()
        score_Rect.midtop = (320, 240)
        # 绑定以上设置到句柄
        self.DISPLAY.blit(score_Surf, score_Rect)

8.游戏结束

    def GameOver(self):
        # 设置GameOver的显示颜色
        GameOver_Surf = self.BASICFONT.render('Game Over!', True, self.GREY)
        # 设置GameOver的位置
        GameOver_Rect = GameOver_Surf.get_rect()
        GameOver_Rect.midtop = (320, 10)
        # 绑定以上设置到句柄
        self.DISPLAY.blit(GameOver_Surf, GameOver_Rect)

        pygame.display.flip()
        # 等待3秒
        time.sleep(3)
        # 退出游戏
        pygame.quit()
        # 退出程序
        sys.exit()

所有代码如下:

import random
import sys
import time

import pygame
from pygame.locals import *

class TanGame(object):
    # 游戏窗口的长和宽
    X = 640
    Y = 480
    def __init__(self):
        # 初始化Pygame库
        pygame.init()
        # 初始化一个游戏界面窗口
        self.DISPLAY = pygame.display.set_mode((self.X,self.Y))
        # 设置游戏窗口的标题
        pygame.display.set_caption('Snake Game')
        # 定义一个变量来控制游戏速度
        self.FPSCLOCK = pygame.time.Clock()
        # 初始化游戏界面内使用的字体
        self.BASICFONT = pygame.font.SysFont("SIMYOU.TTF", 80)
        # 定义颜色变量
        self.BLACK = pygame.Color(0, 0, 0)
        self.WHITE = pygame.Color(255, 255, 255)
        self.RED = pygame.Color(255, 0, 0)
        self.GREY = pygame.Color(150, 150, 150)
        # 蛇的初始方向
        self.direction = "right"
        # 食物标记:0代表食物已被吃掉;1代表未被吃掉。
        self.food_flag = 1
        self.UP = 'up'
        self.DOWN = 'down'
        self.LEFT = 'left'
        self.RIGHT = 'right'

    def random_position(self):
        """
        蛇或者食物产生随机的位置,但是不能超过窗口的大小
        :return:
        """
        x = random.randint(20,self.X-20)
        y = random.randint(20,self.Y-20)
        return [x,y]



    def drawSnake(self,snake_Body):
        """
        画出蛇的位置 蛇的默认大小设为20,20
        :return:
        """
        # 画出贪吃蛇
        for i in snake_Body:
            pygame.draw.rect(self.DISPLAY, self.WHITE, Rect(i[0], i[1], 20, 20))

    # 画出食物的位置
    def drawFood(self,food_Position):
        pygame.draw.rect(self.DISPLAY, self.RED, Rect(food_Position[0], food_Position[1], 20, 20))

    # 打印出当前得分
    def drawScore(self,score):
        # 设置分数的显示颜色
        score_Surf = self.BASICFONT.render('%s' % (score), True, self.GREY)
        # 设置分数的位置
        score_Rect = score_Surf.get_rect()
        score_Rect.midtop = (320, 240)
        # 绑定以上设置到句柄
        self.DISPLAY.blit(score_Surf, score_Rect)


    def press(self):
        # 检测按键等Pygame事件
        for event in pygame.event.get():
            if event.type == QUIT:
                # 接收到退出事件后,退出程序
                pygame.quit()
                sys.exit()
            # 判断键盘事件,用 方向键 或 wsad 来表示上下左右
            elif event.type == KEYDOWN:
                if (event.key == K_UP or event.key == K_w) and self.direction != self.DOWN:
                    self.direction = self.UP
                    print(1111111111111111111111111)
                if (event.key == K_DOWN or event.key == K_s) and self.direction != self.UP:
                    self.direction = self.DOWN
                if (event.key == K_LEFT or event.key == K_a) and self.direction != self.RIGHT:
                    self.direction = self.LEFT
                if (event.key == K_RIGHT or event.key == K_d) and self.direction != self.LEFT:
                    self.direction = self.RIGHT


    def change_head(self,snake_Head):
        # 根据键盘的输入,改变蛇的头部,进行转弯操作
        if self.direction == self.LEFT:
            snake_Head[0] -= 20
        if self.direction == self.RIGHT:
            snake_Head[0] += 20
        if self.direction == self.UP:
            snake_Head[1] -= 20
        if self.direction == self.DOWN:
            snake_Head[1] += 20

    def is_eaten(self,snake_Head,food_Position,snake_Body):
        # 判断是否吃掉食物
        if snake_Head[0] == food_Position[0] and snake_Head[1] == food_Position[1]:
            self.food_flag = 0
        else:
            # 因为每一次循环会加入一个头部,所以需要删除一个
            snake_Body.pop()

    def GameOver(self):
        # 设置GameOver的显示颜色
        GameOver_Surf = self.BASICFONT.render('Game Over!', True, self.GREY)
        # 设置GameOver的位置
        GameOver_Rect = GameOver_Surf.get_rect()
        GameOver_Rect.midtop = (320, 10)
        # 绑定以上设置到句柄
        self.DISPLAY.blit(GameOver_Surf, GameOver_Rect)

        pygame.display.flip()
        # 等待3秒
        time.sleep(3)
        # 退出游戏
        pygame.quit()
        # 退出程序
        sys.exit()


    def run(self):
        # 贪吃蛇的初始位置
        snake_Head = self.random_position()
        # 贪吃蛇的身体
        snake_Body = [[snake_Head[0],snake_Head[1]],[snake_Head[0]-20,snake_Head[1]]]
        # 食物的位置
        food_Position = self.random_position()
        while True:
            # 定义按键
            self.press()
            self.change_head(snake_Head)
            # 将蛇的头部当前的位置加入到蛇身的列表中
            snake_Body.insert(0, list(snake_Head))

            # 判断蛇是否被吃掉
            self.is_eaten(snake_Head, food_Position, snake_Body)
            # 生成新的食物
            if self.food_flag == 0:
                food_Position = self.random_position()
                self.food_flag = 1
            self.DISPLAY.fill(self.BLACK)
            # 画出贪吃蛇
            self.drawSnake(snake_Body)
            # 画出食物的位置
            self.drawFood(food_Position)
            # 打印出玩家的分数
            self.drawScore(len(snake_Body) - 1)
            # 刷新Pygame的显示层
            pygame.display.flip()
            # 控制游戏速度
            self.FPSCLOCK.tick(7)
            '''游戏结束的判断'''
            # 贪吃蛇触碰到边界
            if snake_Head[0] < 0 or snake_Head[0] > 620:
                self.GameOver()
            if snake_Head[1] < 0 or snake_Head[1] > 460:
                self.GameOver()
            # 贪吃蛇触碰到自己
            for i in snake_Body[1:]:
                if snake_Head[0] == i[0] and snake_Head[1] == i[1]:
                    self.GameOver()


if __name__ == '__main__':
    # 创建游戏对象
    tangame = TanGame()
    tangame.run()

这也是我在建立在别人的代码中理解改进的东西,如果大家有什么疑惑欢迎评论下方留言,咱们共同交流!另外博主已经整理了很多python相关的资料,也欢迎关注本博主,博主后面会作为福利发送给大家!谢谢浏览!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值