1.游戏编写的基本思路:
**0.建立x,y轴:**横向表示y轴,纵向表示x轴,零点在左上角。
定义飞机的位置为position_x, position_y,按下“WASD”分别使position_x, position_y的值增大或减小以实现飞机移动。
定义子弹的位置为bullet_x, bullet_y,定义敌机位置enemy_x, enemy_y,定义得分score,定义等级level,定义难度hard。
利用gotoxy函数防止屏幕闪烁,利用HideCursor()函数隐藏光标,使画面平静,防止闪烁。
(主函数中调用了5个函数)
**1.startshow():**显示开始界面。其中包含了对游戏操作的说明。
**2.startup():**数据初始化。定义了游戏界面x轴为18,y轴为30,飞机的初始位置、子弹和敌机的位置、分数、等级、难度的初始化。
然后在while(分数>=0)中的循环里包含了以下3个函数。
*3.show():显示画面。调用gotoxy(0,0),使光标移动到原点位置,以下重画清屏。输出飞机“”,输出子弹“o”,输出敌机“@”,并输出显示分数、等级等信息。
**4.updateWithoutInput():**与用户输入无关的更新。关于一些自动更新。当飞机的位置与敌机的位置重合时,分数减1,敌机纵坐标为0,横坐标在界面内随机出现,飞机位置更新到界面中间。分数减至负数,则游戏失败,并停止游戏。当子弹的位置和敌机的位置重合时,则分数加1,敌机纵坐标为0,横坐标在界面内随机出现。每当分数达到10的倍数,则游戏等级加1,游戏难度增加,即敌机下降速度加快,等级增加到6级,游戏胜利,并停止游戏。
**5.updateWithInput():**与用户输入有关的更新。关于用户输入信息的更新。分别按“WASD”控制飞机的移动,并控制飞机只能在规定界面内移动,防止玩家操控飞机飞出边界。按“空格键”输出子弹。按“ESC”暂停游戏。按“任意键”继续游戏。
2.源代码
#include<iostream>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
using namespace std;
//函数外全局变量定义
int position_x, position_y; //飞机位置
int bullet_x, bullet_y; //子弹位置
int high, width; //游戏的画面尺寸
int enemy_x, enemy_y; //敌机位置
int score; //游戏得分
int level; //游戏等级
int hard; //游戏难度
void HideCursor() //隐藏光标
{
CONSOLE_CURSOR_INFO cursor_info = { 1,0 }; //第二个值为0表示隐藏光标
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
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);
}
void startshow()
{
char defence[18][30] = {}; //边框
for (int k = 0; k < 18; k++)
{
defence[k][0] = '*';
defence[k][29] = '*';
for (int l = 0; l < 30; l++)
{
if (k == 0 || k == 17)
{
defence[k][l] = '*';
}
}
}
for (int k = 0; k < 18; k++)
{
for (int l = 0; l < 30; l++)
{
cout << " " << defence[k][l];
}
cout << endl;
}
gotoxy(0, 0); //将光标移动到原点
for (int i = 0; i < 7; i++)
cout << '\n';
for (int i = 0; i < 13; i++)
cout << " ";
cout << "Welcome!" << endl;
for (int i = 0; i < 13; i++)
cout << " ";
cout << "Press 'W' 'A' 'S' 'D' to move around!" << endl;
for (int i = 0; i < 13; i++)
cout << " ";
cout << "Press 'Spacekey' to attack!" << endl;
for (int i = 0; i < 13; i++)
cout << " ";
cout << "Press 'Enter' to start!" << endl;
for (int i = 0; i < 13; i++)
cout << " ";
cout << "By 全栈攻城师." << endl;
gotoxy(0, 0); //将光标移动到原点
for (int i = 0; i < 7; i++)
cout << '\n';
cout << " *" << endl << " *" << endl << " *" << endl << " *" << endl << " *" << endl;
cin.get();
system("cls");
return;
}
void startup() //数据初始化
{
high = 18;
width = 30;
position_x = high / 2;
position_y = width / 2;
bullet_x = -1;
bullet_y = position_y;
enemy_x = 0;
enemy_y = width / 2;
score = 1;
level = 1;
hard = 20;
HideCursor(); //隐藏光标
}
void show() //显示画面
{
int i, j;
gotoxy(0, 0); //光标移动到原点位置,以下重画清屏
for (i = 0; i < high; i++)
{
for (j = 0; j < width; j++)
{
if ((i == position_x) && (j == position_y))
cout << "***";//输出飞机
else if ((i == bullet_x) && (j == bullet_y))
cout << "o"; //输出子弹
else if ((i == enemy_x) && (j == enemy_y))
cout << "@"; //输出敌机
else
cout << " "; //输出空格
}
cout << '\n';
}
cout << "Score:" << score - 1 << endl;
cout << "Level:" << level << endl;
cout << "By 全栈攻城师." << endl;
}
void updateWithoutInput() //与用户输入无关的更新
{
if ((bullet_x == enemy_x) && (bullet_y == enemy_y))
{
score++;
enemy_x = 0;
enemy_y = rand() % width;
bullet_x = -1;
}
if ((enemy_x == position_x) && (enemy_y == position_y)||
(enemy_x == position_x) && (enemy_y == position_y + 1)|| (enemy_x == position_x) && (enemy_y == position_y + 2))
{
score--;
enemy_x = 0;
enemy_y = rand() % width;
position_x = high / 2;
position_y = width / 2;
}
if (score % 10 == 0 && score != 0)
{
level++;
if (hard > 0)
hard -= 5;
score++;
}
static int speed = 0;
if (speed < hard) //使敌机下落速度变慢
speed++;
if (bullet_x > -1)
bullet_x--;
if (enemy_x > high)
{
enemy_x = 0;
enemy_y = rand() % (width-4);
score--;
}
else
{
if (speed == hard)
{
enemy_x++;
speed = 0;
}
}
}
void updateWithInput() //与用户输入有关的更新
{
char input;
if (_kbhit()) //当按键时执行
{
input = _getch();
if (input == 'a'&& position_y > 0)
position_y--;
if (input == 'd'&& position_y < 27)
position_y++;
if (input == 'w'&& position_x > 0)
position_x--;
if (input == 's'&& position_x < 17)
position_x++;
if (input == ' ')
{
bullet_x = position_x - 1;
bullet_y = position_y + 1;
}
if (input == 27) //按esc暂停游戏,按任意键继续游戏
system("pause");
}
}
int main()
{
startshow(); //开始界面
startup(); //数据初始化
while ((score-1) >= 0) //游戏循环执行
{
show();
updateWithoutInput();
updateWithInput();
if (level == 6)
break;
}
system("cls");
if (level == 6) //等级达到6级则胜利
{
for (int i = 0; i < 13; i++)
cout << " ";
cout << "Victory!" << endl;
}
else
{
for (int i = 0; i < 13; i++)
cout << " ";
cout << "Defeat!" << endl;
}
system("pause");
}
3.程序测试用例:
开始界面:
游戏界面:
4.注意:
刚开始用system(“cls”)进行清屏,会发现屏幕闪烁严重,后来用gotoxy函数防止屏幕闪烁,并利用HideCursor()函数隐藏光标,使画面平静,防止闪烁。