Python实现坦克大战(TankWar)游戏(下)

简介: Python实现坦克大战(TankWar)游戏

Foods


游戏中的道具则是 Foods,大写的静态常量 BOOM、IRON 则是道具的标识符,exist_time 为存在时间,update() 处理存在时间的倒计时和在一定时间后从游戏中移除这个道具。

道具的处理位于游戏关卡界面类中 __dispatch_food_effects(),负责播放音效和产生对应的效果并从实体组中移除这个道具实例,当玩家坦克与 Foods 实体发生碰撞时将会触发,而碰撞的处理也是在游戏关卡界面类中的 __dispatch_collisions() 进行的

def __dispatch_food_effect(self, food: Foods, player_tank: PlayerTank):
    self.__play_sound('add')
    if food.type == Foods.BOOM:
        for _ in self.__entities.enemy_tanks:
            self.__play_sound('bang')
        self.__total_enemy_num -= len(self.__entities.enemy_tanks)
        self.__entities.clear_enemy_tanks()
    elif food.type == Foods.CLOCK:
        for enemy_tank in self.__entities.enemy_tanks:
            enemy_tank.set_still()
    elif food.type == Foods.GUN:
        player_tank.improve_level()
    elif food.type == Foods.IRON:
        for x, y in self.__home.walls_position:
            self.__scene_elements.add(
                self.__scene_factory.create_element((x, y), SceneFactory.IRON)
            )
    elif food.type == Foods.PROTECT:
        player_tank.protected = True
    elif food.type == Foods.STAR:
        player_tank.improve_level()
        player_tank.improve_level()
    elif food.type == Foods.TANK:
        player_tank.add_health()
    self.__entities.foods.remove(food)
def __dispatch_collisions(self):
    ...
  for player_tank in self.__entities.player_tanks:
  for food in self.__entities.foods:
    collision_result = collide_rect(player_tank, food)
    if collision_result:
    self.__dispatch_food_effect(food, player_tank)
    ...


UMLs

Statechart diagram


Use case diagram



Class diagram


Improvements


基于原有的坦克大战的设计改进如下:




在原有的项目中,经常有需要传入各式各样的游戏资源路径参数的构造函数,对 TankGame 进行单例模式设计的改进,可以令 TankGame 存储一个 config 保存所有游戏资源的路径数据,这样在有其他类需要访问游戏资源路径参数的时候,就可以通过 TankGame().getConfig 进行访问。类似的,TankGame 也拥有一个 Screen 对象,为当前游戏窗口的唯一引用,这样就不用每个画面类都存一个 Screen 对象。
在原有的项目中,关卡加载、游戏开始、游戏结束的画面类都放在了 interfaces 这个包中,但是 GameLevel 同样作为一个画面,却放在了这个包的外头,而且画面类有固定的行为模式但没有继承关系、没有抽象,且加载资源的时候由于画面之间相互切换,导致一个界面加载了很多次,并且界面创建时需要向构造函数传入各种的游戏配置参数,十分麻烦。对此,进行的改进是:对画面进行抽象,抽象出一个 AbstractView 定义画面的通用行为模式,用一个 ViewManager 单例管理所有的画面的预加载和显示,提升了程序的工作效率
在原有的项目中,玩家坦克和敌方坦克同样是具有一些相同的行为模式(比如移动 move()、射击 shoot()、升降级和死亡),但却没有一个抽象,而且每次对象初始化都要分别传入一堆的资源文件路径,不仅不方便、而且所以改进是 Tank 就是对敌方坦克和玩家坦克的一个抽象,在创建坦克对象时由 Tankfactory 负责,TankFactory 提前装载好 Config,然后在坦克创建的时候只需指定坦克的位置和类型即可完成创建
在原有的项目中,没有区分场景元素 SceneElement 和实体 Entity,当然也没有场景元素组 SceneElementsGroup 和实体组 EntityGroup,每次访问都是对具体的游戏元素组的直接访问,一个类型的游戏元素只能放进只属于自己类型的组,这里就可以将游戏的元素区分为场景元素和实体,所有的场景元素继承抽象的场景元素类,场景元素的创建由场景元素工厂 SceneElementFactory 负责。场景元素组存储所有各类场景元素的聚集,根据传入的场景元素的类型自动判别要操作的聚集目标。实体的分类是基于概念的,但是实体组是根据实体的概念分类管理实体,根据传入的实体的类型自动判别要操作的聚集目标。
在原有的项目中,所有的游戏各个模块的处理都囊括在了主循环当中,显然这是不易于维护的,所以就把各个处理重新分配到了游戏关卡类的各个函数当中,每个函数都有对应一个职责(游戏逻辑、碰撞处理、文字渲染、画面渲染、用户事件接受、游戏终止判断),使得游戏关卡类的过程内聚。

Postscript


在学习过了面向对象设计分析课程之后也了解了不少设计模式,虽然说拥有解决复杂工程项目的能力,但是目前依然欠缺一些应用能力,不能很好地利用所学的知识来组织复杂工程项目,项目依然存在可改进之处。


从第一次 commit 到最后一次 commit,历时一个多月的时间(真正开发的时间有 100h+),将一个 GitHub 完全看上去组织地较乱的游戏工程项目改造成了一个具有面向对象设计思想的游戏,还是第一次尝试重构这样的项目。


重构的过程需要不断地进行抽象、重新设计、并进行测试,需要检测游戏功能逻辑和原有项目之间是否一致,重构时出现 bug 是非常常见的事情,利用好测试以及版本差异比较工具解决重构产生的逻辑不一致也很重要,测试理想情况下是利用自动化单元测试,但是能力有限只进行了手动测试。

Screenshots


Choose Multi-Player



Loading a Level



Playing in a Level



Game Over


相关文章
|
8月前
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
458 48
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
3月前
|
人工智能 搜索推荐 数据可视化
用 Python 制作简单小游戏教程:手把手教你开发猜数字游戏
本教程详细讲解了用Python实现经典猜数字游戏的完整流程,涵盖从基础规则到高级功能的全方位开发。内容包括游戏逻辑设计、输入验证与错误处理、猜测次数统计、难度选择、彩色输出等核心功能,并提供完整代码示例。同时,介绍了开发环境搭建及调试方法,帮助初学者快速上手。最后还提出了图形界面、网络对战、成就系统等扩展方向,鼓励读者自主创新,打造个性化游戏版本。适合Python入门者实践与进阶学习。
247 1
|
8月前
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
233 7
|
8月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
325 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
9月前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
177 33
|
11月前
|
IDE 开发工具 Python
Python扑克游戏编程---摸大点
Python扑克游戏编程---摸大点
146 1
|
11月前
|
数据采集 前端开发 Python
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
227 0
|
Python
Python实现坦克大战
前段时间,也就是国庆节。在寝室闲来无事,用pygame写了一个小游戏,就是标题写的《坦克大战》。这个游戏写了两个版本,第一个版本是按照书上的思想来写的,发现写到后面的时候代码太乱了。于是我又从头开始,用比较合理的面向对象思想重新写了一个版本。说比较合理也只是符合我自己的思想,所以难免会有一些不合理的设计,水平有限,希望各位读者能够包涵一下。
319 0
|
3月前
|
Python
Python编程基石:整型、浮点、字符串与布尔值完全解读
本文介绍了Python中的四种基本数据类型:整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。整型表示无大小限制的整数,支持各类运算;浮点型遵循IEEE 754标准,需注意精度问题;字符串是不可变序列,支持多种操作与方法;布尔型仅有True和False两个值,可与其他类型转换。掌握这些类型及其转换规则是Python编程的基础。
211 33
|
2月前
|
数据采集 分布式计算 大数据
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
83 1

热门文章

最新文章

推荐镜像

更多