在开始讲解之前先来感受下游戏

python贪吃蛇51cto_python贪吃蛇51cto


好了废话不多说上代码

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()