之所以写这个游戏,是因为不服气,花了一天时间完成。

操作:上下左右键 移动,enter键(回车)发射子弹。

1

111 是本机,Y是怪物(敌机),*O0是子弹。可以看下截图。

怪物随机移动,怪物子弹发射随机。

相互间的射击判断不是很完善。

代码:

#include<iostream>
#include<cstring>
#include<windows.h>
#include<cmath>
#include<time.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>#define WM_MYMSG    WM_USER+100    //线程消息
using namespace std;const char space=' ';
const int TOP=15;
const int LEFT=50;
const int X=0;     //  光标默认横坐标
const int Y=4;     //  光标默认纵坐标
int randomFlag = 1; //随机数标志 char arr[TOP][LEFT];   //地图int gwArrTop[TOP];  //怪物纵坐标
int gwArrLeft[TOP]; //怪物的横坐标
int gwTot;  //怪物数
int fjTOP;  //飞机的纵坐标
int fjLeft;     //飞机的横坐标
int Score=0;   //得分
int Life=100;//生命
int oldLife=100;//旧的生命
int oldScore=0;    //得分extern "C"
{WINBASEAPI HWND WINAPI GetConsoleWindow();
}void SetPosition(int x,int y)  //设置光标位置 (列,行)
{HANDLE winHandle;//句柄COORD pos = {x,y};winHandle = GetStdHandle(STD_OUTPUT_HANDLE);//设置光标位置 SetConsoleCursorPosition(winHandle,pos); }int sjs(int a, int b) {            //返回[x,y]的随机数 if (randomFlag) {randomFlag = 0;srand((unsigned int)time(NULL));}return (int)((double)rand() / ((RAND_MAX + 1.0) / (b - a + 1.0)) + a);
}void print(){          //打印地图 -边界内的 SetPosition(X,Y); gwTot=0;//怪物统计int gw_i=0,gw_j=0;   for(int i=0;i<TOP;i++){   for(int j=0;j<LEFT;j++){//计算 if(arr[i][j]=='N'){ //击中怪物 if(arr[i-1][j]=='Y'){Score++;arr[i-1][j]=space;gwTot--;}} if(arr[i][j]=='*'){     // arr[t][l]if(arr[i+1][j]=='1')Life--;}else if(arr[i][j]=='O'){   //右斜线 if(arr[i+1][j+1]=='1')Life--; }else if(arr[i][j]=='0'){if(arr[i+1][j-1]=='1')Life--;}else if(arr[i][j]=='Y'){if(arr[i+1][j]=='1'||arr[i+1][j+1]=='1'||arr[i+1][j-1]=='1'||arr[i][j+1]=='1'||arr[i][j-1]=='1'){arr[i][j]=space;Life--;}}//颜色控制if(arr[i][j]=='Y'){//红字黑底SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED);gwArrTop[gw_i++]=i;       //怪物坐标 gwArrLeft[gw_j++]=j;gwTot++;                //怪物数统计cout<<arr[i][j];}else if(arr[i][j]=='O'||arr[i][j]=='0'){//蓝色黑底SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE);cout<<arr[i][j]; }else if(arr[i][j]=='*'){//黄字黑底SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_GREEN); cout<<arr[i][j];}else{//白色黑底SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);cout<<arr[i][j];}} cout<<endl;}
}void print_border(){           //打印地图边界 SetPosition(0,0);cout<<"得分:"<<Score<<"\t"<<"剩余生命值:"<<Life<<endl;SetPosition(X,Y-1);cout<<"--------------------------------------------------"<<endl;SetPosition(X,Y); for(int i=0;i<TOP+2;i++){  for(int j=0;j<LEFT+1;j++){//边界 if(i==TOP||j==LEFT){cout<<'-';continue;}if(i==TOP+1){cout<<"说明:上下左右键移动,回车键攻击"<<endl;break; }cout<<arr[i][j];  }cout<<endl;}
}void FJ(){     //飞机坐标初始化 int FJ_TOP=14; int FJ_LEFT=24;fjTOP=FJ_TOP;fjLeft=FJ_LEFT;arr[FJ_TOP][FJ_LEFT]='1';arr[FJ_TOP-1][FJ_LEFT]='1';arr[FJ_TOP][FJ_LEFT+1]='1';arr[FJ_TOP][FJ_LEFT-1]='1';
}
void GW(){  //随机怪物初始化 int tot=sjs(1,4);    //随机一到四个个怪物int gwTOP;int gwLEFT;gwTot=tot;for(int i=0;i<tot;i++){gwTOP=sjs(0,5);gwLEFT=sjs(0,48);gwArrTop[i]=gwTOP;gwArrLeft[i]=gwLEFT;arr[gwTOP][gwLEFT]='Y';}
}int gwAct(){           //怪物随机动for(int i=0;i<gwTot;i++){int t1=gwArrTop[i];      //TOPint l1=gwArrLeft[i];  //Leftarr[t1][l1]=space;int t=sjs(1,5);switch(t){case 1:if(t1<TOP-1){t1+=1;break;}case 2:if(l1<LEFT-1){l1+=1;break;}case 3:if(l1>0){l1-=1;break;}case 4:if(t1<TOP-1&&l1<LEFT-1){t1++;l1++;break;}case 5:if(t1<TOP-1&&l1>0){t1++;l1--;break;}default:if(t1<TOP-1){t1+=1;}break;}gwArrTop[i]=t1;gwArrLeft[i]=l1;arr[t1][l1]='Y';//怪物移动到边界的处理 if(t1>=TOP-2||l1<=0||l1==LEFT-1){arr[t1][l1]=space;gwTot--;}}
}
int input(){            //处理键盘输入 int ch;ch=getch();    switch(ch){case 72:arr[fjTOP][fjLeft]=space;arr[fjTOP-1][fjLeft]=space;arr[fjTOP][fjLeft-1]=space;arr[fjTOP][fjLeft+1]=space;fjTOP-=1;arr[fjTOP][fjLeft]='1';arr[fjTOP-1][fjLeft]='1'; arr[fjTOP][fjLeft-1]='1';arr[fjTOP][fjLeft+1]='1';break;//上 case 80:arr[fjTOP][fjLeft]=space;arr[fjTOP-1][fjLeft]=space;arr[fjTOP][fjLeft-1]=space;arr[fjTOP][fjLeft+1]=space;fjTOP+=1;arr[fjTOP][fjLeft]='1';arr[fjTOP-1][fjLeft]='1'; arr[fjTOP][fjLeft-1]='1';arr[fjTOP][fjLeft+1]='1';break;//下 case 75:arr[fjTOP][fjLeft]=space;arr[fjTOP-1][fjLeft]=space;arr[fjTOP][fjLeft-1]=space;arr[fjTOP][fjLeft+1]=space;fjLeft-=1;arr[fjTOP][fjLeft]='1';arr[fjTOP-1][fjLeft]='1'; arr[fjTOP][fjLeft-1]='1';arr[fjTOP][fjLeft+1]='1';break;//左 case 77:arr[fjTOP][fjLeft]=space;arr[fjTOP-1][fjLeft]=space;arr[fjTOP][fjLeft-1]=space;arr[fjTOP][fjLeft+1]=space;fjLeft+=1;arr[fjTOP][fjLeft]='1';arr[fjTOP-1][fjLeft]='1'; arr[fjTOP][fjLeft-1]='1';arr[fjTOP][fjLeft+1]='1';break;//右case 13:arr[fjTOP-2][fjLeft]='N'; break;//enter  飞机子弹 default:return 0;}   return 1;
}
void sczd(){    //生成随机子弹 for(int i=0;i<gwTot;i++){int t1=gwArrTop[i];        //TOPint l1=gwArrLeft[i];  //Leftint a=sjs(1,7);switch(a){            //随机子弹 case 1:arr[t1+1][l1]='*';        //直线 break;case 2:arr[t1+1][l1+1]='O'; //右斜线 break;case 3:arr[t1+1][l1-1]='0'; //左斜线break;case 4:arr[t1+1][l1]='*';        //直线 arr[t1+1][l1+1]='O';  //右斜线break;case 5:arr[t1+1][l1]='*';        //直线arr[t1+1][l1-1]='0';    //左斜线break;case 6:arr[t1+1][l1+1]='O'; //右斜线 arr[t1+1][l1-1]='0';  //左斜线break;case 7:arr[t1+1][l1]='*';        //直线 arr[t1+1][l1+1]='O';  //右斜线 arr[t1+1][l1-1]='0';  //左斜线break;default:arr[t1+1][l1]='*';       //直线break;}}}
void zddel(){   //子弹处理   for(int i=TOP-1;i>=0;i--){     for(int j=LEFT-1;j>=0;j--){if(arr[i][j]=='*'&&arr[i+1][j]!='Y'){      //怪物直线子弹 if(i<TOP-1&&j>0&&j<LEFT-1){arr[i][j]=space;arr[i+1][j]='*';}else{                //子弹消失 arr[i][j]=space;}}else if(arr[i][j]=='O'&&arr[i+1][j+1]!='Y'){ //右斜线子弹 if(i<TOP-1&&j<LEFT-1){arr[i][j]=space;arr[i+1][j+1]='O';}else{              //子弹消失 arr[i][j]=space;}   }else if(arr[i][j]=='0'&&arr[i+1][j]!='Y')  //左斜线子弹{if(i<TOP-1&&j>0){arr[i][j]=space;arr[i+1][j-1]='0';}else{                //子弹消失 arr[i][j]=space;}}} }for(int i=0;i<TOP;i++){   for(int j=0;j<LEFT;j++){if(arr[i][j]=='N'){  //飞机子弹 if(i>1&&j>1&&j<LEFT-2){arr[i][j]=space;arr[i-1][j]='N';}else{               //子弹消失 arr[i][j]=space;}}} }
}//多线程
DWORD WINAPI func4(LPVOID LpParameter)  //即使用户不操作,也产生子弹
{while(1){sczd(); Sleep(12000); //12秒    }return 0;
}DWORD WINAPI func3(LPVOID LpParameter) //怪物、子弹移动
{while(1){gwAct();//怪物随机动zddel();//子弹处理Sleep(800);      //怪物、子弹速度控制 }return 0;
}DWORD WINAPI func2(LPVOID LpParameter) //捕捉键盘
{DWORD id = *(int*)LpParameter;while(1){int ap=0;ap=input();if(ap==1)      //按键{PostThreadMessage(id, WM_MYMSG, 0, 0); }}return 0;
}DWORD WINAPI func1(LPVOID LpParameter) //怪物、子弹生成
{MSG msg;HWND hwnd = GetConsoleWindow();while(1){GetMessage(&msg,NULL,0,0);sczd(); //生成子弹if (msg.message == WM_MYMSG)    //按键  添加怪物{int t=0;for(int i=0;i<TOP;i++){    for(int j=0;j<LEFT;j++){if(arr[i][j]=='Y')t++;}}if(t<=1){GW();}        }Sleep(1000);}return 0;
}//多线程
int contrl(){DWORD id;HANDLE hthrd1 = CreateThread(NULL, 0, func1, NULL, 0, &id);HANDLE hthrd2 = CreateThread(NULL, 0, func2, &id, 0, 0);HANDLE hthrd3 = CreateThread(NULL, 0, func3, NULL, 0, 0);HANDLE hthrd4 = CreateThread(NULL, 0, func4, NULL, 0, 0);while(1){        print();//打印地图if(oldScore!=Score){oldScore=Score;print_border();continue;}if(oldLife!=Life){oldLife=Life;print_border();continue;} if(Life<=0){break;}if(fjTOP<=0||fjTOP>TOP-1||fjLeft<=0||fjLeft>=LEFT-1){system("cls");//清空屏幕cout<<"你自杀了!"<<"\t"<<"生命值:"<<Life<<endl;Sleep(3000);return 0; } Sleep(1);        //速度控制 }
}
int main(){memset(arr,space,sizeof(arr));   //地图初始化FJ();//飞机坐标初始化 GW(); //随机怪物初始化sczd();//生成子弹 print_border();//边界 contrl();//总体控制 system("cls");//清空屏幕cout<<"游戏结束!得分:"<<Score<<endl;Sleep(6000);return 0;
}

【C++控制台实战】飞机大战控制台游戏源码相关推荐

  1. 飞机大战HTML5游戏源码,基于Canvas制作的网页版飞机大战游戏+飞机大战手机端

    简介: 飞机大战HTML5游戏源码是一款基于Canvas制作的网页版飞机大战游戏,画质精美的飞机大战手机端游戏源码 网盘下载地址: http://kekewangLuo.net/W1S2LQcqAT2 ...

  2. html+javascript实现的网页版飞机大战小游戏源码

    html+javascript实现的网页版飞机大战小游戏源码 完整代码下载地址: html+javascript实现的网页版飞机大战小游戏源码 index.html <!DOCTYPE html ...

  3. 飞机大战小游戏源码---飞机大战初体验

    开发环境: Windows10,pycharm,python3 源码使用教程: 打开pycharm,创建一个新的项目,文件-->新建项目 项目命名:飞机大战初体验,基本解释器选择python3版 ...

  4. java飞机场模拟程序_java 飞机大战 小游戏源码

    [实例简介] 本项目是一个使用java做的一个飞机大战的小游戏,一个英雄机,初始有三次生命,当打中蜜蜂会有一次生命奖励,当打中敌机会有相应分数奖励,但如果被敌机打中会失去一次生命机会.如果生命都失去, ...

  5. 【180930】坦克大战小游戏源码

    坦克大战小游戏源码程序实现了小霸王游戏机上坦克大战的功能,主要功能是开火.移动.3种不同的敌方坦克.用户自制地图等,缺点是有些小细节还处理的不好,感觉画面不够好,还没实现自动的下一关功能(主要是嫌做默 ...

  6. java飞机大战编程_[源码和文档分享]Java飞机大战游戏设计与实现

    1 概述 本次Java课程设计是做一个飞机大战的游戏,应用Swing编程,完成一个界面简洁流畅.游戏方式简单,玩起来易于上手的桌面游戏.该飞机大战项目运用的主要技术即是Swing编程中的一些窗口类库. ...

  7. Java小游戏之Swing框架实现飞机大战(附源码 超详细必看)

    需要源码和图片集请点赞关注收藏后评论区留言~~~ 1.项目主要工作 本次项目的题目--基于Java的飞机大战游戏的设计与实现,主要目的是实现飞机大战这个游戏.期望结果:游戏无BUG(现在人们将在电脑系 ...

  8. 基础教学:用python实现儿时游戏飞机大战(带源码)

    python是一门非常简单的语言,快速入门后可以做很多事情.例如爬虫,数据分析,自动化运维,机器学习量化分析啊等等! 视频教学源码学习资料领取地址:关注+私信小编"资料"即可. 看 ...

  9. Python小游戏——坦克飞机大战(附源码)

    一.学习目标: 1.掌握用Python写自己的小游戏. 2.掌握面向对象编程语言的特点. 3.掌握Python基础 二.学习内容: 1.Python文件操作. 2.Python 类的定义与使用 3.P ...

  10. 经典《飞机大战》游戏,难道你不想自己动手开发一个嘛(附源码免费下载)

    经典的飞机大战游戏,难道你不想自己动手开发一个嘛! 语言:Java 代码的编译软件:Eclipse 如果你用的也是eclipse的话  直接导入文件 就可以  ,如果不是的话,自己建一个项目,将代码c ...

最新文章

  1. Java List 更换指定位置的元素
  2. Python基础教程:列表的四种常用方法
  3. qemu-kvm分析
  4. python es 数据库_Python将json文件写入ES数据库的方法
  5. [转]linux各文件夹介绍
  6. SAP Spartacus的产品主数据模型
  7. ABAP table buffer test
  8. 信号的时频分析MATLAB,[转载]时频特性分析(Matlab)
  9. [Swift实际操作]八、实用进阶-(7)使用通知的方法进行对象间的消息传递
  10. 台式计算机关机后自行重启,台式机电脑总是自动关机重启该怎么解决?
  11. 蓝桥杯 ADV-69 算法提高 质因数
  12. UTF-8的CSV文件中文乱码问题解决办法
  13. PYTHON 处理JSON文件(新建key值Findex,并将歌手名字转换为大写首字母作为value值)
  14. C++中使用初始化列表比在构造函数中对成员变量赋值更高效
  15. Latex英文论文模板汇总(elsevier、arXiv、IEEE Access)
  16. ES6阮一峰读书笔记第一章let和const命令
  17. IDEA光标跟随原因是jdk载入的问题BUG 修正 需要I安装最新版本1.8JDK 1.9之后的不清楚 谨慎...
  18. 强网杯团队赛---Misc
  19. 脉冲宽度调制pdm_如何通俗易懂地解释「脉冲宽度调制(PWM)」?
  20. Verilog数字系统设计——8位数字比较器

热门文章

  1. armv6 可以通过什么方式检查内存泄露?
  2. 计蒜客 2018南京网络赛 I Skr(马拉车+哈希)
  3. selenium实现动态网页爬取
  4. 企业如何实现IoT物联网远程控制
  5. Rman操作简单分析
  6. 华中科技大学操作系统实验课 实验四
  7. WeBug3.0靶场环境搭建与搭建资源分享
  8. docker镜像使用及连接
  9. php使用microtime(true)查看代码执行时间
  10. 北京电台“广播三下乡” 徐德亮演唱传统曲艺