学Python得练手,经典坦克大战完整项目开发与分享

学Python得练手,经典坦克大战完整项目开发与分享

首页休闲益智坦克射击对决更新时间:2024-05-11

学Python,得练手。只有经历实实在在的项目锤炼,才能将加深对语法的理解,才能将书本知识内化成知识和经验。

程序的世界是其乐无穷的,玩游戏不如开发游戏,程序员一言不合就自己开发。

经典坦克大战

坦克大战,既经典又简单,非常适合初学者练手储备技能。从中不仅可以体会编程的乐趣,还可以快速建立程序思维、框架思维和逻辑思维。作为Python初学者,至少在以下方面获得快速入门:

闲话少说,下面简述开发过程:

一.搜集资源

游戏就是一个人机交互的过程,是操作者对图片的操作,以及游戏对图片、声音等资源的响应和不断刷新的过程。

开发游戏第一步,要找到坦克大战游戏所需要的各类资源,包括我方坦克、敌方坦克、我方子弹、敌方子弹、墙壁、铁墙、爆炸图等图片,还有背景音乐、开炮音效、game over音效等声音资源。

网上有一些零散的资源,需要较大精力去搜集和整理,有部分还要收费才能下载。我收集了完整的坦克大战游戏开发所需资源,关注 私信后可免费分享。

二、功能设计

1.坦克移动

我方坦克根据键盘(上、下、左、右)按下事件进行移动,地方坦克随机确定方向和速度进行移动,并均受一定条件限制,比如碰撞坦克、碰撞墙壁、碰撞边缘,均要进行运动限制和调整。

2.发射子弹

我方坦克根据键盘(空格)事件发射子弹,地方坦克自动发射子弹,子弹方向与坦克运动方向一致。并要适当控制子弹发射频率,因为计算机运行速度非常快,连环炮是的发射就不是坦克了。

3.加载墙壁

可在游戏场景中加载普通墙壁和钢铁墙壁,普通墙壁被子弹击中会消亡,钢铁墙壁被子弹击中不发生变化,或者受到大量射击后再行消亡,可在游戏中设置超级武器,设置强力火力,增加乐趣。

4.碰撞检测

我方子弹与敌方坦克、敌方子弹与我方坦克需进行碰撞检测,发生碰撞则坦克和子弹都消亡。子弹与墙壁也要进行碰撞检测,子弹不能穿墙,发生碰撞,子弹消亡,普通墙壁击毁。坦克与墙壁进行碰撞检测,坦克不能穿墙,发生碰撞,调整坦克运行方向。我方坦克与敌方坦克也要进行碰撞检测,发生碰撞,则卡死不动,需要调整运动方向。

5.加载音效

游戏启动(或者其他时间)就要加载背景音乐,并循环播放。音乐一起,成就和怀旧感就上来了。发射炮弹时要加载发射音效,我方坦克被击中要加载game over音效。

三、pygame核心功能的使用

导入pygame包之后,核心代码就以下四行:

pygame.display.init()
pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])

pygame.Surface.blit(self.image, self.rect)

pygame.display.update()

游戏过程就是程序不断地循环运行上面四行语句,中间不断进行条件检测,修改图片坐标。所以用Python写程序是非常便捷,可以快速见效的。具体实现过程就不再赘述了,需要的可以看源码。

坦克大战源码

四、开发过程遇到的坑

1.成员变量的设计

因涉及到类的继承,开发的过程对成员变量的设计和继承还是有一些忐忑的,究竟成员变量是否要在__init__(self)的参数列表中进行申明?初始化参数是在__init__(self)里面还是外面?__init__(self)中初始化参数要不要加前缀self?未在__init__(self)参数列表中的参数能否被子类继承?这些问题都会在开发过程中得到验证和厘清。本文就暂时不进行一一解答,留给读者自行研究吧。

2.碰撞检测

Pygame里有现成的精灵类sprite的pygame.sprite.collide_rect(left,right)方法用于碰撞检测,在开发过程经常遇到明明坦克坐标未发生碰撞,但碰撞检测却一直检测发生了碰撞,或者始终检测不到碰撞。经过反复研究主要问题还是参数传递的问题。

3.加载声音

加载声音主要使用pygame.mixer.music.load()和 pygame.mixer.music.play()两个方法,但运行时经常发现两个声音不能同时加载,比如发射炮弹的时候加载发射音效,此时背景音乐就停止了。经研究,可以使用两种音效加载方法,另一个方法是pygame.mixer.Sound(),一个循环播放,一个单次播放即可。

------------

本次开发也只实现了一个简单场景的坦克大战,程序架构设计也存在一些不完善的地方,欢迎讨论交流和批评指导,感兴趣的朋友可以 关注、私信,免费分享源码、图片和音效资源。

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved