【Python游戏】编程开发贪吃蛇游戏(升级版)

news2024/11/27 0:44:51

本文收录于 《一起学Python趣味编程》专栏,从零基础开始,分享一些Python编程知识,欢迎关注,谢谢!

文章目录

    • 一、前言
    • 二、正式开始
        • 2.1 增加游戏背景音乐和吃掉食物动效音乐
        • 2.2 从单人游戏模式升级为双人游戏模式
        • 2.3 增加支持游戏手柄Xbox操作
        • 2.4 从生成单个食物升级为随机生成多个食物
        • 2.5 窗口顶部增加跑马灯效果,播放当前游戏得分排名
        • 2.6 当得分满足条件时,播放动画点赞效果
    • 三、游戏录屏和完整代码
    • 四、总结

一、前言

本文介绍如何对Python贪吃蛇游戏进行升级改造。

  • 什么是Python?

    Python是由荷兰人吉多·范罗苏姆于1990年代初设计的一门编程语言,应用领域非常广泛,尤其在数据分析、人工智能、游戏开发等领域,已经成为最受欢迎的程序设计语言之一,比较适合新手学习。
    Python语言标准库官方使用手册:https://docs.python.org/zh-cn/3/library/

  • 什么是Pygame?

    Pygame 是一个专门用来开发游戏的 Python 模块,是一个免费、开源的第三方软件包,主要为开发、设计 2D 电子游戏而生,比如扫雷、纸牌游戏、贪吃蛇、超级马里奥、飞机大战等等。
    Pygame官网地址:https://www.pygame.org/tags/all

  • 本次贪吃蛇游戏升级的内容有哪些?

    1、增加游戏背景音乐和吃掉食物动效音乐;
    2、从单人游戏模式升级为双人游戏模式;
    3、增加支持游戏手柄Xbox操作;
    4、从生成单个食物升级为随机生成多个食物;
    5、窗口顶部增加跑马灯效果,播放当前游戏得分排名;
    6、当得分满足条件时,播放动画点赞效果;
    

在这里插入图片描述

二、正式开始

2.1 增加游戏背景音乐和吃掉食物动效音乐

‌在贪吃蛇游戏中增加游戏背景音乐,可以使用pygame.mixer‌,它是Pygame模块中的一个子模块,专门用于加载和播放声音。

import time
import pygame

# 初始化pygame
pygame.init()

# 设置音频文件的路径
music_path = 'assets/music/bgm.mp3'

# 加载音乐
pygame.mixer.music.load(music_path)

# 播放音乐
pygame.mixer.music.play()

# 进程挂起休眠X秒
time.sleep(10)

# 停止音乐
pygame.mixer.music.stop()

# 退出pygame
pygame.quit()

这段代码演示了如何使用pygame.mixer模块来加载和播放音乐文件。在播放音乐之前,我们首先初始化pygame,加载音乐文件。然后,我们播放音乐,并在需要时停止音乐和退出pygame。

2.2 从单人游戏模式升级为双人游戏模式

贪吃蛇从单人游戏模式升级为双人游戏模式,由于python是面向对象编程语言,所以,我们只需要在原有的代码的基础上,再生成一个蛇类对象即可。

# 定义蛇类,点以25为单位
class Snake(object):
    # 初始化, 设置开始时移动方向和身体块长度x5
    def __init__(self, snake_no, operate_type):
        self.snake_no = snake_no  # 蛇编号,蛇1:snake_no_1,蛇2:snake_no_2
        self.operate_type = operate_type  # 操作方式,游戏手柄:xbox,键盘:keyboard
        self.body = []
        if SNAKE_NO_1 == snake_no:
            if OPERATE_TYPE_XBOX == operate_type:
                self.direction = XBOX_RIGHT
            if OPERATE_TYPE_KEYBOARD == operate_type:
                self.direction = KEY_D_RIGHT
            for x in range(5):
                self.add_first_node(0, 400)
        if SNAKE_NO_2 == snake_no:
            if OPERATE_TYPE_XBOX == operate_type:
                self.direction = XBOX_LEFT
            if OPERATE_TYPE_KEYBOARD == operate_type:
                self.direction = pygame.K_LEFT
            for x in range(5):
                self.add_first_node(800, 400)

    # 新增第一个蛇块
    def add_first_node(self, left, top):
        # 创建一个指定位置和大小的矩形区域,即蛇块
        node = pygame.Rect(left, top, 25, 25)
        self.body.insert(0, node)  # insert在列表的指定位置插入一个元素
 


# 生成两个蛇类
snake_no_1 = Snake(SNAKE_NO_1, OPERATE_TYPE_XBOX)
snake_no_2 = Snake(SNAKE_NO_2, OPERATE_TYPE_XBOX)
2.3 增加支持游戏手柄Xbox操作

在贪吃蛇游戏中,增加支持游戏手柄Xbox操作,需要使用pygame.joystick,它是与游戏杆、游戏手柄、追踪球进行交互的 pygame 模块。其中,Joystick 类的每个实例代表一个插入电脑的游戏设备。
在这里插入图片描述

以下是一个使用游戏杆控制红色圆圈移动的简单示例:

import pygame
import sys

# 初始化pygame
pygame.init()

# 设置屏幕大小
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))

# 设置角色的起始位置
x = 50
y = 50

# 游戏主循环标志
running = True

# 游戏杆的轴索引
AXIS_LEFT_RIGHT = 0
AXIS_UP_DOWN = 1

# 游戏杆索引
JOYSTICK_ID = 0

# 获取玩家的游戏杆
joystick = pygame.joystick.Joystick(JOYSTICK_ID)
joystick.init()

# 游戏主循环
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 获取游戏杆的轴值
    axes = joystick.get_axis(AXIS_LEFT_RIGHT)
    axes_up_down = joystick.get_axis(AXIS_UP_DOWN)

    # 根据轴值移动角色
    if axes > 0.5:
        x += 5
    elif axes < -0.5:
        x -= 5

    if axes_up_down > 0.5:
        y += 5
    elif axes_up_down < -0.5:
        y -= 5

    # 确保角色不会移出屏幕
    x = max(0, min(screen_width, x))
    y = max(0, min(screen_height, y))

    # 绘制背景
    screen.fill((255, 255, 255))

    # 绘制角色
    pygame.draw.circle(screen, (255, 0, 0), (x, y), 10)

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

    # 限制游戏循环的速度
    pygame.time.delay(10)

# 结束pygame
pygame.quit()
sys.exit()

这段代码首先初始化pygame,设置屏幕大小,并获取玩家的游戏杆。然后,它进入一个主循环,在循环中不断检测事件(比如窗口关闭事件),并根据玩家的游戏杆轴值移动一个红色圆圈。游戏的主循环速度被限制,以避免使用过多的CPU资源。最后,当玩家关闭窗口或者程序结束时,pygame库被正确地关闭。

2.4 从生成单个食物升级为随机生成多个食物

在贪吃蛇游戏中,由原来生成单个食物,想升级为随机多个食物。可以使用随机函数,随机创建若干个食物类对象,存放在一个列表中。
在这里插入图片描述

示例代码如下:

 # 创建一波食物对象,放在列表Foods中
        if len(Foods) == 0:
            for i in range(random.randint(2, 10)):
                Foods.append(Food())
2.5 窗口顶部增加跑马灯效果,播放当前游戏得分排名

在贪吃蛇游戏中,窗口顶部增加跑马灯效果,播放当前游戏得分排名。首先,可以把每次游戏的得分数据进行排序后记录在一个TXT文件中。之后,从TXT文件中读取得分排名数据,放在文本Surface对象中。最后,把文本Surface对象绘制在屏幕screen上。

在这里插入图片描述

以下是一个TXT文件读写简单示例。

# 写入得分txt文件,数据为字典格式
def write_txt(file_name, data_dict):
    try:
        with open(file_name, 'w', encoding='utf-8') as f1:
            data_str = json.dumps(data_dict)  # json to str
            f1.write(data_str)
    except FileNotFoundError:
        print('文件未找到,请检查文件路径是否正确。')


# 读取得分txt文件,返回字典格式数据
def read_txt(file_name):
    try:
        with open(file_name, 'r', encoding='utf-8') as f1:
            data_list = f1.readlines()
            if len(data_list) > 0:
                data_dict = json.loads(data_list[0])  # str to json
                return data_dict
    except FileNotFoundError:
        print('文件未找到,请检查文件路径是否正确。')

以下是一个屏幕上显示文本Surface对象简单示例:

# 导入所需的模块
import sys
import pygame

# 使用pygame之前必须初始化
pygame.init()

# 设置主屏窗口
screen = pygame.display.set_mode((400, 600))

# 设置窗口的标题
pygame.display.set_caption('pygame demo')

# 引入字体类型
f = pygame.font.Font('C:/Windows/Fonts/simhei.ttf', 50)

# 生成文本信息,第一个参数文本内容;第二个参数字体是否平滑;第三个参数字体颜色设置红色;第四个参数字体背景颜色设置为蓝色;
text = f.render("hello world!", True, (255, 0, 0), (0, 0, 255))

# 获得显示对象的rect区域坐标
textRect = text.get_rect()
# 设置显示对象居中
textRect.center = (200, 200)

# 将准备好的文本信息,绘制到主屏幕 Screen 上。
screen.blit(text, textRect)

# 固定代码段,实现点击"X"号退出界面的功能,几乎所有的pygame都会使用该段代码
while True:
    # 循环获取事件,监听事件状态
    for event in pygame.event.get():
        # 判断用户是否点了"X"关闭按钮,并执行if代码段
        if event.type == pygame.QUIT:
            # 卸载所有模块
            pygame.quit()
            # 终止程序,确保退出程序
            sys.exit()
    pygame.display.flip()  # 更新屏幕内容


2.6 当得分满足条件时,播放动画点赞效果

在贪吃蛇游戏中,当得分满足条件时,想播放动画点赞效果。需要使用图像Surface对象,之后通过不断的修改图像的坐标,实现动画播放效果。

在这里插入图片描述

简单的代码示例如下:

import pygame, sys

pygame.init()
screen = pygame.display.set_mode([640, 480])
screen.fill([255, 255, 255])
my_ball = pygame.image.load("../../assets/ball.png")
x = 50
y = 50
x_speed = 5
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    pygame.time.delay(20)
    x = x + x_speed
    if x > screen.get_width():
        x = 0 - 90
    screen.blit(my_ball, [x, y])
    pygame.display.flip()

三、游戏录屏和完整代码

在这里插入图片描述

若需要游戏的完整源码,请在评论区,回复“我要源码”。

四、总结

以上介绍了如何升级改造贪吃蛇游戏,对修改的思路和代码进行了简单的介绍。希望对大家有帮助,谢谢。

如果您对文章中内容有疑问,欢迎在评论区进行留言,我会尽量抽时间给您回复。如果文章对您有帮助,欢迎点赞、收藏。您的点赞,是对我最大的支持和鼓励,谢谢 :-)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2063035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年8月22日,讲一讲这段时间的思考和正在做的事情吧

焦虑 这会工作不忙了&#xff0c;赶紧抓住这点时间写点自己的东西。记录一下最近正在做的事情。 在6月中旬以前吧&#xff0c;整个人都处于极其焦虑的状态&#xff0c;焦虑个人发展&#xff0c;焦虑自己的未来在哪里&#xff0c;想要回老家发展&#xff0c;焦虑回老家自己能做…

zyx青岛实训day31 8/19 playbook的基本使用

1、使用ansible安装并启动ftp服务 [root1 ~]# vim /etc/ansible/hosts s0 ansible_ssh_host10.0.0.12 ansible_ssh_port22 ansible_ssh_userroot ansible_ssh_pass1 s1 ansible_ssh_host10.0.0.13 ansible_ssh_port22 ansible_ssh_userroot ansible_ssh_pass1 s2 ansible_s…

华大FLASH之w25Q系列

W25Q64JV的标准/双/四SPl指令集由48条基本指令组成&#xff0c;这些指令通过SPI总线完全控制&#xff08;见指令集表1-2&#xff09;。 指令从芯片选择&#xff08;/CS&#xff09;的下降沿开始。时钟输入DI输入的第一字节数据提供指令代码。DI输入上的数据在时钟的上升沿上采样…

KCP源码解析系列(五)拥塞控制

流量控制和拥塞控制的区别 如果你约了你的朋友见面聊一件事&#xff0c;有两种沟通方式&#xff1a; 第一种是一次只说一句话&#xff0c;然后等待你的朋友回应“收到”&#xff0c;确认他在听之后&#xff0c;再说下一句话&#xff0c;如此反复&#xff0c;直到事情说完。第…

身份证二要素验证接口如何用PHP进行调用

一、什么是身份证二要素验证接口&#xff1f; 身份证二要素验证接口又叫身份证实名认证、身份实名验证、身份证核验接口、实名核验接口等&#xff0c;该接口叫法非常多&#xff0c;但是他的入参都是一样的&#xff0c;核验姓名和身份证号码是否一致&#xff0c;并返回性别、籍…

2024年了,我依然建议去创建属于自己的Google App

大环境的确不好&#xff0c;Android&#xff0c;iOS程序员都白菜价了&#xff0c;每天充斥着我们耳边的都是裁员、降薪等不好的消息&#xff0c;是不是我们移动端开发人员的日子真的到头了呢&#xff1f;大约在一年前&#xff0c;其实我也意识到这个问题&#xff0c;想学习的话…

BlazeFace: Sub-millisecond Neural Face Detection on Mobile GPUs

Abstract 我们提出了BlazeFace&#xff0c;这是一种轻量级且性能优异的面部检测器&#xff0c;专为移动GPU推理而设计。它在旗舰设备上运行速度可达200到1000 FPS。这种超实时性能使其能够应用于任何增强现实管道中&#xff0c;作为任务特定模型的输入来准确识别面部感兴趣区域…

CST软件仿真案例:圆极化平板天线仿真02

本期继续完成一款圆极化Patch天线的仿真实例。读者可以完整的了解到怎么用CST微波工作室&#xff0c;完成对一款天线建模、设置到仿真分析的完整过程。 本期中&#xff0c;我们要设计的圆极化天线尺寸如下图所示&#xff1a; 本期内容是接着上期部分开始。首先先完成仿真实例0…

k8s部署redis一主两从三哨兵(集群内访问)

一、配置清单 1.基于K8s搭建部署1主2从3哨兵的Redis集群哨兵模式(集群内访问) 2.持久化数据选择用storageclass&#xff0c;动态创建pv存储&#xff0c;动态存储使用longhorn 创建redis配置文件 #注意内容中注释 apiVersion: v1 kind: Namespace metadata:name: prod--- ap…

C#学习第二节课 ,伤害计算

伤害计算 我一直好奇游戏的伤害计算是怎么计算并输出的,这第二节课利用学过的初级语法,Console.WriteLine,Console.ReadLine(),以及基础变量,int,string 和if 判断 组合,来实现打印一下伤害计算吧! 老规矩 先上结果图 代码区域 namespace hello01 {internal class Program …

秒杀商品超出限量购买修复方法

问题:秒杀商品购买会超出限量,多买 修复: 主要修改了以下文件,如果需要了文件全部在附件中,修改的基础版本是v2.3.2如果没有二开过,可以直接覆盖替换;如果二开了,请对比处理, ⚠️注意: 这样修改完以后,可能导致之前的秒杀都库存不足无法购买 ,需要重新添加 修改的记录,以供参…

开源低代码开发工具Lowcoder

Lowcoder_CN 是一个基于Web的低代码开发平台&#xff0c;旨在通过可视化界面和丰富的API&#xff0c;支持快速应用开发、企业内部工具构建以及教育用途。 以下是对Lowcoder_CN的详细介绍&#xff1a; 一、平台特点 开源与免费&#xff1a;Lowcoder_CN是开源的&#xff0c;允许…

【ACM出版 | IEEEACM院士、CCF杰出会员担任组委| 往届会后3个半月检索 】第三届人工智能与智能信息处理国际学术会议(AIIIP 2024)

第三届人工智能与智能信息处理国际学术会议&#xff08;AIIIP 2024&#xff09;将于2024年10月25日-27日在中国-天津举行。新一代人工智能理论的快速发展为信息处理技术的提供了新方法&#xff0c;促进了智能信息处理的发展与应用。智能信息处理是信号与信息领域一个前沿、热点…

颖通控股突击巨额分红6.31亿远超净利润,滞销产品三年累计1750万

《港湾商业观察》黄懿 7月18日&#xff0c;被外界称为香水巨头的颖通控股有限公司&#xff08;下称“颖通控股”&#xff09;向港交所主板提交上市申请&#xff0c;BNP Paribas、中信证券为其联席保荐人。颖通&#xff08;上海&#xff09;贸易有限公司为其国内运营主体。 据…

[星瞳科技]OpenMV如何进行wifi通信?

OpenMV官方扩展板采用ATWINC1500模组&#xff0c;可以传输图像。 详细资料&#xff1a;http://singtown.cc/product/openmv-wifi扩展板/ 如果想使用ESP8266&#xff0c;使用串口通信就可以。 wifi扫描 无线传输图像 无线传输小球坐标 import sensor import time import netw…

基于PHP+MySQL组合开发的DIY分销商城小程序源码系统 附带源代码包以及搭建部署教程

系统概述 随着消费者对购物便捷性、个性化需求的不断增长&#xff0c;传统的电商模式已难以满足市场多样化需求。分销商城小程序以其低门槛、易传播、高粘性等特点&#xff0c;成为众多商家转型升级的首选。本源码系统正是基于这一市场需求&#xff0c;利用PHP这一成熟稳定的后…

【C++】深度解析:用 C++ 模拟实现 priority_queue类,探索其底层实现细节(仿函数、容器适配器)

目录 ⭐前言 ✨堆 ✨容器适配器 ✨仿函数 ⭐priority_queue介绍 ⭐priority_queue参数介绍 ⭐priority_queue使用 ⭐priority_queue实现 ✨仿函数实现 ✨堆的向上调整和向下调整 ✨完整代码 ⭐前言 ✨堆 堆是一种特殊的树形数据结构&#xff0c;通常以二叉树的…

AVI视频损坏了怎么修复?轻松几步解决你的困扰

在数字化时代&#xff0c;视频已成为我们记录生活、分享经验和传递信息的重要方式。AVI作为一种常见的视频格式&#xff0c;因其无损质量的特点而受到广泛欢迎。然而&#xff0c;有时候我们可能会遇到AVI视频文件损坏的情况&#xff0c;导致无法正常播放。别担心&#xff0c;本…

探索paho-mqtt:Python世界的物联网通信桥梁

文章目录 **探索paho-mqtt&#xff1a;Python世界的物联网通信桥梁**第一部分&#xff1a;背景介绍第二部分&#xff1a;paho-mqtt概览第三部分&#xff1a;安装指南第四部分&#xff1a;基础函数使用第五部分&#xff1a;实际应用场景第六部分&#xff1a;常见问题与解决方案第…

VMware vSphere Replication 虚拟机备份及迁移实践

vSphere Replication 介绍 vSphere Replication 是适用于 vSphere 的基于 Hypervisor 管理程序的异步复制解决方案&#xff0c;是 VMware vCenter Server 的扩展&#xff0c;包含在vCenter Server Standard中&#xff0c;可为环境中的所有虚拟机提供灾难恢复和数据保护。 vSph…