C++代码之坦克大战(1)
对坦克大战情有独钟是因为大学时候第一次参加程序设计比赛就做的这个游戏。当时用的语言是Java,那个比赛让我悟出了面向对象的强大之处,我也是从那时开始接触设计模式的。对我而言,坦克大战有着非同寻常的意义,所以一定要带大家用C++实现一下。
坦克大战
我们依然使用EasyX在控制台程序中制作这个游戏程序。这一篇的主要任务是在屏幕上画出一个白色的主战坦克,可以通过方向键控制它的前进方向。效果如下:
下面我们正式开始。
画布类
在这个工程中,我们将EasyX画布相关的功能封装在一个Graphic类中,创建两个文件:Graphic.h和Graphic.cpp。
Graphic.h
#ifndef __GRAPHIC_H__
#define __GRAPHIC_H__
#include <graphics.h>
#define SCREEN_WIDTH 1024
#define SCREEN_HEIGHT 768
class Graphic
{
public:
static void Create;
static void Destroy;
static int GetScreenWidth;
static int GetScreenHeight;
private:
static int m_screen_width;
static int m_screen_height;
};
#endif
Graphic.cpp
#include "Graphic.h"
int Graphic::m_screen_width = SCREEN_WIDTH;
int Graphic::m_screen_height = SCREEN_HEIGHT;
void Graphic::Create
{
initgraph(m_screen_width, m_screen_height);
}
void Graphic::Destroy
{
closegraph;
}
int Graphic::GetScreenWidth
{
return m_screen_width;
}
int Graphic::GetScreenHeight
{
return m_screen_height;
}
这个类使用的是静态成员变量和静态成员函数,要注意静态成员变量的初始化时在类外进行的。通过这个类可以实现创建和销毁画布的功能,还能够让其他代码随时通过这个类拿到画布的尺寸。
坦克抽象类
由于我们的程序是要通过EasyX画在屏幕上,各种元素都需要统一放在可以遍历的数据结构中方便操作,所以我们在实现坦克代码时会用到多态。这里先创建一个坦克的抽象类。新建文件Tank.h,加入下面代码:
所有坦克都需要引用的东西会定义在这个文件中。这里定义了一个枚举类型,表示方向用的。我们的程序只考虑四个方向,如果需要让坦克可以有八个前进方向后面可以在这里扩充其他方向。
坦克抽象类中,我们定义了两个函数,Display和Move大家很熟悉了,在星空项目里用的很多,主要是负责将自己画在屏幕上和移动自己。
属性中m_dir保存坦克的行驶方向,Display和Move都需要使用它。
主战坦克
所谓主战坦克就是玩家控制的坦克,所有的坦克中,只有这个一个是可以控制的。这一点它比较特殊。
创建文件MainTank.h,写入下面代码:
这个类继承了Tank类,在初始化时给各个属性赋初值。我们默认主战坦克一开始在屏幕中间,行驶方向向上,颜色为白色。
我们主战坦克的形状如下:
我们来看看怎么实现它。创建文件MainTank.cpp代码如下:
SetDir
这个很简单,就是修改成员变量的值。通过这个函数能够改变坦克的行驶方向。
DrawTankBody
这个函数负责画坦克的主题部分,一个正方形的坦克身和两个矩形的履带。由于坦克上下行驶和左右行驶形状不同,因此通过一个参数负责绘制不同的形状。
Display
这个是核心的绘制方法,提供给外部调用的。这里主要是两部分工作:
- 判断坦克的行驶方向,之后调用DrawTankBody绘制出坦克身
- 根据行驶方向画上炮管
Move
这个函数每执行一次,坦克向前移动m_step长度。当超出屏幕边沿时,从另一侧重新出现,行驶方向不变。是不是很简单。
键盘事件监听
最后到了我们的主程序了,新建文件main.cpp,加入下面代码:
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
639368839,我们一起学C/C++!