1
已解决
王梓澳
中级光能
中级光能
游戏代码:
#include <bits/stdc++.h>
#include <windows.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)//判断键盘是否按下函数定义
using namespace std;
struct player {//玩家结构体(以后可能会有多个玩家,所以定义成这样)
int x,y,life,rem;//每个玩家的坐标,生命,子弹剩余
}soldier;//玩家
struct bullet {//子弹结构体
int x,y,di;//子弹的当前坐标和子弹方向
}fbullet[100000];//子弹数组
int bulletSleep;//控制子弹发射速度
int bucount=1;//子弹数量
int cnt;//得分
int enSleep;//控制敌人的移动速度
int ChangeSleep;//控制换弹时间
int clip;//弹夹中剩余的子弹
bool fclip;//标记弹夹是否为空(1为空,0为不空)
bool fc;//判断弹夹是否填充
struct en {//敌人结构体
int x,y;//敌人的坐标
}fen[10];//一共10*10,设置了10个敌人
char Map[200][200];//地图
bool f1,f2;
void out(string a) {//延时输出(暂时没有用到,以后写介绍会有
for (int i=0;i<a.size();i++) {
cout<<a[i];
Sleep(50);
}
}
void color(int a) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void SetPos(COORD a)
{
HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(out, a);
}
void SetPos(int i, int j)
{
COORD pos={i, j};
SetPos(pos);
}
void init() {//地图初始化函数
memset(Map,' ',sizeof(Map));//将地图初始化为空格更容易看见玩家和敌人
}
void in_con() {
f1=true;
system("cls");
out("本游戏控制主要分为两块\n");
cout<<" ";
out("1、玩家人物控制\n");
cout<<" ";
out("玩家在游戏中字符表示为1,通过w(上)s(下)a(左)d(右)控制1上下左右移动\n");
cout<<" ";
out("2、发射子弹控制\n");
cout<<" ";
out("本游戏接近于射击游戏,所以你可以在游戏中发射子弹,通过i(上)k(下)l(右)j(左)控制子弹发射方向\n");
out("如果中途你想要暂停游戏,您可以按下x键\n");
out("按下k跳出本轮介绍");
while (!KEY_DOWN('K'));
}
void in_cont() {
f1=true;
system("cls");
out("本游戏为射击游戏,所以游戏主要分为3个部分\n");
out("开始后你可能会看见:\n");
init();
Map[9][9]='1';
for (int i=1;i<=8;i++) Map[i][9]='0';
for (int i=1;i<=9;i++) Map[rand()%19][rand()%19]='U';
cout<<"________________________________________\n";//输出游戏边界
for (int i=1;i<=20;i++) {
cout<<"|";//输出边界
for (int j=1;j<20;j++) {
if (Map[i][j]=='U') color(64);//将敌人设成红色
if (Map[i][j]=='1') color(2);//将本人设置绿色
if (Map[i][j]=='0') color(14);//将子弹设置成黄色
cout<<Map[i][j];
color(7);//恢复
}//输出地图(由于子弹遇到边界目前会卡在边界上,所以少输出头尾
cout<<"|";//输出边界
if (i==1) cout<<"剩余生命:"<<soldier.life<<" |"<<endl;
else if (i==2) cout<<"得分 :"<<setw(8)<<cnt<<"分 |"<<endl;
else if (i==3) cout<<setw(3)<<clip<<"/无穷大 |"<<endl;
else if (i==4&&fclip) cout<<" 换弹中... |"<<endl;
else if (i==5&&fclip) cout<<"剩余:0."<<10-ChangeSleep<<"秒 |"<<endl;
else cout<<" |"<<endl;
}
cout<<"_______________________________________\n";//输出游戏边界
out("左边单独框出来的是游戏地图,地图上有3种符号,1,u,0\n");
out("其中1代表玩家,0代表子弹,u代表敌人,具体如何操作,请看操作介绍\n");
out("你的目标就是控制1打u获得得分\n");
out("游戏中会有子弹限制,初始会给出1000发子弹,游戏中会有商城设置,目前里面可以购买生命和子弹,以积分作为货币,避免子弹不够的情况\n");
out("按下k跳出本轮介绍");
while (!KEY_DOWN('K'));
}
void in_wri() {
f1=true;
system("cls");
out("作者姓名:保密\n");
out("作者年龄:觉得会告诉你吗\n");
out("作者身高:165cm左右\n");
out("作者编写游戏时间:2个月左右\n");
out("就这么多,剩下的去qq里面看看\n");
out("按下k跳出本轮介绍");
while (!KEY_DOWN('K'));
}
void introduce() {
bool f=0;
f2=true;
while (true) {
system("cls");
if (f) {
cout<<"您对游戏的那些部分需要查看介绍:\n";
cout<<"1、控制介绍(按下u)\n";
cout<<"2、内容介绍(按下i)\n";
cout<<"3、作者介绍(按下o)\n";
cout<<"按下K开始游戏";
}
if (!f) {
out("您对游戏的那些部分需要查看介绍:\n");
out("1、控制介绍(按下u)\n");
out("2、内容介绍(按下i)\n");
out("3、作者介绍(按下o)\n");
out("按下U开始游戏");
f=1;
}
while (true) {
f1=false;
if (KEY_DOWN('U')) in_con();
if (KEY_DOWN('I')) in_cont();
if (KEY_DOWN('O')) in_wri();
if (KEY_DOWN('U')) return ;
if (f1) break;
}
}
}
void Opening() {
out("你是谁:\n");
cout<<" ";
out("第一次玩这个游戏的新人(请按下k查看游戏介绍)\n");
cout<<" ";
out("多次玩的老玩家(按下u直接开始游戏)");
while (true) {
if (KEY_DOWN('K')) break;
if (KEY_DOWN('U')) return ;
}
system("cls");
out("你好呀,欢迎玩这个游戏!\n");
out("这比起网络上面哪些大游戏可能有些简陋,bug比较多,但体谅一下作者,毕竟没写什么游戏,这是作者的第一个动态游戏,请多多体谅啊\n");
out("如果你的c++代码水平(此程序语言为c++)比较高,可以联系作者,帮助修复bug。\n");
out("废话不说了,开始正题!");
out("按下k继续");
while (!KEY_DOWN('K'));
system("cls");
out("游戏名字:打击敌人");
cout<<"(作者还没想好,暂时就这个难听的吧)\n";
out("作者大大:Jack Sparrow(QQ:2256449902)\n");
out("游戏版本:1.0");
cout<<"(第一个版本)\n";
out("如果你玩过此游戏,可以跳过游戏介绍\n");
out("1、按下w,跳过游戏介绍\n");
out("2、按下s,看游戏介绍");
while (true) {
if (KEY_DOWN('W')) return ;
if (KEY_DOWN('S')) introduce();
if (f2) return ;
}
}
void control() {//控制函数
if (KEY_DOWN('W')&&soldier.x-1>=0) soldier.x--;
if (KEY_DOWN('S')&&soldier.x+1<=20) soldier.x++;
if (KEY_DOWN('A')&&soldier.y-1>=0) soldier.y--;
if (KEY_DOWN('D')&&soldier.y+1<20) soldier.y++;
}
void fire() {//发射子弹函数
int buco=0;
if (KEY_DOWN('K')) {
while (fbullet[++buco].di!=0);//重复利用数组,以下同理
if (buco>=bucount) bucount++;
fbullet[buco].di=1;
clip--;
}
if (KEY_DOWN('J')) {
while (fbullet[++buco].di!=0);
if (buco>=bucount) bucount++;
fbullet[bucount].di=2;
clip--;
}
if (KEY_DOWN('L')) {
while (fbullet[++buco].di!=0);
if (buco>=bucount) bucount++;
fbullet[bucount].di=3;
clip--;
}
if (KEY_DOWN('I')) {
while (fbullet[++buco].di!=0);
if (buco>=bucount) bucount++;
fbullet[buco].di=4;
clip--;
}
fbullet[buco].x=soldier.x;
fbullet[buco].y=soldier.y;
}
void en_move() {//敌人移动函数
if (enSleep==2) {//控制敌人移动速度
for (int i=1;i<=9;i++) {
if (fen[i].x+1<=21)//如果下一步未出界,那么移动
fen[i].x++;
if (Map[fen[i].x][fen[i].y]=='1') {//如果敌人碰到玩家
soldier.life--;
if (soldier.life==0) {
system("cls");
out("Game Over!");
Sleep(1000);
system("cls");
out("你目前的得分为:");
cout<<cnt;
out("分");
system("cls");
out("是否重新开始游戏?\nYes(y)No(n)");
while (true) {
if (KEY_DOWN('N')) exit(0);
if (KEY_DOWN('Y')) {
cnt=0;
soldier.x=9,soldier.y=9;//玩家初始坐标
for (int i=1;i<=9;i++) {//生成第一波敌人(目前只是会从上面生成,以后会从四面生成
fen[i].x=0;
fen[i].y=rand()%19;
}
bucount=0;
break;
}
}
}
}
if (fen[i].x==21) {//如果到界限,那么重新生成
fen[i].x=0;
fen[i].y=rand()%19;
}
}
enSleep=0;
}
}
void bullet_move() {//子弹移动函数
if (bulletSleep==2) {//控制子弹飞行速度(与敌人速度一致,否则会出现假子弹)
bulletSleep=0;
for (int i=1;i<=bucount;i++) {//遍历每一个子弹
if (fbullet[i].di==1&&fbullet[i].x+1<=21) fbullet[i].x++;
if (fbullet[i].di==2&&fbullet[i].y-1>=0) fbullet[i].y--;
if (fbullet[i].di==3&&fbullet[i].y+1<=21) fbullet[i].y++;
if (fbullet[i].di==4&&fbullet[i].x-1>=0) fbullet[i].x--;
if (fbullet[i].x==21||fbullet[i].y==0||fbullet[i].y==21||fbullet[i].x==0)
fbullet[i].di=0;
if (Map[fbullet[i].x][fbullet[i].y]=='U') {//如果当前子弹击中敌人
cnt++;//得分累加
for (int j=1;j<=9;j++) {//查出是哪一个敌人被击中
if (fen[j].x==fbullet[i].x&&fen[j].y==fbullet[i].y) {//找到当前敌人并重新生成
fen[j].x=0;
fen[j].y=rand()%19;
break;
}
}
fbullet[i].x=0;//将子弹放在0,0处(此处不会输出)
fbullet[i].y=0;
fbullet[i].di=0;//以后方便重复利用数组
}
}
}
}
void shop() {
bool f=false;
while (true) {
system("cls");
if (!f) {
out("欢迎来到商店,您可以买如下物品:\n");
cout<<" ";out("1、一条命(上限不能超过9,否则多余部分直接舍去)售价100分,按下p购买\n");
cout<<" ";out("2、500发子弹 售价50分,按下o购买\n");
cout<<"退出商店按下k";
f=true;
}
else {
cout<<"欢迎来到商店,您可以买如下物品:\n";
cout<<" 1、一条命(上限不能超过9,否则多余部分直接舍去)售价100分,按下p购买\n";
cout<<" 2、700发子弹 售价10分,按下o购买\n";
cout<<"退出商店按下k";
}
while (true) {
if (KEY_DOWN('P')) {
if (cnt<100) {
system("cls");
cout<<"积分不够!";
}
if (cnt>=100) {
system("cls");
cnt-=100;
soldier.life++;
soldier.life%=10;
cout<<"购买成功!\n";
cout<<"您现在有"<<soldier.life<<"条生命\n";
cout<<"您还有"<<cnt<<"分\n";
}
out("按下k继续");
while (!KEY_DOWN('K'));
break;
}
if (KEY_DOWN('O')) {
if (cnt<10) {
system("cls");
cout<<"积分不够!";
}
if (cnt>=10) {
system("cls");
cnt-=10;
soldier.rem+=700;
cout<<"购买成功!\n";
cout<<"您现在有"<<soldier.rem<<"发子弹";
cout<<"您还有"<<cnt<<"分\n";
}
out("按下k继续");
while (!KEY_DOWN('K'));
break;
}
if (KEY_DOWN('K')) return ;
}
}
}
int main () {
soldier.x=9,soldier.y=9,soldier.life=9,soldier.rem=1000;//玩家初始坐标
clip=100;
ChangeSleep=10;
for (int i=1;i<=9;i++) {//生成第一波敌人(目前只是会从上面生成,以后会从四面生成
fen[i].x=0;
fen[i].y=rand()%19;
}
Opening();
while (true) {
bulletSleep++;
enSleep++;//控制时间
if (KEY_DOWN('X')) {
SetPos(26,6);
cout<<"暂停中!";
Sleep(1000);
while (!KEY_DOWN('X'));
}
system("cls");//清屏使其动态
if (KEY_DOWN('P')) shop();
// for (int i=1;i<=bucount;i++)
// cout<<fbullet[i].x<<' '<<fbullet[i].y<<" "<<fbullet[i].di<<endl;
init();
control();
if (ChangeSleep==10) {
if (fc==0) {
clip=100;
if (soldier.rem>=100) soldier.rem-=100;
else clip=soldier.rem,soldier.rem=0;
fc=1;
}
fclip=0;
fire();
}
if (clip==0&&fclip==0) ChangeSleep=0,fclip=1,fc=0;
if (fclip) ChangeSleep++;
Map[soldier.x][soldier.y]='1';//将玩家生成在屏幕上
en_move();
for (int i=1;i<=9;i++)//将敌人生成在屏幕上(后面子弹判断需要)
Map[fen[i].x][fen[i].y]='U';
bullet_move();
for (int i=1;i<=bucount;i++)//将子弹生成在屏幕上
Map[fbullet[i].x][fbullet[i].y]='0';
Map[soldier.x][soldier.y]='1';//将玩家生成在屏幕上
cout<<"________________________________________\n";//输出游戏边界
for (int i=1;i<=20;i++) {
cout<<"|";//输出边界
for (int j=1;j<20;j++) {
if (Map[i][j]=='U') color(64);//将敌人设成红色
if (Map[i][j]=='1') color(2);//将本人设置绿色
if (Map[i][j]=='0') color(14);//将子弹设置成黄色
cout<<Map[i][j];
color(7);//恢复
}//输出地图(由于子弹遇到边界目前会卡在边界上,所以少输出头尾
cout<<"|";//输出边界
if (i==1) cout<<"剩余生命:"<<setw(2)<<soldier.life<<" |"<<endl;
else if (i==2) cout<<"得分 :"<<setw(8)<<cnt<<"分 |"<<endl;
else if (i==3) cout<<setw(3)<<clip<<setw(6)<<"/"<<soldier.rem<<" |"<<endl;
else if (i==4&&fclip) cout<<" 换弹中... |"<<endl;
else if (i==5&&fclip) cout<<"剩余:0."<<10-ChangeSleep<<"秒 |"<<endl;
else cout<<" |"<<endl;
}
cout<<"_______________________________________\n";//输出游戏边界
Sleep(100);//防止游戏太卡顿或者高内存,延时0.1秒
}
return 0;
}
为了防止你们看不懂,作者还专门打了注释(打了好久。。。)
目前有的一个比较严重的bug是假子弹(打开游戏你就知道了),就是子弹打中敌人没有得分敌人也继续向下移动,有厉害的大佬帮忙修补一下谢谢了!!!
王梓澳在2021-05-11 20:47:03追加了内容
额错了一个点,复制错代码了
第387行改为
else if (i==3) cout<<setw(3)<<clip<<setw(6)<<"/"<<setw(5)<<soldier.rem<<" |"<<endl;
王梓澳在2021-05-11 20:48:06追加了内容
386行,作者又打错了,不好意思
王梓澳在2021-05-11 21:25:48追加了内容
#include <bits/stdc++.h>
#include <windows.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)//判断键盘是否按下函数定义
using namespace std;
struct player {//玩家结构体(以后可能会有多个玩家,所以定义成这样)
int x,y,life,rem;//每个玩家的坐标,生命,子弹剩余
}soldier;//玩家
struct bullet {//子弹结构体
int x,y,di;//子弹的当前坐标和子弹方向
}fbullet[100000];//子弹数组
int bulletSleep;//控制子弹发射速度
int bucount=1;//子弹数量
int cnt;//得分
int enSleep;//控制敌人的移动速度
int ChangeSleep;//控制换弹时间
int clip;//弹夹中剩余的子弹
bool fclip;//标记弹夹是否为空(1为空,0为不空)
bool fc;//判断弹夹是否填充
struct en {//敌人结构体
int x,y;//敌人的坐标
}fen[10];//一共10*10,设置了10个敌人
char Map[200][200];//地图
bool f1,f2;
void out(string a) {//延时输出(暂时没有用到,以后写介绍会有
for (int i=0;i<a.size();i++) {
cout<<a[i];
Sleep(50);
}
}
void color(int a) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void SetPos(COORD a)
{
HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(out, a);
}
void SetPos(int i, int j)
{
COORD pos={i, j};
SetPos(pos);
}
void init() {//地图初始化函数
memset(Map,' ',sizeof(Map));//将地图初始化为空格更容易看见玩家和敌人
}
void in_con() {
f1=true;
system("cls");
out("本游戏控制主要分为两块\n");
cout<<" ";
out("1、玩家人物控制\n");
cout<<" ";
out("玩家在游戏中字符表示为1,通过w(上)s(下)a(左)d(右)控制1上下左右移动\n");
cout<<" ";
out("2、发射子弹控制\n");
cout<<" ";
out("本游戏接近于射击游戏,所以你可以在游戏中发射子弹,通过i(上)k(下)l(右)j(左)控制子弹发射方向\n");
out("如果中途你想要暂停游戏,您可以按下x键\n");
out("按下k跳出本轮介绍");
while (!KEY_DOWN('K'));
}
void in_cont() {
f1=true;
system("cls");
out("本游戏为射击游戏,所以游戏主要分为3个部分\n");
out("开始后你可能会看见:\n");
init();
Map[9][9]='1';
for (int i=1;i<=8;i++) Map[i][9]='0';
for (int i=1;i<=9;i++) Map[rand()%19][rand()%19]='U';
cout<<"________________________________________\n";//输出游戏边界
for (int i=1;i<=20;i++) {
cout<<"|";//输出边界
for (int j=1;j<20;j++) {
if (Map[i][j]=='U') color(64);//将敌人设成红色
if (Map[i][j]=='1') color(2);//将本人设置绿色
if (Map[i][j]=='0') color(14);//将子弹设置成黄色
cout<<Map[i][j];
color(7);//恢复
}//输出地图(由于子弹遇到边界目前会卡在边界上,所以少输出头尾
cout<<"|";//输出边界
if (i==1) cout<<"剩余生命:"<<soldier.life<<" |"<<endl;
else if (i==2) cout<<"得分 :"<<setw(8)<<cnt<<"分 |"<<endl;
else if (i==3) cout<<setw(3)<<clip<<"/无穷大 |"<<endl;
else if (i==4&&fclip) cout<<" 换弹中... |"<<endl;
else if (i==5&&fclip) cout<<"剩余:0."<<10-ChangeSleep<<"秒 |"<<endl;
else cout<<" |"<<endl;
}
cout<<"_______________________________________\n";//输出游戏边界
out("左边单独框出来的是游戏地图,地图上有3种符号,1,u,0\n");
out("其中1代表玩家,0代表子弹,u代表敌人,具体如何操作,请看操作介绍\n");
out("你的目标就是控制1打u获得得分\n");
out("游戏中会有子弹限制,初始会给出1000发子弹,游戏中会有商城设置,目前里面可以购买生命和子弹,以积分作为货币,避免子弹不够的情况\n");
out("按下k跳出本轮介绍");
while (!KEY_DOWN('K'));
}
void in_wri() {
f1=true;
system("cls");
out("作者姓名:保密\n");
out("作者年龄:觉得会告诉你吗\n");
out("作者身高:170cm左右\n");
out("作者编写游戏时间:2个月左右\n");
out("就这么多,剩下的去qq里面看看\n");
out("按下k跳出本轮介绍");
while (!KEY_DOWN('K'));
}
void introduce() {
bool f=0;
f2=true;
while (true) {
system("cls");
if (f) {
cout<<"您对游戏的那些部分需要查看介绍:\n";
cout<<"1、控制介绍(按下u)\n";
cout<<"2、内容介绍(按下i)\n";
cout<<"3、作者介绍(按下o)\n";
cout<<"按下Z开始游戏";
}
if (!f) {
out("您对游戏的那些部分需要查看介绍:\n");
out("1、控制介绍(按下u)\n");
out("2、内容介绍(按下i)\n");
out("3、作者介绍(按下o)\n");
out("按下Z开始游戏");
f=1;
}
while (true) {
f1=false;
if (KEY_DOWN('U')) in_con();
if (KEY_DOWN('I')) in_cont();
if (KEY_DOWN('O')) in_wri();
if (KEY_DOWN('Z')) return ;
if (f1) break;
}
}
}
void Opening() {
out("你是谁:\n");
cout<<" ";
out("第一次玩这个游戏的新人(请按下k查看游戏介绍)\n");
cout<<" ";
out("多次玩的老玩家(按下u直接开始游戏)");
while (true) {
if (KEY_DOWN('K')) break;
if (KEY_DOWN('U')) return ;
}
system("cls");
out("你好呀,欢迎玩这个游戏!\n");
out("这比起网络上面哪些大游戏可能有些简陋,bug比较多,但体谅一下作者,毕竟没写什么游戏,这是作者的第一个动态游戏,请多多体谅啊\n");
out("如果你的c++代码水平(此程序语言为c++)比较高,可以联系作者,帮助修复bug。\n");
out("废话不说了,开始正题!");
out("按下k继续");
while (!KEY_DOWN('K'));
system("cls");
out("游戏名字:打击敌人");
cout<<"(作者还没想好,暂时就这个难听的吧)\n";
// out("作者大大:蓝莓格格巫(QQ:2245893413)\n");
out("作者大大:Jack Sparrow(QQ:2256449902)\n");
out("游戏版本:1.0");
cout<<"(第一个版本)\n";
out("如果你玩过此游戏,可以跳过游戏介绍\n");
out("1、按下w,跳过游戏介绍\n");
out("2、按下s,看游戏介绍");
while (true) {
if (KEY_DOWN('W')) return ;
if (KEY_DOWN('S')) introduce();
if (f2) return ;
}
}
void control() {//控制函数
if (KEY_DOWN('W')&&soldier.x-1>=0) soldier.x--;
if (KEY_DOWN('S')&&soldier.x+1<=20) soldier.x++;
if (KEY_DOWN('A')&&soldier.y-1>=0) soldier.y--;
if (KEY_DOWN('D')&&soldier.y+1<20) soldier.y++;
}
void fire() {//发射子弹函数
int buco=0;
if (KEY_DOWN('K')) {
while (fbullet[++buco].di!=0);//重复利用数组,以下同理
if (buco>=bucount) bucount++;
fbullet[buco].di=1;
clip--;
}
if (KEY_DOWN('J')) {
while (fbullet[++buco].di!=0);
if (buco>=bucount) bucount++;
fbullet[bucount].di=2;
clip--;
}
if (KEY_DOWN('L')) {
while (fbullet[++buco].di!=0);
if (buco>=bucount) bucount++;
fbullet[bucount].di=3;
clip--;
}
if (KEY_DOWN('I')) {
while (fbullet[++buco].di!=0);
if (buco>=bucount) bucount++;
fbullet[buco].di=4;
clip--;
}
fbullet[buco].x=soldier.x;
fbullet[buco].y=soldier.y;
}
void en_move() {//敌人移动函数
if (enSleep==2) {//控制敌人移动速度
for (int i=1;i<=9;i++) {
if (fen[i].x+1<=21)//如果下一步未出界,那么移动
fen[i].x++;
if (Map[fen[i].x][fen[i].y]=='1') {//如果敌人碰到玩家
soldier.life--;
if (soldier.life==0) {
system("cls");
out("Game Over!");
Sleep(1000);
system("cls");
out("你目前的得分为:");
cout<<cnt;
out("分");
system("cls");
out("是否重新开始游戏?\nYes(y)No(n)");
while (true) {
if (KEY_DOWN('N')) exit(0);
if (KEY_DOWN('Y')) {
cnt=0;
soldier.x=9,soldier.y=9;//玩家初始坐标
for (int i=1;i<=9;i++) {//生成第一波敌人(目前只是会从上面生成,以后会从四面生成
fen[i].x=0;
fen[i].y=rand()%19;
}
bucount=0;
break;
}
}
}
}
if (fen[i].x==21) {//如果到界限,那么重新生成
fen[i].x=0;
fen[i].y=rand()%19;
}
}
enSleep=0;
}
}
void bullet_move() {//子弹移动函数
if (bulletSleep==3) {//控制子弹飞行速度(与敌人速度一致,否则会出现假子弹)
bulletSleep=0;
for (int i=1;i<=bucount;i++) {//遍历每一个子弹
if (fbullet[i].di==1&&fbullet[i].x+1<=21) fbullet[i].x++;
if (fbullet[i].di==2&&fbullet[i].y-1>=0) fbullet[i].y--;
if (fbullet[i].di==3&&fbullet[i].y+1<=21) fbullet[i].y++;
if (fbullet[i].di==4&&fbullet[i].x-1>=0) fbullet[i].x--;
if (fbullet[i].x==21||fbullet[i].y==0||fbullet[i].y==21||fbullet[i].x==0)
fbullet[i].di=0;
if (Map[fbullet[i].x][fbullet[i].y]=='U') {//如果当前子弹击中敌人
cnt++;//得分累加
for (int j=1;j<=9;j++) {//查出是哪一个敌人被击中
if (fen[j].x==fbullet[i].x&&fen[j].y==fbullet[i].y) {//找到当前敌人并重新生成
fen[j].x=0;
fen[j].y=rand()%19;
break;
}
}
fbullet[i].x=0;//将子弹放在0,0处(此处不会输出)
fbullet[i].y=0;
fbullet[i].di=0;//以后方便重复利用数组
}
}
}
}
void shop() {
bool f=false;
while (true) {
system("cls");
if (!f) {
out("欢迎来到商店,您可以买如下物品:\n");
cout<<" ";out("1、一条命(上限不能超过9,否则多余部分直接舍去)售价100分,按下p购买\n");
cout<<" ";out("2、500发子弹 售价50分,按下o购买\n");
cout<<"退出商店按下k";
f=true;
}
else {
cout<<"欢迎来到商店,您可以买如下物品:\n";
cout<<" 1、一条命(上限不能超过9,否则多余部分直接舍去)售价100分,按下p购买\n";
cout<<" 2、700发子弹 售价10分,按下o购买\n";
cout<<"退出商店按下k";
}
while (true) {
if (KEY_DOWN('P')) {
if (cnt<100) {
system("cls");
cout<<"积分不够!";
}
if (cnt>=100) {
system("cls");
cnt-=100;
soldier.life++;
soldier.life%=10;
cout<<"购买成功!\n";
cout<<"您现在有"<<soldier.life<<"条生命\n";
cout<<"您还有"<<cnt<<"分\n";
}
out("按下k继续");
while (!KEY_DOWN('K'));
break;
}
if (KEY_DOWN('O')) {
if (cnt<10) {
system("cls");
cout<<"积分不够!";
}
if (cnt>=10) {
system("cls");
cnt-=10;
soldier.rem+=700;
cout<<"购买成功!\n";
cout<<"您现在有"<<soldier.rem<<"发子弹";
cout<<"您还有"<<cnt<<"分\n";
}
out("按下k继续");
while (!KEY_DOWN('K'));
break;
}
if (KEY_DOWN('K')) return ;
}
}
}
int main () {
soldier.x=9,soldier.y=9,soldier.life=9,soldier.rem=1200;//玩家初始坐标
clip=100;
ChangeSleep=10;
for (int i=1;i<=9;i++) {//生成第一波敌人(目前只是会从上面生成,以后会从四面生成
fen[i].x=0;
fen[i].y=rand()%19;
}
Opening();
while (true) {
bulletSleep++;
enSleep++;//控制时间
if (KEY_DOWN('X')) {
SetPos(26,6);
cout<<"暂停中!";
Sleep(1000);
while (!KEY_DOWN('X'));
}
system("cls");//清屏使其动态
if (KEY_DOWN('P')) shop();
// for (int i=1;i<=bucount;i++)
// cout<<fbullet[i].x<<' '<<fbullet[i].y<<" "<<fbullet[i].di<<endl;
init();
control();
if (ChangeSleep==10) {
if (fc==0) {
clip=100;
if (soldier.rem>=100) soldier.rem-=100;
else clip=soldier.rem,soldier.rem=0;
fc=1;
}
fclip=0;
fire();
}
if (clip==0&&fclip==0) ChangeSleep=0,fclip=1,fc=0;
if (fclip) ChangeSleep++;
Map[soldier.x][soldier.y]='1';//将玩家生成在屏幕上
en_move();
for (int i=1;i<=9;i++)//将敌人生成在屏幕上(后面子弹判断需要)
Map[fen[i].x][fen[i].y]='U';
bullet_move();
for (int i=1;i<=bucount;i++)//将子弹生成在屏幕上
Map[fbullet[i].x][fbullet[i].y]='0';
Map[soldier.x][soldier.y]='1';//将玩家生成在屏幕上
cout<<"________________________________________\n";//输出游戏边界
for (int i=1;i<=20;i++) {
cout<<"|";//输出边界
for (int j=1;j<20;j++) {
if (Map[i][j]=='U') color(64);//将敌人设成红色
if (Map[i][j]=='1') color(2);//将本人设置绿色
if (Map[i][j]=='0') color(14);//将子弹设置成黄色
cout<<Map[i][j];
color(7);//恢复
}//输出地图(由于子弹遇到边界目前会卡在边界上,所以少输出头尾
cout<<"|";//输出边界
if (i==1) cout<<"剩余生命:"<<setw(2)<<soldier.life<<" |"<<endl;
else if (i==2) cout<<"得分 :"<<setw(8)<<cnt<<"分 |"<<endl;
else if (i==3) cout<<setw(3)<<clip<<setw(6)<<"/"<<setw(5)<<soldier.rem<<" |"<<endl;
else if (i==4&&fclip) cout<<" 换弹中... |"<<endl;
else if (i==5&&fclip) cout<<"剩余:0."<<10-ChangeSleep<<"秒 |"<<endl;
else cout<<" |"<<endl;
}
cout<<"_______________________________________\n";//输出游戏边界
Sleep(100);//防止游戏太卡顿或者高内存,延时0.1秒
}
return 0;
}
作者有发现了bug。。。
修改了一下
不过假子弹的bug还是修改不好,麻烦各位大佬
王梓澳在2021-05-12 18:28:48追加了内容
bug作者自己解决了,那么游戏分享给大家
#include <bits/stdc++.h>
#include <windows.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)//判断键盘是否按下函数定义
using namespace std;
struct player {//玩家结构体(以后可能会有多个玩家,所以定义成这样)
int x,y,life,rem;//每个玩家的坐标,生命,子弹剩余
}soldier;//玩家
struct bullet {//子弹结构体
int x,y,di;//子弹的当前坐标和子弹方向
}fbullet[100000];//子弹数组
int bucount=1;//子弹数量
int cnt;//得分
int enSleep;//控制敌人的移动速度
int ChangeSleep;//控制换弹时间
int clip;//弹夹中剩余的子弹
bool fclip;//标记弹夹是否为空(1为空,0为不空)
bool fc;//判断弹夹是否填充
struct en {//敌人结构体
int x,y;//敌人的坐标
}fen[10];//一共10*10,设置了10个敌人
char Map[200][200];//地图
bool f1,f2;
void out(string a) {//延时输出(暂时没有用到,以后写介绍会有
for (int i=0;i<a.size();i++) {
cout<<a[i];
Sleep(50);
}
}
void color(int a) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void SetPos(COORD a)
{
HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(out, a);
}
void SetPos(int i, int j)
{
COORD pos={i, j};
SetPos(pos);
}
void init() {//地图初始化函数
memset(Map,' ',sizeof(Map));//将地图初始化为空格更容易看见玩家和敌人
}
void in_con() {
f1=true;
system("cls");
out("本游戏控制主要分为两块\n");
cout<<" ";
out("1、玩家人物控制\n");
cout<<" ";
out("玩家在游戏中字符表示为1,通过w(上)s(下)a(左)d(右)控制1上下左右移动\n");
cout<<" ";
out("2、发射子弹控制\n");
cout<<" ";
out("本游戏接近于射击游戏,所以你可以在游戏中发射子弹,通过i(上)k(下)l(右)j(左)控制子弹发射方向\n");
out("按s召唤商店来购买东西");
out("如果中途你想要暂停游戏,您可以按下x键,此时不可以召唤商店\n");
out("一发弹夹为100发子弹,子弹耗尽时会自动换弹,如果中途想要换弹请按r\n");
out("按下k跳出本轮介绍");
while (!KEY_DOWN('K'));
}
void in_cont() {
f1=true;
system("cls");
out("本游戏为射击游戏,所以游戏主要分为3个部分\n");
out("开始后你可能会看见:\n");
init();
Map[9][9]='1';
for (int i=1;i<=8;i++) Map[i][9]='0';
for (int i=1;i<=9;i++) Map[rand()%19][rand()%19]='U';
cout<<"________________________________________\n";//输出游戏边界
for (int i=1;i<=20;i++) {
cout<<"|";//输出边界
for (int j=1;j<20;j++) {
if (Map[i][j]=='U') color(64);//将敌人设成红色
if (Map[i][j]=='1') color(2);//将本人设置绿色
if (Map[i][j]=='0') color(14);//将子弹设置成黄色
cout<<Map[i][j];
color(7);//恢复
}//输出地图(由于子弹遇到边界目前会卡在边界上,所以少输出头尾
cout<<"|";//输出边界
if (i==1) cout<<"剩余生命:"<<soldier.life<<" |"<<endl;
else if (i==2) cout<<"得分 :"<<setw(8)<<cnt<<"分 |"<<endl;
else if (i==3) cout<<setw(3)<<clip<<"/无穷大 |"<<endl;
else if (i==4&&fclip) cout<<" 换弹中... |"<<endl;
else if (i==5&&fclip) cout<<"剩余:0."<<10-ChangeSleep<<"秒 |"<<endl;
else cout<<" |"<<endl;
}
cout<<"_______________________________________\n";//输出游戏边界
out("左边单独框出来的是游戏地图,地图上有3种符号,1,u,0\n");
out("其中1代表玩家,0代表子弹,u代表敌人,具体如何操作,请看操作介绍\n");
out("你的目标就是控制1打u获得得分\n");
out("游戏中会有子弹限制,初始会给出1000发子弹,游戏中会有商城设置,目前里面可以购买生命和子弹,以积分作为货币,避免子弹不够的情况\n");
out("按下k跳出本轮介绍");
while (!KEY_DOWN('K'));
}
void in_wri() {
f1=true;
system("cls");
out("作者姓名:保密\n");
out("作者年龄:觉得会告诉你吗\n");
out("作者身高:165cm左右\n");
out("作者编写游戏时间:2个月左右\n");
out("就这么多,剩下的去qq里面看看\n");
out("按下k跳出本轮介绍");
while (!KEY_DOWN('K'));
}
void introduce() {
bool f=0;
f2=true;
while (true) {
system("cls");
if (f) {
cout<<"您对游戏的那些部分需要查看介绍:\n";
cout<<"1、控制介绍(按下u)\n";
cout<<"2、内容介绍(按下i)\n";
cout<<"3、作者介绍(按下o)\n";
cout<<"按下Z开始游戏";
}
if (!f) {
out("您对游戏的那些部分需要查看介绍:\n");
out("1、控制介绍(按下u)\n");
out("2、内容介绍(按下i)\n");
out("3、作者介绍(按下o)\n");
out("按下Z开始游戏");
f=1;
}
while (true) {
f1=false;
if (KEY_DOWN('U')) in_con();
if (KEY_DOWN('I')) in_cont();
if (KEY_DOWN('O')) in_wri();
if (KEY_DOWN('Z')) return ;
if (f1) break;
}
}
}
void Opening() {
out("你是谁:\n");
cout<<" ";
out("第一次玩这个游戏的新人(请按下k查看游戏介绍)\n");
cout<<" ";
out("多次玩的老玩家(按下u直接开始游戏)\n");
color(14);out("作者提醒,有更新内容,建议看游戏介绍!");color(7);
while (true) {
if (KEY_DOWN('K')) break;
if (KEY_DOWN('U')) return ;
}
system("cls");
out("你好呀,欢迎玩这个游戏!\n");
out("这比起网络上面哪些大游戏可能有些简陋,bug比较多,但体谅一下作者,毕竟没写什么游戏,这是作者的第一个动态游戏,请多多体谅啊\n");
out("如果你的c++代码水平(此程序语言为c++)比较高,可以联系作者,帮助修复bug。\n");
out("废话不说了,开始正题!\n");
out("按下k继续");
while (!KEY_DOWN('K'));
system("cls");
out("游戏名字:打击敌人");
cout<<"(作者还没想好,暂时就这个难听的吧)\n";
// out("作者大大:蓝莓格格巫(QQ:2245893413)\n");
out("作者大大:Jack Sparrow(QQ:2256449902)\n");
out("游戏版本:1.1");
cout<<"(第二个版本,修复了几个致命性bug)\n";
out("如果你玩过此游戏,可以跳过游戏介绍\n");
out("1、按下w,跳过游戏介绍\n");
out("2、按下s,看游戏介绍");
while (true) {
if (KEY_DOWN('W')) return ;
if (KEY_DOWN('S')) introduce();
if (f2) return ;
}
}
void control() {//控制函数
if (KEY_DOWN('W')&&soldier.x-1>=0) soldier.x--;
if (KEY_DOWN('S')&&soldier.x+1<=20) soldier.x++;
if (KEY_DOWN('A')&&soldier.y-1>=0) soldier.y--;
if (KEY_DOWN('D')&&soldier.y+1<20) soldier.y++;
}
void fire() {//发射子弹函数
int buco=0;
if (KEY_DOWN('K')) {
while (fbullet[++buco].di!=0);//重复利用数组,以下同理
if (buco>=bucount) bucount++;
fbullet[buco].di=1;
clip--;
}
if (KEY_DOWN('J')) {
while (fbullet[++buco].di!=0);
if (buco>=bucount) bucount++;
fbullet[bucount].di=2;
clip--;
}
if (KEY_DOWN('L')) {
while (fbullet[++buco].di!=0);
if (buco>=bucount) bucount++;
fbullet[bucount].di=3;
clip--;
}
if (KEY_DOWN('I')) {
while (fbullet[++buco].di!=0);
if (buco>=bucount) bucount++;
fbullet[buco].di=4;
clip--;
}
fbullet[buco].x=soldier.x;
fbullet[buco].y=soldier.y;
}
void en_move() {//敌人移动函数
if (enSleep==2) {//控制敌人移动速度
for (int i=1;i<=9;i++) {
if (fen[i].x+1<=21)//如果下一步未出界,那么移动
fen[i].x++;
if (Map[fen[i].x][fen[i].y]=='1') {//如果敌人碰到玩家
soldier.life--;
if (soldier.life==0) {
system("cls");
out("Game Over!");
Sleep(1000);
system("cls");
out("你目前的得分为:");
cout<<cnt;
out("分");
system("cls");
out("是否重新开始游戏?\nYes(y)No(n)");
while (true) {
if (KEY_DOWN('N')) exit(0);
if (KEY_DOWN('Y')) {
cnt=0;
soldier.x=9,soldier.y=9;//玩家初始坐标
for (int i=1;i<=9;i++) {//生成第一波敌人(目前只是会从上面生成,以后会从四面生成
fen[i].x=0;
fen[i].y=rand()%19;
}
bucount=0;
break;
}
}
}
}
if (fen[i].x==21) {//如果到界限,那么重新生成
fen[i].x=0;
fen[i].y=rand()%19;
}
}
enSleep=0;
}
}
void hit(int x,int y,int k) {
if (Map[x][y]=='U') {//如果当前子弹击中敌人
cnt++;//得分累加
for (int j=1;j<=9;j++) {//查出是哪一个敌人被击中
if (fen[j].x==x&&fen[j].y==y) {//找到当前敌人并重新生成
fen[j].x=0;
fen[j].y=rand()%19;
break;
}
}
fbullet[k].x=0;//将子弹放在0,0处(此处不会输出)
fbullet[k].y=0;
fbullet[k].di=0;//以后方便重复利用数组
}
}
void bullet_move() {//子弹移动函数
for (int i=1;i<=bucount;i++) {//遍历每一个子弹
hit(fbullet[i].x,fbullet[i].y,i);
if (fbullet[i].di==1&&fbullet[i].x+1<=21) fbullet[i].x++;
if (fbullet[i].di==2&&fbullet[i].y-1>=0) fbullet[i].y--;
if (fbullet[i].di==3&&fbullet[i].y+1<=21) fbullet[i].y++;
if (fbullet[i].di==4&&fbullet[i].x-1>=0) fbullet[i].x--;
if (fbullet[i].x==21||fbullet[i].y==0||fbullet[i].y==21||fbullet[i].x==0)
fbullet[i].di=0;
hit(fbullet[i].x,fbullet[i].y,i);
}
}
void shop() {
bool f=false;
while (true) {
system("cls");
if (!f) {
out("欢迎来到商店,您可以买如下物品:\n");
cout<<" ";out("1、一条命(上限不能超过9,否则多余部分直接舍去)售价100分,按下p购买\n");
cout<<" ";out("2、500发子弹 售价50分,按下o购买\n");
cout<<"退出商店按下Z";
f=true;
}
else {
cout<<"欢迎来到商店,您可以买如下物品:\n";
cout<<" 1、一条命(上限不能超过9,否则多余部分直接舍去)售价100分,按下p购买\n";
cout<<" 2、700发子弹 售价10分,按下o购买\n";
cout<<"退出商店按下Z";
}
while (true) {
if (KEY_DOWN('P')) {
if (cnt<100) {
system("cls");
cout<<"积分不够!\n";
}
if (cnt>=100) {
system("cls");
cnt-=100;
soldier.life++;
soldier.life%=10;
cout<<"购买成功!\n";
cout<<"您现在有"<<soldier.life<<"条生命\n";
cout<<"您还有"<<cnt<<"分\n";
}
out("按下k继续");
while (!KEY_DOWN('K'));
break;
}
if (KEY_DOWN('O')) {
if (cnt<10) {
system("cls");
cout<<"积分不够!\n";
}
if (cnt>=10) {
system("cls");
cnt-=10;
soldier.rem+=700;
cout<<"购买成功!\n";
cout<<"您现在有"<<soldier.rem<<"发子弹";
cout<<"您还有"<<cnt<<"分\n";
}
out("按下k继续");
while (!KEY_DOWN('K'));
break;
}
// cout<<1;
if (KEY_DOWN('Z')) return ;
}
}
}
int main () {
soldier.x=9,soldier.y=9,soldier.life=9,soldier.rem=1000;//玩家初始坐标,生命,子弹数量
clip=100;
ChangeSleep=10;
for (int i=1;i<=9;i++) {//生成第一波敌人(目前只是会从上面生成,以后会从四面生成
fen[i].x=0;
fen[i].y=rand()%19;
}
Opening();
while (true) {
enSleep++;//控制时间
if (KEY_DOWN('X')) {
SetPos(26,6);
cout<<"暂停中!";
Sleep(1000);
while (!KEY_DOWN('X'));
}
system("cls");//清屏使其动态
if (KEY_DOWN('P')) shop();
init();
control();
if (KEY_DOWN('R')) {
if (soldier.rem>=100-clip) {
soldier.rem-=(100-clip);
clip=100;
}
else {
clip+=soldier.rem;
soldier.rem=0;
}
fclip=1;
ChangeSleep=0;
}
if (ChangeSleep==10) {
if (fc==0) {
clip=100;
if (soldier.rem>=100) soldier.rem-=100;
else clip=soldier.rem,soldier.rem=0;
fc=1;
}
fclip=0;
fire();
}
if (clip==0&&fclip==0) ChangeSleep=0,fclip=1,fc=0;
if (fclip) ChangeSleep++;
Map[soldier.x][soldier.y]='1';//将玩家生成在屏幕上
en_move();
for (int i=1;i<=9;i++)//将敌人生成在屏幕上(后面子弹判断需要)
Map[fen[i].x][fen[i].y]='U';
bullet_move();
for (int i=1;i<=bucount;i++)//将子弹生成在屏幕上
Map[fbullet[i].x][fbullet[i].y]='0';
Map[soldier.x][soldier.y]='1';//将玩家生成在屏幕上
cout<<"________________________________________\n";//输出游戏边界
for (int i=1;i<=20;i++) {
cout<<"|";//输出边界
for (int j=1;j<20;j++) {
if (Map[i][j]=='U') color(64);//将敌人设成红色
if (Map[i][j]=='1') color(2);//将本人设置绿色
if (Map[i][j]=='0') color(14);//将子弹设置成黄色
cout<<Map[i][j];
color(7);//恢复
}//输出地图(由于子弹遇到边界目前会卡在边界上,所以少输出头尾
cout<<"|";//输出边界
if (i==1) cout<<"剩余生命:"<<setw(2)<<soldier.life<<" |"<<endl;
else if (i==2) cout<<"得分 :"<<setw(8)<<cnt<<"分 |"<<endl;
else if (i==3) cout<<setw(3)<<clip<<setw(6)<<"/"<<setw(5)<<soldier.rem<<" |"<<endl;
else if (i==4&&fclip&&soldier.rem!=0) cout<<" 换弹中... |"<<endl;
else if (i==5&&fclip&&soldier.rem!=0) cout<<"剩余:0."<<10-ChangeSleep<<"秒 |"<<endl;
else if (i==6&&soldier.rem==0) cout<<" 子弹耗尽! |"<<endl;
else if (i==7&&soldier.rem==0) cout<<"请尽快到商城购买!|"<<endl;
else cout<<" |"<<endl;
}
cout<<"_______________________________________\n";//输出游戏边界
Sleep(50);//防止游戏太卡顿或者高内存,延时0.05秒
}
return 0;
}
有更新内容,希望大家喜欢
0
0
0
刘悦琪
修练者
修练者
e……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
萌新看来不错!
0
0
0