C++ [项目] 飞机大战

现在才发现C++游戏的支持率这么高,那就发几篇吧

一、基本介绍

        支持Dev-C++5.11版本(务必调为英文输入法),基本操作看游戏里的介绍,怎么做的……懒得说,能看懂就看注释,没有的自己猜,如果你很固执……私我吧

二、代码部分

/*=============== 2024.8.13=========================*/
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<string>
#include<cstring>
#define long long long
using namespace std;
bool flag;
int xxx=1,scorecc,score;
string title,titlecc;
/*=============== all the structures ===============*/typedef struct Frame {COORD position[2];int flag;
} Frame;/*=============== all the functions ===============*/void SetPos(COORD a) { // set cursorHANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(out, a);
}void SetPos(int i, int j) { // set cursorCOORD pos= {i, j};SetPos(pos);
}void HideCursor() {CONSOLE_CURSOR_INFO cursor_info = {1, 0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}//把第y行,[x1, x2) 之间的坐标填充为 ch
void drawRow(int y, int x1, int x2, char ch) {SetPos(x1,y);for(int i = 0; i <= (x2-x1); i++)cout<<ch;
}//在a, b 纵坐标相同的前提下,把坐标 [a, b] 之间填充为 ch
void drawRow(COORD a, COORD b, char ch) {if(a.Y == b.Y)drawRow(a.Y, a.X, b.X, ch);else {SetPos(0, 25);cout<<"error code 01:无法填充行,因为两个坐标的纵坐标(x)不相等";system("pause");}
}//把第x列,[y1, y2] 之间的坐标填充为 ch
void drawCol(int x, int y1, int y2, char ch) {int y=y1;while(y!=y2+1) {SetPos(x, y);cout<<ch;y++;}
}//在a, b 横坐标相同的前提下,把坐标 [a, b] 之间填充为 ch
void drawCol(COORD a, COORD b, char ch) {if(a.X == b.X)drawCol(a.X, a.Y, b.Y, ch);else {SetPos(0, 25);cout<<"error code 02:无法填充列,因为两个坐标的横坐标(y)不相等";system("pause");}
}//左上角坐标、右下角坐标、用row填充行、用col填充列
void drawFrame(COORD a, COORD  b, char row, char col) {drawRow(a.Y, a.X+1, b.X-1, row);drawRow(b.Y, a.X+1, b.X-1, row);drawCol(a.X, a.Y+1, b.Y-1, col);drawCol(b.X, a.Y+1, b.Y-1, col);
}void drawFrame(int x1, int y1, int x2, int y2, char row, char col) {COORD a= {x1, y1};COORD b= {x2, y2};drawFrame(a, b, row, col);
}void drawFrame(Frame frame, char row, char col) {COORD a = frame.position[0];COORD b = frame.position[1];drawFrame(a, b, row, col);
}void drawPlaying() {drawFrame(0, 0, 48, 24, '=', '|');//    draw map frame;drawFrame(49, 0, 79, 4, '-', '|');//        draw output framedrawFrame(49, 4, 79, 9, '-', '|');//        draw score framedrawFrame(49, 9, 79, 20, '-', '|');//    draw operate framedrawFrame(49, 20, 79, 24, '-', '|');//    draw other message frameSetPos(52, 6);cout<<"得分:";SetPos(52, 7);cout<<"称号:";SetPos(52,10);cout<<"操作方式:";SetPos(52,12);cout<<"  a,s,d,w 控制战机移动。";SetPos(52,14);cout<<"  p 暂停游戏。";SetPos(52,16);cout<<"  e 退出游戏。";SetPos(52,18);cout<<"  k 发射子弹。" ;
}//在[a, b)之间产生一个随机整数
int random(int a, int b) {int c=(rand() % (a-b))+ a;return c;
}//在两个坐标包括的矩形框内随机产生一个坐标
COORD random(COORD a, COORD b) {int x=random(a.X, b.X);int y=random(a.Y, b.Y);COORD c= {x, y};return c;
}bool  judgeCoordInFrame(Frame frame, COORD spot) {if(spot.X>=frame.position[0].X)if(spot.X<=frame.position[1].X)if(spot.Y>=frame.position[0].Y)if(spot.Y<=frame.position[0].Y)return true;return false;
}void printCoord(COORD a) {cout    <<"( "<<a.X<<" , "<<a.Y<<" )";
}void printFrameCoord(Frame a) {printCoord(a.position[0]);cout    <<" - ";printCoord(a.position[1]);
}DWORD WINAPI MusicFun(LPVOID lpParamte) {return 0;
}
DWORD WINAPI BulletShot(LPVOID lpParamte) {return 0;
}
DWORD WINAPI StartStage(LPVOID lpParamte) {return 0;
}
int drawMenu() {HANDLE MFUN;MFUN= CreateThread(NULL, 0, StartStage, NULL, 0, NULL);SetPos(30, 1);cout<<"P l a n e  W a r";drawRow(3, 0, 79, '-');drawRow(5, 0, 79, '-');SetPos(28, 4);cout<<"w 和 s 选择, k 确定";SetPos(15, 11);cout<<"1. 简单的敌人";SetPos(15, 13);cout<<"2. 冷酷的敌人";drawRow(20, 0, 79, '-');drawRow(22, 0, 79, '-');SetPos(47, 11);cout<<"简单的敌人:";SetPos(51, 13);cout<<"简单敌人有着较慢的移动速度。";SetPos(28, 21);cout<<"制作:一只水饺吖<*)))><<";int j=11;SetPos(12, j);cout<<">>";drawFrame(46, 9, 89, 17, '=', '|');while(1) {if( _kbhit() ) {char x=_getch();switch (x) {case 'w' : {if( j == 13) {SetPos(12, j);cout<<" ";j = 11;SetPos(12, j);cout<<">>";SetPos(51, 13);cout<<"            ";SetPos(47, 11);cout<<"简单的敌人:";SetPos(51, 13);cout<<"简单敌人有着较慢的移动速度,容易对付。";}break;}case 's' : {if( j == 11 ) {SetPos(12, j);cout<<" ";j = 13;SetPos(12, j);cout<<">>";SetPos(51, 13);cout<<"              ";SetPos(47, 11);cout<<"冷酷的敌人:";SetPos(51, 13);cout<<"冷酷的敌人移动速度较快,难对付哟!!!";}break;}case 'k' : {if (j == 8)    return 1;else return 2;}}}}
}/*================== the Game Class ==================*/class Game {public:COORD position[10];COORD bullet[10];Frame enemy[8];//int score;int rank;int rankf;//string title;int flag_rank;Game ();//初始化所有void initPlane();void initBullet();void initEnemy();//初始化其中一个//void initThisBullet( COORD );//void initThisEnemy( Frame );void planeMove(char);void bulletMove();void enemyMove();//填充所有void drawPlane();void drawPlaneToNull();void drawBullet();void drawBulletToNull();void drawEnemy();void drawEnemyToNull();//填充其中一个void drawThisBulletToNull( COORD );void drawThisEnemyToNull( Frame );void Pause();void Playing();void judgePlane();void judgeEnemy();void Shoot();void GameOver();void printScore();
};Game::Game() {initPlane();initBullet();initEnemy();score = 0;rank = 25;rankf = 0;flag_rank = 0;
}void Game::initPlane() {COORD centren= {39, 22};position[0].X=position[5].X=position[7].X=position[9].X=centren.X;position[1].X=centren.X-2;position[2].X=position[6].X=centren.X-1;position[3].X=position[8].X=centren.X+1;position[4].X=centren.X+2;for(int i=0; i<=4; i++)position[i].Y=centren.Y;for(int i=6; i<=8; i++)position[i].Y=centren.Y+1;position[5].Y=centren.Y-1;position[9].Y=centren.Y-2;
}void Game::drawPlane() {for(int i=0; i<9; i++) {SetPos(position[i]);if(i!=5)cout<<"O";else if(i==5)cout<<"|";}
}void Game::drawPlaneToNull() {for(int i=0; i<9; i++) {SetPos(position[i]);cout<<" ";}
}void Game::initBullet() {for(int i=0; i<10; i++)bullet[i].Y = 30;
}void Game::drawBullet() {for(int i=0; i<10; i++) {if( bullet[i].Y != 30) {SetPos(bullet[i]);cout<<"^";}}
}void Game::drawBulletToNull() {for(int i=0; i<10; i++)if( bullet[i].Y != 30 ) {COORD pos= {bullet[i].X, bullet[i].Y+1};SetPos(pos);cout<<" ";}
}void Game::initEnemy() {COORD a= {1, 1};COORD b= {45, 15};for(int i=0; i<8; i++) {enemy[i].position[0] = random(a, b);enemy[i].position[1].X = enemy[i].position[0].X + 3;enemy[i].position[1].Y = enemy[i].position[0].Y + 2;}
}void Game::drawEnemy() {for(int i=0; i<8; i++)drawFrame(enemy[i].position[0], enemy[i].position[1], '-', '|');
}void Game::drawEnemyToNull() {for(int i=0; i<8; i++) {drawFrame(enemy[i].position[0], enemy[i].position[1], ' ', ' ');}
}void Game::Pause() {SetPos(61,2);cout<<"               ";SetPos(61,2);cout<<"暂停中...";HANDLE MFUN;MFUN= CreateThread(NULL, 0, BulletShot, NULL, 0, NULL);char c=_getch();while(c!='p')c=_getch();SetPos(61,2);cout<<"         ";MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL);
}void Game::planeMove(char x) {if(x == 'a')if(position[1].X != 1)for(int i=0; i<=9; i++)position[i].X -= 2;if(x == 's')if(position[7].Y != 23)for(int i=0; i<=9; i++)position[i].Y += 1;if(x == 'd')if(position[4].X != 47)for(int i=0; i<=9; i++)position[i].X += 2;if(x == 'w')if(position[5].Y != 3)for(int i=0; i<=9; i++)position[i].Y -= 1;
}void Game::bulletMove() {for(int i=0; i<10; i++) {if( bullet[i].Y != 30) {bullet[i].Y -= 1;if( bullet[i].Y == 1 ) {COORD pos= {bullet[i].X, bullet[i].Y+1};drawThisBulletToNull( pos );bullet[i].Y=30;}}}
}void Game::enemyMove() {for(int i=0; i<8; i++) {for(int j=0; j<2; j++)enemy[i].position[j].Y++;if(24 == enemy[i].position[1].Y) {COORD a= {1, 1};COORD b= {45, 3};enemy[i].position[0] = random(a, b);enemy[i].position[1].X = enemy[i].position[0].X + 3;enemy[i].position[1].Y = enemy[i].position[0].Y + 2;}}
}void Game::judgePlane() {for(int i = 0; i < 8; i++)for(int j=0; j<9; j++)if(judgeCoordInFrame(enemy[i], position[j])) {SetPos(62, 1);cout<<"坠毁";drawFrame(enemy[i], '+', '+');Sleep(1000);GameOver();break;}}void Game::drawThisBulletToNull( COORD c) {SetPos(c);cout<<" ";
}void Game::drawThisEnemyToNull( Frame f ) {drawFrame(f, ' ', ' ');
}void Game::judgeEnemy() {for(int i = 0; i < 8; i++)for(int j = 0; j < 10; j++)if( judgeCoordInFrame(enemy[i], bullet[j]) ) {score += 5;drawThisEnemyToNull( enemy[i] );COORD a= {1, 1};COORD b= {45, 3};enemy[i].position[0] = random(a, b);enemy[i].position[1].X = enemy[i].position[0].X + 3;enemy[i].position[1].Y = enemy[i].position[0].Y + 2;drawThisBulletToNull( bullet[j] );bullet[j].Y = 30;}}void Game::Shoot() {for(int i=0; i<10; i++)if(bullet[i].Y == 30) {bullet[i].X = position[5].X;bullet[i].Y = position[5].Y-1;break;}
}void Game::printScore() {if(score == 120 && flag_rank == 0) {rank -= 3;flag_rank = 1;}else if( score == 360 && flag_rank == 1) {rank -= 5;flag_rank = 2;} else if( score == 480 && flag_rank == 2) {rank -= 5;flag_rank = 3;}int x=rank/5;SetPos(60, 6);cout<<score;if( rank!=rankf ) {SetPos(60, 7);if( x == 5)title="初级飞行员";else if( x == 4)title="中级飞行员";else if( x == 3)title="高级飞行员";else if( x == 2 )title="王牌飞行员";else title="顶级飞行员";cout<<title;}rankf = rank;
}void Game::Playing() {HANDLE MFUN;MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL);drawEnemy();drawPlane();int flag_bullet = 0;int flag_enemy = 0;while(1) {Sleep(8);if(_kbhit()) {char x = _getch();if ('a' == x || 's' == x || 'd' == x || 'w' == x) {drawPlaneToNull();planeMove(x);drawPlane();judgePlane();} else if ('p' == x)Pause();else if( 'k' == x)Shoot();else if( 'e' == x) {CloseHandle(MFUN);GameOver();break;}}/* 处理子弹 */if( 0 == flag_bullet ) {bulletMove();drawBulletToNull();drawBullet();judgeEnemy();}flag_bullet++;if( 5 == flag_bullet )flag_bullet = 0;/* 处理敌人 */if( 0 == flag_enemy ) {drawEnemyToNull();enemyMove();drawEnemy();judgePlane();}flag_enemy++;if( flag_enemy >= rank )flag_enemy = 0;/* 输出得分 */printScore();}
}void Game::GameOver() {system("cls");COORD p1= {28,9};COORD p2= {53,15};drawFrame(p1, p2, '=', '|');SetPos(36,12);string str="Game Over!";for(int i=0; i<str.size(); i++) {Sleep(80);cout<<str[i];}Sleep(1000);system("cls");drawFrame(p1, p2, '=', '|');SetPos(31, 11);cout<<"击落敌机:"<<score/5<<" 架";SetPos(31, 12);cout<<"得  分:"<<score;SetPos(31, 13);cout<<"获得称号:"<<title;SetPos(30, 16);Sleep(1000);
//	cout<<"是否复活 (*≧︶≦))( ̄▽ ̄* )ゞ 是(y)| 否(n)"<<endl;
//	char kkksc03;
//	cin>>kkksc03;
//	if(kkksc03=='y'){
//		xxx--;
//		flag=true;
//		if(xxx==0){
//			cout<<"已使用"<<endl;
//			cout<<"剩余0次机会" <<endl; 
//			score=scorecc;
//			titlecc=title;
//			//Main();
//		}
//		else{
//			cout<<"你没机会了,gun⑧"<<endl;
//		}
//	}cout<<"继续? 是(y)| 否(n)制作:一只水饺吖<*)))><<";HANDLE MFUN;MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL);
as:char x=_getch();if (x == 'n')exit(0);else if (x == 'y') {system("cls");Game game;int a = drawMenu();if(a == 2)game.rank = 20;system("cls");drawPlaying();game.Playing();} else goto as;
}
void Main(){//游戏准备srand((int)time(0));    //随机种子HideCursor();    //隐藏光标Game game;int a = drawMenu();if(a == 2)game.rank = 20;HANDLE MFUN;MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL);system("cls");drawPlaying();if(flag==true){flag=false;score=scorecc;title=titlecc;}game.Playing();
}
/*================== the main function ==================*/
int main() {Main(); return 0; 
}

如果觉得不错就点个赞吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/454801.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【KEIL那些事 4】CMSIS缺失!!!!导致不能编译!!!!软件自带芯片下载缓慢!!!!!!快速下载芯片包!!!!!

安装了keli发现emmm&#xff0c;CMSIS缺失&#xff01;&#xff01;&#xff01;&#xff01;不能编译&#xff0c;&#xff0c;&#xff0c;自带下载芯片缓慢&#xff0c;&#xff0c;&#xff0c;官网下载emmm&#xff0c;竟然不带动的&#xff01;&#xff01;&#xff01;&…

数据库集群

主从复制 作用&#xff1a; 1.做数据的热备&#xff0c;作为后备数据库&#xff0c;主数据库服务器故障后&#xff0c;可切换到从数据库继续工作&#xff0c;避免数据丢失。 2.架构的扩展。业务量越来越大&#xff0c;I/O访问频率过高&#xff0c;单机无法满足&#xff0c;此…

基于node.js宜家宜业物业管理系统【附源码】

基于node.js宜家宜业物业管理系统 效果如下&#xff1a; 系统首页界面 业主登录界面 停车位页面 小区公告页面 管理员登录界面 管理员功能界面 物业管理员管理界面 缴费信息管理界面 物业管理员功能界面 研究背景 近年来互联网技术飞速发展&#xff0c;给人们的生活带来了极…

《云计算网络技术与应用》实训6-1:配置KVM虚拟机使用NAT网络

任务1、计算节点基础环境准备 1. 使用VMware安装CentOS 7虚拟机&#xff0c;安装时记得开启CPU虚拟化&#xff0c;命名为“KVMC6”。 2. &#xff08;网卡配置和之前的一样&#xff0c;都用100网段&#xff09;网关设置为192.168.100.1&#xff0c;地址段为192.168.100.10-25…

excel将文本型数字转变为数值型数字

问题导入&#xff1a;复制数字到excel表格中&#xff0c;但是表格中数字显示为文本&#xff0c;且无法通过常规方法转变为可进行四则运算的数字。例如&#xff1a;在i3单元格中输入常规的转换方法仍然报错。在j3单元格中输入ISTEXT(H3)显示h3单元格确实为文本。 解决办法&#…

Chrome DevTools 三: Performance 性能面板扩展—— 性能优化

Performance 性能 &#xff08;一&#xff09;性能指标 首次内容绘制 (First Contentful Paint&#xff0c;FCP)&#xff1a; 任意内容在页面上完成渲染的时间 最大内容绘制 (Largest Contentful Paint&#xff0c;LCP)&#xff1a; 最大内容在页面上完成渲染的时间 第一字节…

【经管】比特币与以太坊历史价格数据集(2014.1-2024.5)

一、数据介绍 数据名称&#xff1a;比特币与以太坊历史价格数据集 频率&#xff1a;逐日 时间范围&#xff1a; BTC&#xff1a;2014/9/18-2024/5/1 ETH&#xff1a;2017/11/10-2024/5/1 数据格式&#xff1a;面板数据 二、指标说明 共计7个指标&#xff1a;Date、Open…

天润融通大模型文本机器人,让客服迈入“无人化”的第一步

明明很着急&#xff0c;但客服机器人总是答非所问&#xff1f; 相信很多人都经历过这样的尴尬时刻&#xff0c;问题的关键&#xff0c;是传统文本机器人还在通过关键词和基础语义分析回答问题。 △传统机器人处理问题流程示意 要知道在客户咨询与服务过程中&#xff0c;用户的…

架构师备考-背诵精华(系统架构评估)

系统架构评估是在对架构分析、评估的基础上&#xff0c;对架构策略的选取进行决策。它利用数学或逻辑分析技术&#xff0c;针对系统的一致性、正确性、质量属性、规划结果等不同方面&#xff0c;提供描述性、预测性和指令性的分析结果。 重要概念 敏感点&#xff1a;敏感点是…

Linux系统基础-进程间通信(4)_模拟实现进程池

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-进程间通信(4)_模拟实现进程池 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f4…

Claude 3.5 Sonnent(new)发布,编程能力反超o1

目录 1、近期OpenAI的重磅更新2、Claude 3.5深夜迎来重磅升级3、为什么这么大的更新却连模型版本号都不改一下&#xff1f;4、升级后的Claude 3.5 Sonnet&#xff1a;不只是“更快更强”5、Claude 3.5 Sonnet&#xff08;new&#xff09;适配更多场景&#xff08;1&#xff09;…

[实时计算flink]作业开发上线流程及规范

随着数据量的爆炸性增长和业务需求的日益复杂化&#xff0c;企业对实时数据处理能力的需求愈发迫切。Flink作为一种强大的流处理框架已经成为实时计算标准&#xff0c;其规范化的开发和运维流程对于企业提升数据处理效率、确保系统稳定性至关重要&#xff0c;旨在提升研发效率&…

力扣困难题汇总(16道)

题4&#xff08;困难&#xff09;&#xff1a; 思路&#xff1a; 找两数组中位数&#xff0c;这个看起来简单&#xff0c;顺手反应就是数第(mn)/2个&#xff0c;这个难在要求时间复杂度为log(mn)&#xff0c;所以不能这样搞&#xff0c;我的思路是&#xff1a;每次切割长度为较…

pdf怎么合并在一起?pdf合并的简单方法

pdf怎么合并在一起&#xff1f;在现代办公和学习环境中&#xff0c;PDF&#xff08;便携式文档格式&#xff09;文件因其兼容性强、易于分享和保持格式稳定而广泛应用。然而&#xff0c;在日常工作中&#xff0c;我们经常会遇到需要处理多个PDF文件的情况&#xff0c;例如&…

【uniapp】实现触底加载数据

前言&#xff1a;实现界面触底数据加载。后端接口得支持翻页传参&#xff08;本案例使用django&#xff09; 1、后端接口 1.1 封装翻页公共方法standardPagination.py # -*- coding: utf-8 -*- # Time : 2024/10/15 13:15 # Author : super # File : standardPaginat…

[Hbase]一 HBase基础

1. HBase简介 1.1 HBase定义 HBase数据模型的关键在于 稀疏、分布式、多维、排序 的映射。其中映射 map指代非关系型数据库的 key-Value结构。 1.2 HBase数据模型 1)Name Space 命名空间,类似于关系型数据库的database 概念,每个命名空间下有多个表。HBase 两个自…

MFC工控项目实例二十五多媒体定时计时器

承接专栏《MFC工控项目实例二十四模拟量校正值输入》 用多媒体定时器实现0.1秒计时器 1、在SEAL_PRESSUREDlg.h文件中添加代码 #include<MMSystem.h> #pragma comment(lib,"winmm.lib")class CSEAL_PRESSUREDlg : public CDialog { public:CSEAL_PRESSUREDlg(…

Redis实现全局ID生成器

全局ID生成器 为什么要用全局ID生成器 1.当我们使用数据库自增来实现id的生成时,规律过于明显,会给用户暴露很多信息 2.当我们订单量过大时无法用数据库的一张表来存放订单,如果两张表的id都是自增的话,id就会出现重复 什么是全局ID生成器 全局ID生成器,是一种在分布式系统…

css刮刮卡效果(附源码!!!)

这个刮刮卡PC端和移动端都可以用使用 首发的公众号[小白讲前端]欢迎大家关注浏览 PC端展现 移动端展示 源码(PC和移动端直接复制运行) <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content&quo…

宣恩文旅微短剧双作开机,融合创新助力城市经济发展

近日&#xff0c;宣恩文旅微短剧《弥彰》与《新年恋爱申请&#xff0c;请通过》正式开机。这两部作品由常斌、徐子琁、常喆宽、李果、况琪儿、梅凯杰、刘书赫等实力派演员领衔主演&#xff0c;不仅汇聚了众多演艺界的佼佼者&#xff0c;更承载着宣恩县文化旅游事业的创新与发展…