Python开发坦克大战
3.1 我采用了云端授权的方式进行对游戏main.py进行验证,验证方式分为:1.本地local验证(此类验证方法不详细阐述,仅开发提供,后续可能会移除)2.云端验证,云端验证采用通过互联网连接来进行验证,云端验证采用访问DCDN(炫讯云计算DCDN)的授权模块插件来实现,为了防止DCDN无法访问的情况,我加入了备用授权服务器节点,通过IP直连的方式进行授权验证,授权验证是验证版本号跟云端是否一致
1.项目介绍
1.1完成功能
菜单选择:玩家可以根据菜单进行选择,提高了程序的交互性
多种模式:提供了关卡模式、无尽模式、单挑模式、建造模式多种模式选择
地图编辑:用户可以根据自己想法自由编辑地图,增加玩家趣味性。
简单敌人AI:敌人有简单的AI行为,如:发射子弹、漫步等。
动画效果:坦克在受到攻击时的爆破效果;敌方坦克复活的简单动画。
游戏循环:同一般软件不同,游戏需要采用主循环来更新场景状态并重绘屏幕。本程序以60FPS的帧率刷新屏幕。
墙体:不同墙体元素有不同的特性。
道具:不同的道具会触发不同的效果
多种关卡:关卡模式和无尽模式都有35种不同的关卡
双人对战:可以进行双人当成队友一起游戏,也可以当成敌人进行单挑
1.2游戏演示
1.2.1菜单界面的演示
下面就是菜单的演示,目前关卡模式、无尽模式是根据原版制作了35关,单挑模式制作了1关。
1.2.2关卡模式和无尽模式的演示
关卡模式:可以看到右边显示敌军剩余数量和我方血量,当然这个游戏支持双人玩
无尽模式:敌军数量和我方生命无限
1.2.3单挑模式和建造模式
单挑模式:可以进行两人玩耍进行对抗
建造模式:争对上面三种模式可以进行自定义建造并开始游戏。
2.项目实现
2.1pygame的介绍
pygame是跨平台Python模块,专为电子游戏设计。包含图像、声音。创建在SDL基础上,允许实时电子游戏研发而无需被低端语言,如C语言或是更低端的汇编语言束缚。基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方面)完全简化位游戏逻辑本身,所有的资源结构都可以由高级语言提供,如Python。我们这个游戏主要就是使用pygame的模块实现。
https://www.pygame.org/news
2.2菜单的实现——使用pygame-menu
Pygame-menu 是一个用于创建菜单和 GUI 的 python-pygame 库。它支持多个小部件,例如按钮、颜色输入、时钟对象、放置选择器、框架、图像、标签、选择器、表格、文本输入、颜色切换等等,并具有多个自定义选项。
https://pygame-menu.readthedocs.io/en/4.2.0/
Pygame-menu提供的功能比较完善了实现也很简单,比如创建主菜单:
main_menu = pygame_menu.Menu('Main Menu', 750, 630, theme=main_theme)
image_path = r"image\logo.png"
# 下面添加自己想要的组件
main_menu.add.image(image_path,scale = (1.2,1.2))
# 按钮也可以添加想要的功能
main_menu.add.button('Level mode', level_mode_menu)
main_menu.add.button('Endless mode', endless_mode_menu)
main_menu.add.button('Heads up mode',heads_up_menu)
main_menu.add.button('Custom mode', custom_mode_menu)
main_menu.add.button('Set up', set_up)
main_menu.add.button('Quit', pygame_menu.events.EXIT)
2.3pygame.sprite的介绍及其使用
参考:https://www.cnblogs.com/liquancai/p/13256388.html
2.3.1 pygame.sprite.Sprite的介绍
pygame.sprite.Sprite 是 pygame 中用来实现精灵的一个类,在使用时并不需要对它实例化,只需要继承它,然后按需写出自己的类,因此非常简单、使用。
当然我们使用它主要是类的成员
1)self.image其负责显示什么图形 就是将此类用一个图片进行显示
2)self.rect其负责在哪里显示 一般来说,先用 self.rect = self.image.get_rect() 来获取 image 的矩形区域,然后给 self.rect 设定显示的位置,比如self.rect.top 、self.rect.bottom 、self.rect.left 、self.rect.right 分别表示上、下、左、右。
2.3.2pygame.sprite.Group的介绍
当程序中有大量实体的时候,操纵这些实体将会是一件相当麻烦的事,而精灵组可以作为一个实体精灵容器将这些精灵放在一起统一管理。pygame 使用精灵组来管理精灵的绘制和更新,精灵组是一个简单的容器。
2.3.3pygame.sprite的使用
函数 功能
pygame.sprite.Group.add 将精灵添加到该组
pygame.sprite.Group.remove 从组中删除精灵
pygame.sprite.spritecollide 在与另一个精灵相交的组中查找精灵。
pygame.sprite.collide_rect 两个精灵之间的碰撞检测,使用矩形。
主要是使用上边的函数,使用精灵组以及添加、删除函数实现批量的精灵的管理,然后实现碰撞检测函数实现碰撞检测等操作。
2.4各个类的介绍
因为主要使用的是面向对象的方法
2.4.1墙体类的介绍
墙体类主要是继承了pygame的精灵类,里面就是包含了类成员image图片和rect它的位置 墙体类其实是统称里面包含砖块类、石头类、树类、河流类、冰川类和基地类
2.4.2地图类的介绍
地图类主要是对墙体类的每个类进行统一的放置,在游戏类中更好的进行地图的绘制
里面包括了draw的方法:就是对列表进行翻译将墙体类装入容器中
checkpoint方法就是进行选择对应的列表进行使用draw的方法进行装入(相当于就是选择关卡的函数)
2.4.3地图建造类的介绍
地图建造类为了实时显示而加入了显示板块,通过将列表传入到Map建造地图显示,然后通过玩家操作改变列表,再传入到Map显示以此循环实现了实时显示。now_x,now_y主要是当前的位置。map_num主要就是列表,保存当前地图信息,如果觉得建造结束,将此列表传入游戏类进行地图显示。
2.4.4子弹类的介绍
子弹类继承了pygame的精灵类,能够实现子弹显示和碰撞检测,然后通过dir_x,dir_y指定移动的方向,speed指定移动的速度,life指定是否显示。
changeImage的方法主要是根据给的方向改变图片来实现子弹方向和移动方向的统一。
move的方法实现根据速度移动和碰撞检测
2.4.5特效类的介绍
特效的实现就是将每一帧图片循环显示以达到动画效果。
特效类主要是将三个特效的每一帧图片保存在列表中,方便下面的方法更好调用图片。
2.4.6道具类的介绍
道具类继承了pygame的精灵类,kind表示道具的种类,rect表示道具的位置,imgae表示道具的图片显示。类里主要是使用随机函数,实现了道具种类和道具位置的随机性。调用change的方法就是将道具种类和位置随机然后并显示到游戏中。
2.4.7我方坦克类的介绍
我方坦克类继承了pygame的精灵类,因为玩家一和玩家二坦克的区别,playerNumber表示玩家几,然后加载不同的图片。dir_x,dir_y表示指向的方向,通过组合子弹类,调用shoot的方法实现子弹的发射。move的方法就是根据方向,改变相应的图片实现方向的转向,并且碰撞检测判断是否能够进行移动。
2.4.8敌方坦克类的介绍
敌方坦克类继承了pygame的精灵类,通过kind(表示等级)、isred(是否携带道具)、rect(位置)、speed(速度)等变量来表示坦克的属性,shoot是子弹发射的方法,move就是坦克移动的方法,内部同样有碰撞检测。
2.4.9游戏类的介绍
该类基本组合或者聚合了基本所有的类 就相当于一个棋盘(其它类相当于棋子,这样游戏就可以开始了)
游戏类有game_running和game_running_singled_out是两个相似的游戏方法,
只需要首先申明类然后调用其中一个方法就可以开始游戏,两个方法的区别就是游戏模式的不同。
其它的方法就是服务于这两个方法的 比如暂停方法,结束方法,检测键盘方法等
游戏基本逻辑就是在循环中,检测事件、检测键盘事件、检测自己定义的函数,刷新界面。
2.5 架构设计和总类图
从总类图中可以看出,墙体类、道具类、子弹类、敌方坦克类、我方坦克类这些都是游戏中的基本元素,它们都继承了pygame的精灵类实现了图片的移动化以及碰撞检测等功能。我方坦克类、敌方坦克类都组合了子弹类(具体看代码)
地图类组合了墙体类实现了地图的创建、地图建造类聚合地图类实现建造地图时的实时显示。最后游戏类组合或者聚合这些元素形成了游戏的运行。
游戏类提供了两个游戏运行的方法,供界面调用最终组成游戏。
3.云端验证
3.1 我采用了云端授权的方式进行对游戏main.py进行验证,验证方式分为:1.本地local验证(此类验证方法不详细阐述,仅开发提供,后续可能会移除)2.云端验证,云端验证采用通过互联网连接来进行验证,云端验证采用访问DCDN(炫讯云计算DCDN)的授权模块插件来实现,为了防止DCDN无法访问的
更多推荐
所有评论(0)