操作說明:W,S,A,D分別代表上下左右,方向鍵也能控制左右;空格鍵代表開火,當子彈擊中靶子,即銷燬靶子,然後在隨機位置產生新的靶子。
#include <iostream>
#include <conio.h>
#include <time.h>
#include<stdlib.h>
using namespace std;
const int N = 23;
const int M = 60;
//地圖邊界
char map[N][M];//地圖數組
void delayed(int n)//延時函數
{
for(int i = 0; i < n ; i++)
for(int j = 0; j < 10240; j++)
;
}
void print()//打印二維數組map
{
for(int i = 0; i < N; i++)
{
for(int j = 0; j < M; j++)
cout << map[i][j];
cout << endl;
}
}
//產生靶子函數
void target(int &isKilled,int &t)
{
if(isKilled)//isKilled爲真,則靶子已被擊毀,則需產生新的靶子
{
//隨機產生靶子
srand((unsigned)time(NULL));//隨機數種子
t = rand() % (M - 3) + 3; //產生隨機數函數
isKilled = 0;//已經產生靶子,isKilled爲假
}
map[1][t] = '@';//靶子位置
}
void Fly(int &x,int &y)
{
//畫飛機形狀,開心怎麼畫就怎麼畫
map[x][y] = 'A';//飛機頭
for(int i = y-2;i < y+3;i++)
map[x+1][i] = 'A';
map[x+2][y-1] = 'I';
map[x+2][y+1] = 'I';
}
void Key(int &x,int &y,int &isFire)
{
char input;
if(kbhit())//有按鍵按下
{
input = getch();
if(input == 'a' || input == 75)//75是左移鍵盤值,a鍵也是左移
if(y > 2 )//邊界
y--;
if(input == 'd' || input == 77)
if(y < M - 3)
y++;
if(input == 'w' || input == 72)
if(x > 2 )
x--;
if(input == 's' || input == 80)
if(x < N - 3)
x++;
if(input == ' ')//空格代表開火
isFire = 1;
}
}
void init()//初始化地圖
{
for(int i = 0; i < N; i++)
{
for(int j = 0; j < M; j++)
if(i == 0 || i == N - 1 || j == 0 || j == M - 1)
map[i][j] = '#';//邊界
else
map[i][j] = ' ';//中間
}
}
//攻擊靶子函數
void Fire(int t,int x,int y,int &isFire,int &isKilled)
{
if(isFire)//爲真即開火
{
for(int i = 1; i < x ; i++ )//從飛機頭到靶子
map[i][y] = 'o';//子彈
if(y == t)//飛機頭與靶子在同一直線
isKilled = 1;//靶子被擊毀
isFire = 0;//停火
}
}
int main()
{
int iskilled = 1;//標記靶子狀態
int isFire = 0;//開火標記
int x = N - 4, y = 10;//飛機頭初始位置
int t = 10;//靶子位置標記
while(1)
{
system("cls");//清屏函數
init();//初始化地圖
target(iskilled,t);//產生靶子函數
Key(x,y,isFire);//獲取鍵值函數
Fly(x,y);//畫飛機函數
Fire(t,x,y,isFire,iskilled);//攻擊靶子函數
print();//打印函數
delayed(1000);//延時函數
}
return 0;
}