Python游戏开发:制作经典贪吃蛇游戏

包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取】

前言
贪吃蛇是一款经典的游戏,简单却充满乐趣。作为Python初学者,通过开发贪吃蛇游戏可以学习到许多编程基础知识,如循环、条件判断、函数使用以及简单的游戏逻辑实现。本文将带领大家一步步用Python和Pygame库实现一个完整的贪吃蛇游戏,并配有详细的图片解析。

一、开发环境准备
首先,我们需要安装必要的库:

pip install pygame

Pygame是一个专门用于游戏开发的Python库,它提供了图像、声音、事件处理等游戏开发所需的功能。

二、游戏基本框架搭建
我们先创建一个基本的游戏窗口:

import pygame
import random
import time

# 初始化pygame
pygame.init()

# 定义颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# 设置游戏窗口
width, height = 600, 400
game_display = pygame.display.set_mode((width, height))
pygame.display.set_caption('贪吃蛇游戏')

# 设置游戏时钟
clock = pygame.time.Clock()

三、贪吃蛇类实现
接下来我们创建贪吃蛇类:

class Snake:
    def __init__(self):
        self.size = 10
        self.length = 1
        self.positions = [(width//2, height//2)]  # 蛇头初始位置
        self.direction = random.choice(["UP", "DOWN", "LEFT", "RIGHT"])
        self.score = 0
        
    def get_head_position(self):
        return self.positions[0]
    
    def move(self):
        head_x, head_y = self.get_head_position()
        
        if self.direction == "UP":
            new_position = (head_x, head_y - self.size)
        elif self.direction == "DOWN":
            new_position = (head_x, head_y + self.size)
        elif self.direction == "LEFT":
            new_position = (head_x - self.size, head_y)
        elif self.direction == "RIGHT":
            new_position = (head_x + self.size, head_y)
            
        # 插入新的头部位置
        self.positions.insert(0, new_position)
        # 如果长度没有增加,则移除尾部
        if len(self.positions) > self.length:
            self.positions.pop()
    
    def draw(self, surface):
        for position in self.positions:
            rect = pygame.Rect(position[0], position[1], self.size, self.size)
            pygame.draw.rect(surface, GREEN, rect)
            pygame.draw.rect(surface, BLACK, rect, 1)
    
    def handle_keys(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP and self.direction != "DOWN":
                    self.direction = "UP"
                elif event.key == pygame.K_DOWN and self.direction != "UP":
                    self.direction = "DOWN"
                elif event.key == pygame.K_LEFT and self.direction != "RIGHT":
                    self.direction = "LEFT"
                elif event.key == pygame.K_RIGHT and self.direction != "LEFT":
                    self.direction = "RIGHT"

四、食物类实现
食物是贪吃蛇增长的关键元素:

class Food:
    def __init__(self):
        self.size = 10
        self.position = (0, 0)
        self.randomize_position()
    
    def randomize_position(self):
        self.position = (
            random.randint(0, (width - self.size) // self.size) * self.size,
            random.randint(0, (height - self.size) // self.size) * self.size
        )
    
    def draw(self, surface):
        rect = pygame.Rect(self.position[0], self.position[1], self.size, self.size)
        pygame.draw.rect(surface, RED, rect)
        pygame.draw.rect(surface, BLACK, rect, 1)

五、游戏主循环
现在我们将所有元素整合到游戏主循环中:

def game_loop():
    snake = Snake()
    food = Food()
    
    while True:
        snake.handle_keys()
        snake.move()
        
        # 检测是否吃到食物
        if snake.get_head_position() == food.position:
            snake.length += 1
            snake.score += 1
            food.randomize_position()
            # 确保食物不会生成在蛇身上
            while food.position in snake.positions:
                food.randomize_position()
        
        # 检测碰撞
        head_x, head_y = snake.get_head_position()
        if (head_x < 0 or head_x >= width or 
            head_y < 0 or head_y >= height or 
            snake.get_head_position() in snake.positions[1:]):
            game_over(snake.score)
            break
        
        # 绘制游戏界面
        game_display.fill(WHITE)
        snake.draw(game_display)
        food.draw(game_display)
        
        # 显示分数
        font = pygame.font.SysFont(None, 25)
        score_text = font.render(f"分数: {snake.score}", True, BLACK)
        game_display.blit(score_text, [10, 10])
        
        pygame.display.update()
        clock.tick(10)  # 控制游戏速度

六、游戏结束处理
当游戏结束时,显示最终分数并提供重新开始选项:

def game_over(score):
    game_display.fill(WHITE)
    font = pygame.font.SysFont(None, 50)
    game_over_text = font.render("游戏结束!", True, BLACK)
    score_text = font.render(f"最终分数: {score}", True, BLACK)
    restart_text = font.render("按R键重新开始,按Q键退出", True, BLACK)
    
    game_display.blit(game_over_text, [width//2 - 100, height//2 - 50])
    game_display.blit(score_text, [width//2 - 100, height//2])
    game_display.blit(restart_text, [width//2 - 200, height//2 + 50])
    pygame.display.update()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    return  # 重新开始游戏
                elif event.key == pygame.K_q:
                    pygame.quit()
                    quit()

七、启动游戏
最后,我们添加启动游戏的代码:

if __name__ == "__main__":
    while True:
        game_loop()

八、完整代码
以下是完整的贪吃蛇游戏代码:

import pygame
import random
import time

# 初始化pygame
pygame.init()

# 定义颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# 设置游戏窗口
width, height = 600, 400
game_display = pygame.display.set_mode((width, height))
pygame.display.set_caption('贪吃蛇游戏')

# 设置游戏时钟
clock = pygame.time.Clock()

class Snake:
    def __init__(self):
        self.size = 10
        self.length = 1
        self.positions = [(width//2, height//2)]  # 蛇头初始位置
        self.direction = random.choice(["UP", "DOWN", "LEFT", "RIGHT"])
        self.score = 0
        
    def get_head_position(self):
        return self.positions[0]
    
    def move(self):
        head_x, head_y = self.get_head_position()
        
        if self.direction == "UP":
            new_position = (head_x, head_y - self.size)
        elif self.direction == "DOWN":
            new_position = (head_x, head_y + self.size)
        elif self.direction == "LEFT":
            new_position = (head_x - self.size, head_y)
        elif self.direction == "RIGHT":
            new_position = (head_x + self.size, head_y)
            
        # 插入新的头部位置
        self.positions.insert(0, new_position)
        # 如果长度没有增加,则移除尾部
        if len(self.positions) > self.length:
            self.positions.pop()
    
    def draw(self, surface):
        for position in self.positions:
            rect = pygame.Rect(position[0], position[1], self.size, self.size)
            pygame.draw.rect(surface, GREEN, rect)
            pygame.draw.rect(surface, BLACK, rect, 1)
    
    def handle_keys(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP and self.direction != "DOWN":
                    self.direction = "UP"
                elif event.key == pygame.K_DOWN and self.direction != "UP":
                    self.direction = "DOWN"
                elif event.key == pygame.K_LEFT and self.direction != "RIGHT":
                    self.direction = "LEFT"
                elif event.key == pygame.K_RIGHT and self.direction != "LEFT":
                    self.direction = "RIGHT"

class Food:
    def __init__(self):
        self.size = 10
        self.position = (0, 0)
        self.randomize_position()
    
    def randomize_position(self):
        self.position = (
            random.randint(0, (width - self.size) // self.size) * self.size,
            random.randint(0, (height - self.size) // self.size) * self.size
        )
    
    def draw(self, surface):
        rect = pygame.Rect(self.position[0], self.position[1], self.size, self.size)
        pygame.draw.rect(surface, RED, rect)
        pygame.draw.rect(surface, BLACK, rect, 1)

def game_loop():
    snake = Snake()
    food = Food()
    
    while True:
        snake.handle_keys()
        snake.move()
        
        # 检测是否吃到食物
        if snake.get_head_position() == food.position:
            snake.length += 1
            snake.score += 1
            food.randomize_position()
            # 确保食物不会生成在蛇身上
            while food.position in snake.positions:
                food.randomize_position()
        
        # 检测碰撞
        head_x, head_y = snake.get_head_position()
        if (head_x < 0 or head_x >= width or 
            head_y < 0 or head_y >= height or 
            snake.get_head_position() in snake.positions[1:]):
            game_over(snake.score)
            break
        
        # 绘制游戏界面
        game_display.fill(WHITE)
        snake.draw(game_display)
        food.draw(game_display)
        
        # 显示分数
        font = pygame.font.SysFont(None, 25)
        score_text = font.render(f"分数: {snake.score}", True, BLACK)
        game_display.blit(score_text, [10, 10])
        
        pygame.display.update()
        clock.tick(10)  # 控制游戏速度

def game_over(score):
    game_display.fill(WHITE)
    font = pygame.font.SysFont(None, 50)
    game_over_text = font.render("游戏结束!", True, BLACK)
    score_text = font.render(f"最终分数: {score}", True, BLACK)
    restart_text = font.render("按R键重新开始,按Q键退出", True, BLACK)
    
    game_display.blit(game_over_text, [width//2 - 100, height//2 - 50])
    game_display.blit(score_text, [width//2 - 100, height//2])
    game_display.blit(restart_text, [width//2 - 200, height//2 + 50])
    pygame.display.update()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    return  # 重新开始游戏
                elif event.key == pygame.K_q:
                    pygame.quit()
                    quit()

if __name__ == "__main__":
    while True:
        game_loop()

结语
通过这个项目,我们学习了如何使用Python和Pygame库开发一个完整的贪吃蛇游戏。从游戏框架搭建到蛇的移动控制,再到食物生成和碰撞检测,涵盖了游戏开发的基本要素。希望这篇文章能帮助你理解游戏开发的基本流程,并激发你对Python游戏开发的兴趣。

最后:
希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!

文末福利
最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。

包含编程资料、学习路线图、源代码、软件安装包等!【点击这里】领取!
① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,学习不再是只会理论
④ 华为出品独家Python漫画教程,手机也能学习

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值