在老师的要求下,我们用的是分块的编辑,主函数等作为一个.py文件,变量作为一个.py文件,定义的类作为一个.py文件,根据需求来导入,这样的可扩展性强,在复杂的开发里面容易修改,但主要目的还是为我们下学期学习Java,对面向对象这个概念有个大概的了解,下面放上源代码。

参数文件

# 方向键变量
UP = 1
DOWN = 2
LEFT = 3
RIGHT = 4
# 窗口大小变量
Size = SCREEN_WIDTH, SCREEN_HEIGHT = 500, 500
# 帧频变量
FPS = 10
# 屏幕颜色变量
Screen_Color = (255, 255, 255)
# 蛇身颜色变量
Snake_Body_Color = (160, 160, 160)
# 蛇头颜色变量
Snake_Head_Color = (0, 0, 0)
# 食物颜色变量
Food_Color = (255, 120, 120)
# 红色变量
Red = (255, 0, 0)

类文件

import pygame
import random
from contants import *

class SnakePart:  # 定义名为SnakePart的类,用来初始化蛇每一部分的共同属性
    def __init__(self, x, y, color=Snake_Body_Color):  # 调用时进行初始化
        # x坐标
        self.x = x
        # y坐标
        self.y = y
        # 颜色
        self.color = color

    def blit(self, screen):  # 创建蛇每一块的surface并打印
        pygame.draw.rect(screen, self.color, pygame.Rect(self.x, self.y, 10, 10))

class Snake:  # 定义名为Snake的类,用来初始化相关属性及Snake的所有行为
    def __init__(self, initX=250, initY=250, head_color=Snake_Head_Color,body_color=Snake_Body_Color, initDirection=RIGHT):  # 调用时进行初始化
        # 蛇头
        self.head = SnakePart(initX, initY, head_color)
        # 蛇身,用列表储存
        self.body = []
        # 蛇长
        self.body_len = 0
        # 蛇刚开始的方向
        self.direction = initDirection
        # 蛇刚开始的状态
        self.live = True
        # 蛇身的颜色
        self.body_color = body_color
        # 分数
        self.score = 0

    def change(self):  # 定义蛇的转向、增加长度的行为
        # 当吃到食物时,将蛇头变成蛇身
        self.body.insert(0, SnakePart(self.head.x, self.head.y, self.body_color))
        if len(self.body) != self.body_len:
                self.body.pop()
        # 根据键盘事件不同执行不同方向
        # 向上
        if self.direction == UP:
                self.head.y -= 10
        # 向下
        elif self.direction == DOWN:
                self.head.y += 10
        # 向右
        elif self.direction == RIGHT:
                self.head.x += 10
        # 向左
        elif self.direction == LEFT:
            self.head.x -= 10

    def eat_food(self, foods):  # 定义蛇吃食物的行为
        # 吃到食物则执行身子变长一节,分数加一分,同时创建新的食物Surface
        for food in foods:
            if self.head.x == food.x and self.head.y == food.y:
                # 身子变长一节
                self.body_len += 1
                # 分数
                self.score += food.score
                # 生成新食物坐标
                food.new_food(self)

    def check_dead(self):  # 检查蛇是否死亡的行为
        # 撞墙
        if self.head.x < 0 or self.head.x > SCREEN_WIDTH - 10 or self.head.y < 0 or self.head.y > SCREEN_HEIGHT - 10:
            self.live = False
        # # 吃到毒药
        # if self.head.x == poison:
        #     self.live = False
        # 吃到自己
        for jie in self.body:
            # 遍历每一节,检查是否吃到自身
            if jie.x == self.head.x and jie.y == self.head.y:
                self.live = False
                break

    def blit(self, screen, food):  #打印蛇的所有行为做出改变后的Surface
        # 蛇身、方向改变
        self.change()
        # 蛇吃食物
        self.eat_food(food)
        # 蛇是否死亡
        self.check_dead()
        # 蛇头
        self.head.blit(screen)
        # 迭代蛇身的列表,将蛇身的Surface进行打印
        for jie in self.body:
            jie.blit(screen)

class Food:  # 定义名为Food的类,用来初始化有关食物的属性及Food的所有行为
    def __init__(self, snake, score, color=Food_Color):  # 调用时进行初始化
        # 食物
        self.new_food(snake)
        # 食物颜色
        self.color = color
        # 食物分数
        self.score = score

    def new_food(self, snake):  # 防止新产生的食物与蛇的某部分重叠,进行判断并根据判断结果来决定产生新的食物
        while True:
            # 创建随机坐标x.y,进行真除法是防止随机数为奇数
            self.x = random.randint(0, SCREEN_WIDTH - 10) // 10 * 10
            self.y = random.randint(0, SCREEN_HEIGHT - 10) // 10 * 10
            # 定义变量on,以便下面进行判断是否需要产生食物
            on = False
            # 判断食物的坐标是否和蛇头的坐标相等
            if self.x == snake.head.x and self.y == snake.head.y:
        on = True
            # 判断食物的坐标是否和蛇身的坐标相等
            for jie in snake.body:
                if jie.x == self.x and jie.y == self.y:
                    on = True
            # 以上判断都不相等,则退出循环
            else:
        break

    def blit(self, screen):
        pygame.draw.rect(screen, self.color, pygame.Rect(self.x, self.y, 10, 10))

主文件

import pygame
import player
from contants import *

# 定义打印出文本图像的函数
def out_content(screen, content, size, color, location, font_name=None):
    # 说明文本字体,大小
    text = pygame.font.SysFont(font_name, size)
    # 创建一个文本Surface
    text_fmt = text.render(content, True, color)
    # 将文本Surface打印在其他Surface上
    screen.blit(text_fmt, location)
# 定义主函数
def main():
    # 初始化py game的功能模块及变量
    pygame.init()
    # 创建一个Surface对象
    game_screen = pygame.display.set_mode(Size)
    # 对game_screen进行命名
    pygame.display.set_caption("贪吃蛇")
    # 对Surface对象进行颜色填充
    game_screen.fill(Screen_Color)
    # 创建一个名为snake1的列表对象
    snake1 = player.Snake()
    # 创建一个名为food的列表对象,包含3个食物,每个食物分数不同
    foods = [player.Food(snake1, 1), player.Food(snake1, 2, (0, 255, 0)), player.Food    (snake1, 3, (0, 0, 255))]
    # 定义"循环"的变量
    Quit = True
    while Quit:
        # 获取所有事件
        for event in pygame.event.get():
            # 判断事件类型为QUIT,退出循环
            if event.type == pygame.QUIT:
                Quit = False
            # 判断事件类型为键盘按下的键
            if event.type == pygame.KEYDOWN:
                # ESC键
                if event.key == pygame.K_ESCAPE:
                    Quit = False
                # 向上
                if event.key == pygame.K_UP and snake1.direction != DOWN:
                    snake1.direction = UP
                # 向下
                elif event.key == pygame.K_DOWN and snake1.direction != UP:
                    snake1.direction = DOWN
                # 向左
                elif event.key == pygame.K_LEFT and snake1.direction != RIGHT:
                    snake1.direction = LEFT
                # 向右
                elif event.key == pygame.K_RIGHT and snake1.direction != LEFT:
                    snake1.direction = RIGHT
        # 打印蛇的分数
        out_content(game_screen, str(snake1.score), 20, Red, (5,5))
        # 迭代Food列表并打印食物的Surface
        for food in foods:
            food.blit(game_screen)
        # 迭代并打印蛇和food的Surface
        snake1.blit(game_screen, foods)
        # 判断蛇是否死亡
        if snake1.live == False:
            # 除了文本图像以外的screen填充白色
            game_screen.fill(Screen_Color)
            # 打印死亡时的Surface
            out_content(game_screen, "Game Over !", 50, Red, (150, 200))
        # 更新游戏中有改动Surface
        pygame.display.update()
        # 设置游戏帧频
        clock = pygame.time.Clock()
        clock.tick(FPS)
        # 重新填充颜色
        game_screen.fill(Screen_Color)

if __name__ == '__main__':
    main()