游戏说明:能够通过上下左右来控制飞机的位置,按空格建能够发射子弹,敌机随机生成并从顶端下落,若子弹击中飞机,那么子弹和飞机一起消失,若敌机与我方飞船碰撞或到达地面,则life减一,击中敌机三次后,敌机速度会提高;
可玩性不高,因为用清屏函数做的闪屏太厉害
主要是easyx还没整明白…
是跟网课一老师学的,老师用c写的,我用了c++不过我也没改动太多,在原有的基础上增加了随机下落,生命值,速度等级什么的
实验运行图如下:(@是敌机*是我方飞船哈)
以下是游戏的大框架
#include<iostream>
#include <conio.h>
#include <cstdlib>
#include <ctime>
int main()
{
startup(); //确定一堆初始值
while (true)
{
show(); //显示屏幕
updatewithoutinput(); //该函数是指在没有键盘输入时要做的
updatewithinput(); //该函数时有键盘输入时要做的
if (speed_level <= 0) //速度等级降为0时,胜利,游戏结束
{
cout << "win" << endl;
break;
}
if (life == 0) //生命值为0时,失败,游戏结束
{
cout << "lose" << endl;
break;
}
}
cout << "******game over*****" << endl;
return 0;
}
首先第一步要写的时显示屏幕函数
大部分函数都是定义成了全局变量,并且在startup函数里定义了初值,不然要传的参数也太多了摔
void show()//显示画面
{
//system("cls");
int i, j;
for (i = 0; i <= high; i++) //high是屏幕高度
{
for (j = 0; j <= width; j++)//width是屏幕宽度
{
if (i == position_x && j == position_y) //position_x ,position_y分别是飞船的对应屏幕的高和长(应该刚好是yx坐标了)
cout << '*';
else if (i == bullet_x && j == bullet_y)
//bullet_x bullet_y分别是子弹的对应屏幕的高和长
cout << '|';
else if (i == target_x && j == target_y)
//target_x target_y分别是敌机的对应屏幕的高和长
cout << '@';
else if (i == high) //输出边界
cout << '#';
else if (j==width)
cout << '#';
else
cout << ' ';
}
cout << endl;
}
cout << "score:" << score << " life:"<<life<<endl;
cout << "speed_level:" << speed_level << " speed:" << speed << endl;
}
如果运行上面的代码看到的应该是刷屏的屏幕框框
所以要引入清屏函数system(“cls”);
位置是放在show函数的第一行
加上了以后应该就会看到静止的飞船敌机边框 还有一堆数据(其实是闪烁的 )
哦对 别忘了给他们都附上初始值,不然肯定编译都过不了,大家这个自己看着来,下面是我的初值,下面这个函数要放在上面那个上面,要不然就提前声明,并且这些变量都定义了全局变量
void startup()
{
high = 15; //屏幕高度
width = 20; //屏幕宽度
position_x = high - 1; //飞船把他放在最后一行中间
position_y = width / 2;
bullet_x = -1; //子弹在隐藏
bullet_y = position_y; //横坐标应该和飞船一致
target_x = 0;
target_y = rand() % width; //随机生成敌机
}
我们按键盘是控制上下左右和发射子弹的,那么这些步骤我们就要写在updatewithinput()函数中
void updatewithinput()
{
char ch;
if (_kbhit()) //按键时(_kbhit函数可以检测键盘是否有动静)
{
ch = _getch(); //_getch函数可以不需要按回车就知道你按的什么值
//这里是通过按awsd控制上下左右,当然还可以把大写的也加上,上下左右箭头也加上,很容易,当然也可以用一个switch语句来写
if (ch == 'a')
position_y--;
if (ch == 'd')
position_y++;
if (ch == 'w')
position_x--;
if (ch == 's')
position_x++;
if (ch == ' ') //发射子弹时我们要重新规定一下子弹的横纵坐标
{
bullet_x = position_x - 1;
bullet_y = position_y;
}
}
}
现在运行一下会发现飞船已经可以上下左右移动了,但是发射的子弹发射不出去啊,并且敌机也没有下降,因为这些动作都是在没有按键的时候进行的。所以我们现在要写的是我们最后一个函数
void updatewithoutinput()
{
if(bullet_x>-1) //若未隐藏子弹,子弹要一直向上
bullet_x--;
/* 速度#1 */
if (bullet_x == target_x && bullet_y == target_y) //击中
{
bullet_x = -1; //隐藏子弹
target_x = 0; //重新生成敌机
target_y = rand() % width;
/*速度#2*/
}
if (position_x == target_x && position_y == target_y||target_x==high-1) //如果敌机和飞船相遇,或者是敌机降落
{
life--;
target_x = 0;
target_y = rand() % width; //生命值减一并且在随机生成一个敌机
}
}
如果现在运行的话,子弹已经可以发射了,击中敌机也会换一台,但是我们会发现敌机没有下落啊,是因为下落的太快了 我就把它和下面的调节速度写在一起了。
/*速度#1*/
if(speed < speed_level)//让函数循环speed_level次后在进行一步动作,也就是该动作放慢了这么多倍
speed++;
if (speed == speed_level)
{
if (target_x < high) //飞船下落
{
target_x++;
}
else //若触底则重新生成
{
target_x = 0;
target_y = rand() % width;
}
speed = 0; //重设speed值,让循环重来
}
/*速度#2*/
score++; //射中多一个飞船
if (score % 3 == 0) //射中三个等级提高,速度循环次数少一点,也就是更快一点
{
level++;
speed_level -= 1;
}
至此该游戏已经完成,一般操作都可以进行,温馨提示不要忘记设初值~
下面是完整代码废话比较多写了150行叭
是在VS2019上运行的
#include<iostream>
#include <conio.h>
#include <cstdlib>
#include <ctime>
using namespace std;
int high;
int width ;
int target_y ;
int target_x ;
int position_x ;
int position_y;
int bullet_x;
int bullet_y;
int score;
int level;
int speed=0;
int speed_level=9;
int life = 3;
void startup()
{
high = 15;
width = 20;
target_y = 4;
target_x = 0;
position_x = high - 1;
position_y = width / 2;
bullet_x = -1;
bullet_y = position_y;
target_x = 0;
target_y = rand() % width;
score = 0;
level = 0;
}
void show()//显示画面
{
system("cls");
int i, j;
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 << '|';
else if (i == target_x && j == target_y)
cout << '@';
else if (i == high)
cout << '#';
else if (j==width)
cout << '#';
else
cout << ' ';
}
cout << endl;
}
cout << "score:" << score << " life:"<<life<<endl;
cout << "speed_level:" << speed_level << " speed:" << speed << endl;
}
void updatewithoutinput()
{
if(bullet_x>-1)
bullet_x--;
if(speed < speed_level)
speed++;
if (speed == speed_level)
{
if (target_x < high)
{
target_x++;
}
else
{
target_x = 0;
target_y = rand() % width;
}
speed = 0;
}
if (bullet_x == target_x && bullet_y == target_y)//击中
{
bullet_x = -1;
target_x = 0;
target_y = rand() % width;
score++;
if (score % 3 == 0)
{
level++;
speed_level -= 1;
}
}
if (position_x == target_x && position_y == target_y||target_x==high-1)
{
life--;
target_x = 0;
target_y = rand() % width;
}
}
void updatewithinput()
{
char ch;
if (_kbhit())//按键时
{
ch = _getch();
if (ch == 'a')
position_y--;
if (ch == 'd')
position_y++;
if (ch == 'w')
position_x--;
if (ch == 's')
position_x++;
if (ch == ' ')
{
bullet_x = position_x - 1;
bullet_y = position_y;
}
}
}
int main()
{
startup();
while (true)
{
show();
updatewithoutinput();
updatewithinput();
if (speed_level <= 0)
{
cout << "win" << endl;
break;
}
if (life == 0)
{
cout << "lose" << endl;
break;
}
}
cout << "******game over*****" << endl;
return 0;
}