项目53:简易贪吃蛇【源代码】 — 《跟着小王学Python·新手》

《跟着小王学Python》 是一套精心设计的Python学习教程,适合各个层次的学习者。本教程从基础语法入手,逐步深入到高级应用,以实例驱动的方式,帮助学习者逐步掌握Python的核心概念。通过开发游戏、构建Web应用、编写网络爬虫、制作桌面软件等多样化项目,学习者可以深入理解并实践Python知识。每周更新1至2篇内容,旨在助力学习者成长为全栈工程师。

作为课程作业或者毕设参考也是不错的选择


文章目录

  • 项目53:简易贪吃蛇【源代码】 --- 《跟着小王学Python·新手》
  • 目标
  • 功能
  • 设计
  • 游戏界面
  • 蛇的控制
  • 食物的生成
  • 游戏逻辑
  • 实现步骤
  • 代码实现
  • 测试
  • 注意事项
  • 小结


项目53:简易贪吃蛇【源代码】 --- 《跟着小王学Python·新手》_Python

目标

通过实现一个简易的贪吃蛇游戏,帮助Python新手熟悉基本的编程概念,如循环、条件判断、列表操作等,并掌握使用Pygame库进行图形界面编程的方法。

项目53:简易贪吃蛇【源代码】 --- 《跟着小王学Python·新手》_服务器_02

功能

  • 贪吃蛇能够自由移动,吃到食物后长度增加
  • 碰到墙壁或自身时游戏结束
  • 游戏过程中可以实时显示当前得分
  • 提供重新开始游戏的功能

设计

游戏界面

  • 使用Pygame库创建一个矩形窗口作为游戏界面
  • 界面背景色设置为黑色,蛇和食物的颜色分别为绿色和红色
  • 在窗口顶部显示得分信息,字体颜色为白色

蛇的控制

  • 蛇由一系列坐标点组成,初始时为一个长度为3的蛇
  • 使用方向键控制蛇的移动方向,每次移动时蛇头移动到新的位置,蛇尾的最后一个点被移除
  • 当蛇吃到食物时,蛇尾增加一个点,长度增加

食物的生成

  • 食物的初始位置随机生成在游戏界面内
  • 当蛇吃到食物后,重新随机生成一个新的食物位置

游戏逻辑

  • 判断蛇是否碰到墙壁或自身,若是则游戏结束
  • 计算蛇的长度作为得分,并实时更新显示
  • 提供重新开始游戏的功能,重置蛇的初始状态和得分

实现步骤

  1. 安装Pygame库
  2. 创建游戏窗口和设置背景
  3. 定义蛇和食物的类,并初始化
  4. 实现蛇的移动控制和碰撞检测
  5. 实现食物的生成和蛇吃食物的逻辑
  6. 显示得分信息
  7. 添加重新开始游戏的功能
  8. 运行游戏并进行测试

代码实现

import pygame
import random

# 初始化Pygame
pygame.init()

# 设置窗口大小
window_width = 400
window_height = 400
window = pygame.display.set_mode((window_width, window_height))

# 设置颜色
black = (0, 0, 0)
green = (0, 255, 0)
red = (255, 0, 0)
white = (255, 255, 255)

# 设置字体
font = pygame.font.SysFont(None, 36)

# 蛇类
class Snake:
    def __init__(self):
        self.body = [(100, 100), (80, 100), (60, 100)]
        self.direction = 'RIGHT'
    
    def move(self):
        head_x, head_y = self.body[0]
        if self.direction == 'RIGHT':
            head_x += 20
        elif self.direction == 'LEFT':
            head_x -= 20
        elif self.direction == 'UP':
            head_y -= 20
        elif self.direction == 'DOWN':
            head_y += 20
        self.body.insert(0, (head_x, head_y))
        self.body.pop()
    
    def grow(self):
        tail_x, tail_y = self.body[-1]
        if self.direction == 'RIGHT':
            tail_x -= 20
        elif self.direction == 'LEFT':
            tail_x += 20
        elif self.direction == 'UP':
            tail_y += 20
        elif self.direction == 'DOWN':
            tail_y -= 20
        self.body.append((tail_x, tail_y))
    
    def change_direction(self, new_direction):
        if (self.direction == 'RIGHT' and new_direction != 'LEFT') or \
           (self.direction == 'LEFT' and new_direction != 'RIGHT') or \
           (self.direction == 'UP' and new_direction != 'DOWN') or \
           (self.direction == 'DOWN' and new_direction != 'UP'):
            self.direction = new_direction
    
    def check_collision(self):
        head_x, head_y = self.body[0]
        if head_x < 0 or head_x >= window_width or head_y < 0 or head_y >= window_height:
            return True
        for segment in self.body[1:]:
            if segment == self.body[0]:
                return True
        return False

# 食物类
class Food:
    def __init__(self):
        self.position = (random.randint(0, window_width // 20 - 1) * 20, random.randint(0, window_height // 20 - 1) * 20)
    
    def generate(self):
        self.position = (random.randint(0, window_width // 20 - 1) * 20, random.randint(0, window_height // 20 - 1) * 20)

# 初始化蛇和食物
snake = Snake()
food = Food()

# 游戏主循环
running = True
score = 0
clock = pygame.time.Clock()

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                snake.change_direction('UP')
            elif event.key == pygame.K_DOWN:
                snake.change_direction('DOWN')
            elif event.key == pygame.K_LEFT:
                snake.change_direction('LEFT')
            elif event.key == pygame.K_RIGHT:
                snake.change_direction('RIGHT')
            elif event.key == pygame.K_r:
                snake = Snake()
                food = Food()
                score = 0
    
    snake.move()
    
    if snake.body[0] == food.position:
        snake.grow()
        food.generate()
        score += 1
    
    if snake.check_collision():
        running = False
    
    window.fill(black)
    
    for segment in snake.body:
        pygame.draw.rect(window, green, pygame.Rect(segment[0], segment[1], 20, 20))
    
    pygame.draw.rect(window, red, pygame.Rect(food.position[0], food.position[1], 20, 20))
    
    score_text = font.render('Score: ' + str(score), True, white)
    window.blit(score_text, (10, 10))
    
    pygame.display.update()
    clock.tick(10)

pygame.quit()

测试

  • 运行代码,检查游戏窗口是否正常显示
  • 使用方向键控制蛇移动,观察蛇的移动是否流畅
  • 当蛇吃到食物时,检查蛇的长度是否增加,得分是否更新
  • 当蛇碰到墙壁或自身时,检查游戏是否结束
  • 按下“R”键,检查游戏是否能够重新开始

注意事项

  • 确保安装了Pygame库,否则代码无法正常运行
  • 在游戏主循环中,合理设置时钟的tick值,以控制蛇的移动速度
  • 在蛇的移动控制中,注意防止蛇反向移动到自身上
  • 在重新开始游戏时,确保重置蛇的初始状态和得分

小结

通过实现这个简易的贪吃蛇游戏,我们学习了如何使用Pygame库进行图形界面编程,掌握了蛇的移动控制、食物的生成以及碰撞检测等基本逻辑。希望这篇文章能帮助Python新手更好地理解和掌握编程知识,为后续的学习打下坚实的基础。