您的位置:首页 > 其它

写一个简单的打飞机游戏(Dos界面)

2017-03-26 15:52 351 查看
首先分析打飞机游戏的要素:

1、计分。

2、是否被敌机碰撞摧毁(被击中未实现。。。)

3、发射子弹。

(因为是一个简化的游戏。。要素很少。。)

思路:将布局采用二维数组,用*号代表玩家,0代表敌机,敌机用rand()函数设定位置。

ps:代码很乱,有很多不应该在Barod类中实现出现的方法,应该放在player类中实现。

Barod提供布局、输出、设置位置、获取位置。

player类提供了判断是否被碰撞,玩家用wasd控制数组上的移动,子弹射击,控制敌机下落速度。

代码如下:

#pragma once
#include<stdlib.h>//使用该头文件中的rand()函数
#include<iostream>
#include <conio.h> //通过控制台输入输出流头文件,调用kbhit()刷新查看是否输入,对控制台进行刷新,
#include <windows.h>
using namespace std;
void gotoxy(int x, int y)  //光标移动到(x,y)位置,从而达到刷新控制台的视觉效果
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}

class Barod {
friend class player;
private:
int high, widgh;
int **barod;
public:
Barod(int x = 15, int y = 25) :high(x), widgh(y)
{
barod = new int*[x];
for (int i = 0; i < x; i++)
barod[i] = new int[y];
for (int i = 0; i < high; i++)
for (int j = 0; j < widgh; j++)
{
barod[i][j] = 0;
}
}
int getx()
{
return high;
}
void setprice(int x,int y,int n)
{
if (n == 1)
barod[x][y] = 1;
else if (n == 0)
barod[x][y] = 0;
else if (n == 2)
barod[x][y] = 2;
else if (n == 3)
barod[x][y] = 3;
else
throw "choose error";
}
int getprice(int x, int y)
{
int temp = 0;
temp=barod[x][y];
return temp;
}
int gety()
{
return widgh;
}
void show()
{
gotoxy(0, 0);
for (int i = 0; i < high; i++)
{
for (int j = 0; j < widgh; j++)
{
switch (barod[i][j])
{
case 0:cout << " ";
break;
case 1:cout << "*";
break;
case 2:cout << "|";
break;
case 3:cout << "O";
default:
break;
}
}
cout << endl;
}
Sleep(20);
}
~Barod()
{
for (int i = 0; i < high; i++)
delete barod[i];
delete[]barod;
}
};

class Player {
private:
Barod brd;
int px, py;
unsigned int sorce;
int dx[3], dy[3];
int dnum;
int Mspeed;
int speed;
public:
Player():px(brd.getx()-1),py((brd.gety()-1)/2),sorce(0),dnum(3),Mspeed(20),speed(0){
brd.setprice(px, py, 1);
for (int i = 0; i < dnum; i++)
{
dx[i] = rand() % 3;
int temp = brd.gety();
dy[i] = rand() % temp;
brd.setprice(dx[i], dy[i], 3);
}
}
void move()
{
if (kbhit())
{
brd.setprice(px, py, 0);
switch (_getch())
{
case 'w':
if (px > 0)
--px;
break;
case 's':
if (px < brd.getx() - 1)
++px;
break;
case'a':
if (py > 0)
--py;
break;
case'd':
if (py < brd.gety() - 1)
++py;
break;
case' ':
brd.setprice(px-1,py,2);
break;
}
brd.setprice(px, py, 1);
}
}

void shot()
{
int i, j, k;
for (i = 0; i<brd.getx(); i++)
{
for (j = 0; j<brd.gety(); j++)
{
if (brd.getprice(i,j) == 2)
{
for (k = 0; k<dnum; k++)
{
if ((i == dx[k]) && (j == dy[k]))
{
sorce++;
dx[k] = rand() % 2;
dy[k] = rand() % (brd.gety()-1);
brd.setprice(dx[k],dy[k],3);
brd.setprice(i, j, 0);
}
}
brd.setprice(i, j, 0);
if (i>0)
brd.setprice(i-1, j, 2);
}
}
}
}
void dfall()
{
if(speed < Mspeed)
speed++;
if (speed == Mspeed)
{
for (int i = 0; i < dnum; i++)
{
brd.setprice(dx[i], dy[i], 0);
if (dx[i] < brd.getx() - 1)
dx[i]++;
speed = 0;
brd.setprice(dx[i], dy[i], 3);
}
}
for (int i = 0; i < dnum; i++)
{
if (lose(dx[i], dy[i]))
{
Sleep(3000);
exit(0);
}
if (dx[i] == brd.getx() - 1)
{
brd.setprice(dx[i], dy[i], 0);
dx[i] = rand() % 2;
dy[i] = rand() % (brd.gety() - 1);
brd.setprice(dx[i], dy[i], 3);
}
}
}
bool lose(int lx,int ly)
{
if (lx == px&&ly == py)
{
cout << "游戏结束" << endl;
return true;
}
return false;
}
void run()
{
while (1)
{
brd.show();
cout << "得分:" << sorce << endl;
shot();
dfall();
move();
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: