首页 > 编程语言 >用Python开发一个经典贪吃蛇小游戏

用Python开发一个经典贪吃蛇小游戏

时间:2024-12-06 08:59:00浏览次数:7  
标签:body direction Python 小游戏 pygame 贪吃蛇 SIZE BLOCK snake

Python 是开发小游戏的绝佳工具,借助第三方库,如 pygame,我们可以快速开发一个经典的贪吃蛇游戏。本篇将介绍如何用 Python 实现一个完整的贪吃蛇小游戏。


一、游戏设计

1.1 游戏规则

  1. 玩家通过方向键控制贪吃蛇移动。
  2. 贪吃蛇吃到食物后会变长,同时得分增加。
  3. 如果贪吃蛇撞到自己或边界,游戏结束。

1.2 技术点

  • 绘图与事件处理:使用 pygame 实现画面渲染与键盘事件监听。
  • 游戏逻辑:包括蛇的移动、碰撞检测、食物生成等。

二、开发环境

  • 开发工具:任意 Python 编辑器(如 PyCharm、VS Code)
  • 依赖库pygame
    安装方法:pip install pygame

三、代码实现

以下是完整代码及详细注释:

import pygame
import random
import time

# 初始化 Pygame
pygame.init()

# 屏幕大小
WIDTH, HEIGHT = 600, 400
BLOCK_SIZE = 20

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

# 创建屏幕
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("贪吃蛇小游戏")

# 时钟对象
clock = pygame.time.Clock()

def draw_snake(snake_body):
    """
    绘制贪吃蛇
    """
    for block in snake_body:
        pygame.draw.rect(screen, GREEN, pygame.Rect(block[0], block[1], BLOCK_SIZE, BLOCK_SIZE))

def show_score(score):
    """
    显示分数
    """
    font = pygame.font.SysFont('comicsansms', 20)
    score_surface = font.render(f"Score: {score}", True, WHITE)
    screen.blit(score_surface, (10, 10))

def game_over():
    """
    显示游戏结束画面
    """
    font = pygame.font.SysFont('comicsansms', 50)
    game_over_surface = font.render("Game Over!", True, RED)
    screen.blit(game_over_surface, (WIDTH // 4, HEIGHT // 3))
    pygame.display.flip()
    time.sleep(3)
    pygame.quit()
    quit()

def main():
    # 初始位置
    snake_body = [[100, 50], [80, 50], [60, 50]]  # 初始蛇身
    direction = 'RIGHT'  # 初始方向
    change_to = direction

    # 初始食物位置
    food_pos = [random.randrange(1, (WIDTH // BLOCK_SIZE)) * BLOCK_SIZE,
                random.randrange(1, (HEIGHT // BLOCK_SIZE)) * BLOCK_SIZE]
    food_spawn = True

    score = 0

    while True:
        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP and direction != 'DOWN':
                    change_to = 'UP'
                if event.key == pygame.K_DOWN and direction != 'UP':
                    change_to = 'DOWN'
                if event.key == pygame.K_LEFT and direction != 'RIGHT':
                    change_to = 'LEFT'
                if event.key == pygame.K_RIGHT and direction != 'LEFT':
                    change_to = 'RIGHT'

        # 更新方向
        direction = change_to

        # 更新蛇头位置
        if direction == 'UP':
            snake_body[0][1] -= BLOCK_SIZE
        if direction == 'DOWN':
            snake_body[0][1] += BLOCK_SIZE
        if direction == 'LEFT':
            snake_body[0][0] -= BLOCK_SIZE
        if direction == 'RIGHT':
            snake_body[0][0] += BLOCK_SIZE

        # 增长蛇身
        snake_body.insert(0, list(snake_body[0]))
        if snake_body[0] == food_pos:
            score += 10
            food_spawn = False
        else:
            snake_body.pop()

        if not food_spawn:
            food_pos = [random.randrange(1, (WIDTH // BLOCK_SIZE)) * BLOCK_SIZE,
                        random.randrange(1, (HEIGHT // BLOCK_SIZE)) * BLOCK_SIZE]
        food_spawn = True

        # 游戏结束条件
        if snake_body[0][0] < 0 or snake_body[0][0] >= WIDTH or snake_body[0][1] < 0 or snake_body[0][1] >= HEIGHT:
            game_over()

        for block in snake_body[1:]:
            if snake_body[0] == block:
                game_over()

        # 绘制屏幕
        screen.fill(BLACK)
        draw_snake(snake_body)
        pygame.draw.rect(screen, RED, pygame.Rect(food_pos[0], food_pos[1], BLOCK_SIZE, BLOCK_SIZE))
        show_score(score)

        # 更新屏幕
        pygame.display.flip()

        # 控制游戏速度
        clock.tick(15)

if __name__ == "__main__":
    main()

四、运行效果

  1. 游戏界面

    • 贪吃蛇用绿色方块表示。
    • 食物用红色方块表示。
    • 左上角实时显示得分。
  2. 游戏操作

    • 通过上下左右键控制蛇移动。
    • 吃到食物后,蛇身变长,得分增加。
  3. 游戏结束

    • 撞墙或撞到自己时,游戏结束并显示“Game Over”提示。

五、扩展功能

  1. 增加关卡:设置不同关卡,每关提高速度或改变地图布局。
  2. 障碍物:在地图中添加障碍物增加难度。
  3. 存档功能:保存玩家最高分,显示排行榜。
  4. 多人模式:支持多个玩家同时控制不同的蛇。

六、总结

通过本项目,你可以学到:

  • 使用 pygame 实现画面渲染和事件监听。
  • 设计经典游戏逻辑(如碰撞检测、状态更新)。
  • 将编程与趣味性结合,提高开发兴趣。

希望你能通过贪吃蛇小游戏开发,迈出游戏编程的第一步!

标签:body,direction,Python,小游戏,pygame,贪吃蛇,SIZE,BLOCK,snake
From: https://blog.csdn.net/X2829352498/article/details/144281070

相关文章

  • 爬取小说资源的Python实践:从单线程到多线程的效率飞跃
    爬取小说资源的Python实践:从单线程到多线程的效率飞跃前提声明爬虫应遵守目标网站的robots.txt协议,尊重版权和用户隐私。本代码仅供学习和研究使用,不得用于商业用途。请确保在合法合规的前提下使用本代码。本代码所爬取的小说资源为公开可下载的内容。目录引言环境准备......
  • CCF-CSP真题 《201412_2_Z字形扫描》Python思路题解
    题目描述:在图像编码的算法中,需要将一个给定的方形矩阵进行 Z 字形扫描(ZigzagScan)。给定一个 n×n的矩阵,Z字形扫描的过程如下图所示:对于下面的 4×4 的矩阵,1539375694647313对其进行 Z 字形扫描后得到长度为 16 的序列:1539739547......
  • 打怪小游戏
    #include<iostream>usingnamespacestd;doubleshengmingli=2000;//定义主角初始生命力intgongjili=150;//定义主角初始攻击力intfangyuli=200;//定义主角初始防御力intmoney=20;//定义主角初始金钱数量boolguoguan;//定义是否通关判定voidwuqidian();//......
  • 贪吃蛇(2)
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<time.h>#include<windows.h>#include<stdlib.h>#include<iostream>#include<conio.h>#defineMY_BUFSIZE1024//控制台窗口标题的缓冲区大小#defineINITIALTIME80//蛇......
  • 聪明办法学Python chap 4 and 代码风格
    Chap4条件选择语句1、if语句if<condition>: statement elif<condition>:#可以有多条esif statementelse:#可以没有else statementif和elif的后面跟着条件语句,如果是True则进行if或elif控制下的陈述语句,if和elif的条件允许重复,但只......
  • python打砖块
    importpygamefrompygame.localsimport*importtimeimportrandomimportsysimportospygame.init()canvas=pygame.display.set_mode((1000,625))pygame.display.set_caption("打砖块")classBall(pygame.sprite.Sprite):def__init__(self):......
  • 【python】新人小白极速入手,免配置环境变量
    嗨,大家好,想必大家对python入门比较困惑,我今天教大家如何快速的进入python中~1首先先下载VSCode,选用的主要目的是体积小巧,便于配置低的同学也能搭建。https://code.visualstudio.com/Download下载应该很简单吧——2下载python环境,这里推荐3.9/3.11,目前比较主流https://w......
  • CAE工程师使用python等脚本进行自动化的好处
    简介编写一个脚本或工具来加快进程可能看起来令人生畏,或者不值得花费精力。如果只需要几个小时就能完成任务,为什么还要花一天时间编写脚本呢?答案是,这往往不是你唯一一次做“某事”。可能是一次,也可能是10次或100次。这就是脚本能真正帮助你的地方。但它并不局限于“加快速......
  • 扩展01:代码风格/python规范style
    一.风格介绍修饰的前提是“跑通”代码,也就是说先确保你的code没有任何bug这种“修饰”并不是对每一个都强制学习的内容二.缩进与换行1.缩进1.)如果有开始定界符,其余行的缩进需与开始定界符对齐。2.)需要额外的4个空格(长度相当于一个Tab键),以区分开传入参数,和其他内容。3.)空......
  • Python学习|科学计算基础之Numpy
    一、实验目的(1)了解numpy.ndarray数组的各种基本属性(2)掌握数组的各种访问方式。(3)掌握常用的统计函数。二、实验内容1.了解NumPy数组的基本属性In:importnumpyasnpIn:np.__version__          #显示NumPy版本,注意前后都是两个下画线In:a=np.arange(......