基于pygame的贪吃蛇游戏

本文使用Python的pygame库实现基本贪吃蛇游戏,涵盖蛇移动、食物生成、分数计算等功能。介绍了设计思路,涉及Timer、Snake等类,还提及开发工具及相关知识点,如Time模块、random库等,最后展示运行界面和源代码。

基于pygame的贪吃蛇游戏

概述

Pygame是一种流行的Python游戏开发库,它提供了许多功能,使开发人员可以轻松创建2D游戏。本文使用pygame库实现了一个基本的贪吃蛇游戏,包括蛇的移动、食物的生成、分数的计算和显示、背景音乐、游戏音效、游戏结束的判断等功能。

设计思路

本文的实现包括以下几个类:

  1. Timer时间类:通过time库实现计时功能。
  2. Snake蛇类:存储蛇的信息,例如:蛇的移动速度、蛇的身体坐标、蛇的移动方向、蛇的得分等。实现蛇移动的功能。
  3. GameSet游戏设置类:游戏界面大小等设置。
  4. GameColor游戏颜色类:游戏所需颜色的设置。
  5. Game类:游戏运行主体,包括游戏开始、游戏结束、食物位置随机生成等功能。

涉及知识点

  1. 开发工具:Python3.8 , PyCharm2022

  2. Pygame库是专门为了帮助用户做出的游戏和其他多媒体应用Python编程语言的一个开放源代码模块。Pygame游戏开发框架图如下所示:

  3. Time模块主要用于处理时间戳和一些基本的时间操作。

  4. Python内置的random库主要用于产生各种分布的伪随机数序列。

  5. pygame.Surface对象是pygame的绘图层,或绘图平面,或图层,用于展示图形、文字或图像的绘制效果。

  6. pygame.draw中相关方法绘制矩形、直线、多边形、圆形等各种常见图形。

  7. pygame.font.Font()可以创建字体对象,调用一个字体对象的render()方法可以生成文本Surface对象,通过Surface对象的blit()方法,可将相应文本绘制到指定屏幕上。

  8. pygame.mixer.Sound(music_path)方法可以用于加载音乐,生成一个Sound对象。

核心代码

运行入口

def main():
    pygame.init()  # 模块初始化
    snake_speed_clock = pygame.time.Clock()  # 创建Pygame时钟对象
    screen = pygame.display.set_mode((GameSet.windows_width, GameSet.windows_height))
    screen.fill(GameColor.white)
    pygame.display.set_caption("贪吃蛇")  # 设置标题
    game = Game(snake_speed_clock, screen)
    game.game_start()
    while True:
        game.game_running()
        game.game_over()

Timer类

class Timer:
    def __init__(self):
        self.start_time = time.time()

    def now_time(self):
        return round(time.time() - self.start_time, 1)

Snake类

class Snake:
    def __init__(self):
        self.snake_speed = 8  # 贪吃蛇的速度
        start_y = GameSet.map_height / 2  # 贪吃蛇从页面左边的中间出生
        self.snake_body = [{
   
   'x': 4, 'y': start_y},
                           {
   
   'x': 3, 'y': start_y},
                           {
   
   'x': 2, 'y': start_y}]
        self.direction = GameSet.RIGHT  # 开始时向右移动
        self.alive = True  # 贪吃蛇是否存活
        self.score = 0  # 贪吃蛇分数

    def move(self):
        if self.direction == GameSet.UP:
            new_head = {
   
   'x': self.snake_body[0]['x'], 'y': self.snake_body[0]['y'] - 1}
        elif self.direction == GameSet.DOWN:
            new_head = {
   
   'x': self.snake_body[0]['x'], 'y': self.snake_body[0]['y'] + 1}
        elif self.direction == GameSet.LEFT:
            new_head = {
   
   'x': self.snake_body[0]['x'] - 1, 'y': self.snake_body[0]['y']}
        else:
            new_head = {
   
   'x': self.snake_body[0]['x'] + 1, 'y': self.snake_body[0]['y']}
        self.snake_body.insert(0, new_head)

        # 蛇碰到墙壁 蛇死亡
        if self.snake_body[0]['x'] == -1 or self.snake_body[0]['x'] == GameSet.map_width or self.snake_body[0][
            'y'] == -1 or \
                self.snake_body[0]['y'] == GameSet.map_height:
            self.alive = False
        # 蛇碰到自己身体 蛇死亡
        for snake_body in self.snake_body[1:]:
            if snake_body['x'] == self.snake_body[0]['x'] and snake_body['y'] == self.snake_body[0]['y']:
                self.alive = False

    def is_eat_food(self, food):
        if self.snake_body[0]['x'] == food['x'] and self.snake_body[0]['y'] == food['y']:
            # 蛇吃到食物, 获得分数
            self.score += 1
            return True
        else:
            del self.snake_body[-1]  # 如果没有吃到实物, 就向前移动, 尾部一格删掉
            return False

GameSet类

class GameSet:
    windows_width = 1200
    windows_height = 800
    cell_size = 50
    map_width = int(windows_width / cell_size)
    map_height = int(windows_height / cell_size)
    UP = 1
    DOWN = 2
    LEFT = 3
    RIGHT = 4

GameColor类

class GameColor:
    white = (255, 255, 255)
    black = (0, 0, 0)
    # 背景颜色
    gray = (241, 242, 242)
    dark_gray = (40, 40, 40)
    # 食物颜色
    Red = (246, 99, 143)
    # 蛇的身体的颜色
    blue = (106, 205, 253)
    dark_blue = (87, 172, 212)

播放背景音乐方法

def play_music():
    pygame.mixer.music.load('music.mp3')
    pygame.mixer.music.set_volume(0.3)
    pygame.mixer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值