今天我亲自运行了一下,没什么问题,大家可以看一下,按wasd移动,按k发射子弹
代码如下:
#include<windows.h>
#include<iostream>
using namespace std;
typedef struct Frame
{
COORD position[2];
// COORD 是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。
// 其定义为:
// typedef struct _COORD {
// SHORT X;
// SHORT Y;
// } COORD;
int flag;
}Frame;
class Game
{
public:
COORD position[10];
COORD bullet[10];
Frame enemy[8];
int score;
int rank;
int rankf;
string title;
int flag_rank;
// 构造函数
Game();
//初始化所有
void initPlane();
void initBullet();
void initEnemy();
//初始化其中一个
//void initThisBullet( COORD );
//void initThisEnemy( Frame );
void planeMove(char);
void bulletMove();
void enemyMove();
//填充所有
void drawPlane();
void drawPlaneToNull();
void drawBullet();
void drawBulletToNull();
void drawEnemy();
void drawEnemyToNull();
//填充其中一个
void drawThisBulletToNull(COORD);
void drawThisEnemyToNull(Frame);
void Pause();
void Playing();
void judgePlane();
void judgeEnemy();
void Shoot();
void GameOver();
void printScore();
};
void SetPos(COORD a);
void SetPos(int i, int j);
void HideCursor();
void drawRow(int y, int x1, int x2, char ch);
void drawRow(COORD a, COORD b, char ch);
void drawCol(int x, int y1, int y2, char ch);
void drawCol(COORD a, COORD b, char ch);
void drawFrame(COORD a, COORD b, char row, char col);
void drawFrame(int x1, int y1, int x2, int y2, char row, char col);
void drawFrame(Frame frame, char row, char col);
void drawPlaying();
int random(int a, int b);
COORD random(COORD a, COORD b);
bool judgeCoordInFrame(Frame frame, COORD spot);
void printCoord(COORD a);
void printFrameCoord(Frame a);
int drawMenu();
#include<string>
#include<conio.h>
using namespace std;
// 定义构造函数
// 构造函数是特殊的成员函数,只要创建类类型的新对象,都要执行构造函数。
// 构造函数的工作是保证每个对象的数据成员具有合适的初始值。
// 构造函数通常使用构造函数初始化列表来初始化其数据成员,
// 当然,像此处一样,省略初始化列表,并在构造函数的函数体内对数据成员赋值是合法的。
// 注意,构造函数的名字与类的名字相同,并且不能指定返回类型。像其他任何函数一样,
// 它们可以没有形参,也可以定义多个形参。
Game::Game()
{
// 调用类成员函数来进行初始化
initPlane();
initBullet();
initEnemy();
// 初始化四个int型数据成员,采用赋值的方式进行初始化
// string类型的数据成员title没有进行初始化,因为:
// string本身就是一个标准库类类型,它的类定义中设置了默认构造函数,
// 这些默认构造函数会将对象初始化为合理的默认状态,
// string的默认构造函数会产生空字符串,相当于"" 。
score = 0;
rank = 25;
rankf = 0;
flag_rank = 0;
}
// 成员函数既可以定义在类的内部,也可以定义在类的外部。
// 在类外部定义的成员函数必须指明它们是在类的作用域中,例如
// Game::initPlane的定义使用 作用域操作符 来指明这是 Game类中initPlane函数的定义。
// 这是初始化战机位置的成员函数
void Game::initPlane()
{
COORD centren;
centren.X = 39;
centren.Y = 22;
position[0].X = position[5].X = position[7].X = position[9].X = centren.X;
position[1].X = centren.X - 2;
position[2].X = position[6].X = centren.X - 1;
position[3].X = position[8].X = centren.X + 1;
position[4].X = centren.X + 2;
for (int i = 0; i <= 4; i++)
position[i].Y = centren.Y;
for (int i = 6; i <= 8; i++)
position[i].Y = centren.Y + 1;
position[5].Y = centren.Y - 1;
position[9].Y = centren.Y - 2;
// 这个函数体类的代码其实就是为了初始化战机的十个部分的位置,战机的组成如下所示:
// |
// |
// 00000
// 000
// 第一排5个0的坐标依次对应了position[1]position[2]position[0]position[3]position[4]
// 第二排三个0的坐标依次对应了position[6]position[7]position[8]
// 两排0上面的两|的坐标从上往下依次对应了position[5]position[9]
}
// 这是初始化战机外形的成员函数
// 战机的形状组成如下所示:
// |
// |
// 00000
// 000
// 在该函数中调用了SetPos()函数来设置光标的
void Game::drawPlane()
{
for (int i = 0; i<9; i++)
{
SetPos(position[i]);
// 此处调用SetPos()函数将光标设置到了position[i]指定的位置
if (i != 5)
cout << "O";
else if (i == 5)
cout << "|";
}
}
// 这个成员函数通过将战机的每个坐标处输出" "来代替"0"和"|",
// 来达到将战机消除的目的。
void Game::drawPlaneToNull()
{
for (int i = 0; i<9; i++)
{
SetPos(position[i]);
cout << " ";
}
}
// 该成员函数用来初始化子弹,
// 即将每个子弹的Y坐标初始化为30(bullet[i].Y = 30)来表示子弹处于失效状态
void Game::initBullet()
{
for (int i = 0; i<10; i++)
bullet[i].Y =30;
}
// 该成员函数用来画出子弹
// 首先检查每颗子弹的有效性,如果子弹有效,则定位到该子弹的坐标处,输出 "^",表示该子弹,
// 如果子弹是无效的,则不绘制
void Game::drawBullet()
{
for (int i = 0; i<10; i++)
{
if (bullet[i].Y != 30)
{
SetPos(bullet[i]);
cout << "^"