C++/SFML面向对象课程设计,坦克大战

本文详细介绍了使用C++和SFML库重构FC经典游戏《坦克大战》的过程,涵盖需求分析、总体设计方案,包括UML类图、源代码和游戏运行效果。通过Game类协调游戏对象,Control类处理键盘输入,Drawer类负责绘制,GameObject类作为基类,Block类表示地图元素,Player类和Enemy类分别表示玩家和敌人坦克,Bullet类表示子弹,Home类表示基地。游戏遵循原版规则,提供丰富的交互体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 设计任务及需求分析

《坦克大战》是由日本南梦宫Namco游戏公司开发的一款平面射击游戏,于1985年发售。游戏以坦克战斗及保卫基地为主题,属于策略型联机类。以二战坦克为题材,既保留了射击类游戏的操作性,也改进了射击类游戏太过于复杂难玩的高门槛特点,集休闲与竞技于一身。
使用第三方图形库SFML还原FC经典坦克大战,用13*13的方块组成游戏地图,地形包括空气,钢板,砖墙,实现原版坦克大战中坦克行走,坦克与墙壁之间碰撞,坦克发射子弹,敌军生成,敌军随机走动,子弹与实体之间互动,游戏键盘操作,游戏结束界面
游戏操作,WASD控制玩家坦克上下左右移动,J发射子弹

二、总体设计方案

用Game类作为中介类,内存有所有游戏对象的指针,而每个游戏对象都有Game类的指针,用于不同游戏模块之间的通信,Game类又负责了整个游戏的运行(Run()成员函数用于处理每一帧的要处理的事件,PushEvent将每个要处理的键盘事件交给Control对象处理)

Control类用于处理键盘输入信息,使得游戏对象对于每个得到的事件做出相应的反应,例如WASD改变玩家的转向以及移动

Drawer类用于绘制所有地图中的游戏对象,控制绘制顺序

GameObject类作为所有游戏对象的父类,内涵纹理以及纹理对象的属性,以及纯虚函数Draw()接口

Block类作为所有方块对象的父类,内含枚举类型方块种类BlockType,WallBlock构造函数为BlockType赋值,其他方块同理
Map类是Block类的聚合,构造函数为其初始化每个方块的位置,用字符串数组来快速编辑地图方块布局,setLostMap()为设置游戏结束之后地图显示的界面

Player类内含speed,isDead,isMoving, direction属性,
Move()方法:按照direction方向以speed速度运动,每次运动判断是否与所有游戏对象发生碰撞,若碰撞退回去且不再运动
Turn(Direction dir)方法:设置运动方向,贴图旋转

Enemy类内含静态属性StartPos设置每次生成位置,属性sf::Clock计时器用于控制每个敌方坦克的发射子弹的时间

Bullet抽象类内含speed,isDead属性,Move方法每次运动都会去判断是否有碰撞到游戏对象,若发生碰撞,则设置Bullet和该对“死亡”,在game->Run()中将其清除,PlayerBullet实现了Move函数,EnemyBullet实现了Move函数

Home类为游戏中基地对象,若isDead属性为True则游戏结束

UML 类图
Game
+Player* player
+list<Enemy*> enemyList
+Map* map
+list<Bullet*> bulletList
+Control* control
+Drawer* draw
+Home* home
+RenderWindow* window
+Run()
+PullEvent(sf::RenderWindow window)
+Over()
Control
+Game* game
+Control(Game* game)
+Input(sf::Event event)
Drawer
+Game* game
+Drawer(Game* game)
+DrawAll()
Player
+bool isMoving
+Direction dir
+float speed
+Move()
+Turn(Direction dir)
+Draw()
Enemy
+Game* game
_int remain
_StartPos pos
+Clock clock
+float speed
+bool isDead
+Enemy(Game* game)
+Draw()
+Move()
+Shoot()
«interface»
Bullet
+Game* game
+float speed
+bool isDead
+Bullet(Game* game, Direction dir)
+Move()
+Draw()
PlayerBullet
+PlayerBullet(Game* game, Direction dir)
+Move()
EnemyBullet
+EnemyBullet(Game* game, Direction dir)
+Move()
Home
+Game* game
+bool isDead
+Home(Game* game)
+Draw()
Map
+Game* game
+vector<vector> Block2D
+Map(Game* game)
+Draw()
+setLostMap()
«interface»
Block
+Game* game
+Draw()
+setPostion()
WallBlock
+WallBlock(Game* game)
+Draw()
IronBlock
+IronBlock(Game* game)
+Draw()
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值