版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include<iostream> #include<>#include<>#include<>#include<>using namespace std;HANDLE Mutex=CreateMutex(NULL,FALSE,NULL);/ 互斥对象int GameOver=0;int level=0;int map2323;/坦克种类,Normal为玩家坦克# define Normal 0# define Red 1# define Blue 2# define Green 3/方向的宏定义# define Up 0# def
2、ine Down 1# define Left 2# define Right 3/地图标记的宏定义# define Empty 0# define Player 1# define PlayerBullet 2# define EnemyBullet 3#define Enemy 4 int Kill;int KillRed;int KillGreen;int EnemyExist;void SetPos(int i,int j)/设定光标位置(COORD pos=i,j;HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorP
3、osition(Out, pos);void HideCurSor(void)/隐藏光标CONSOLE_CURSOR_INFO info=1,0;HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorInfo(Out,&info);int sharp412=0,1,1,0,1,1,122,0,2,2,0,0,021,0,1,1,1,2,2,1,0,1,0,2,1,0,1,1,2,1,2,2,0,0,0,1,1,1,1,2,2,0,2,1,;/此数组用来保存坦克各个方向的形状信息DWORD WINAPI Bulletfly(
4、LPVOID IpParameter);/子弹函数申明void Updata();/更新界面信息函数申明class Tank/ 坦克类int Direction;/方向int hotpoint2;/活动点private:int Speed;/ 速度int FirePower;/ 火力public:构造函数Tank(int dir,int hot1,int hot2,int typ,int spe,int firepow)/Direction=dir;hotpoint0=hot1;hotpoint1=hot2;Type=typ;Speed=spe;FirePower=firepow;int Ty
5、pe;/ 坦克的种类(详见宏定义)int ID;/ 坦克在MAP中的标记(详见宏定义)int FireEnable;/ 是否可以开火int Life;/ 生命值判断是否可以绘制坦克void Running();/ 运行函数int Judge(int x,int y,int ID);/void DrawTank();/ 重绘坦克void Redraw();/擦除坦克int GetSpeed()/获取速度(return Speed;)int GetFire()/获取火力(return FirePower;)int GetDirection()/获取方向(return Direction;)int
6、GetHotX()/获取活动点坐标(return hotpoint0;)int GetHotY()(return hotpoint1;)void IncreaseFire() 火力 +(FirePower+;)void IncreaseSpeed()速度 +Speed+;) void ChangeDirection(int newD)/ 改变方向 (Direction=newD; ) void ChangePos(int x,int y)/改变活动点( hotpoint0=x; hotpoint1=y; );Tank player(Right,0,0,Normal,1,1);玩家Tank en
7、emy(Left,20,0,Red,1,1);敌人void Tank:DrawTank()/绘制坦克(int i; int nx,ny; if(Type=Red)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSIT Y| FOREGROUND_RED);else if(Type=Blue)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_BLUE);else if(Ty
8、pe=Green)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_GREEN);else if(Type=Normal)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);for(i=0;i<6;i+)nx=hotpoint0+sharpDirect
9、ioni*2;ny=hotpoint1+sharpDirectioni*2+1;SetPos(ny+1)*2,nx+1);/ 利用sharp数组相又加1点 x,y绘制形状mapnxny=ID;cout<<" "void Tank:Redraw()/擦除坦克,原理同上int i;int nx,ny;for(i=0;i<6;i+)nx=hotpoint0+sharpDirectioni*2;ny=hotpoint1+sharpDirectioni*2+1;mapnxny=Empty;SetPos(ny+1)*2,nx+1);cout<<"
10、"int Tank:Judge(int x,int y,int dir)/判断当前是否可以绘制坦克int i;int nx,ny;for(i=0;i<6;i+)nx=x+sharpdiri*2;ny=y+sharpdiri*2+1;if(nx<0|nx>=23|ny<0|ny>=23|mapnxny!=Empty)/不能绘制,返回 1return 1;return 0;void Tank:Running()坦克运行函数int newD;/坦克的运行while(1)if(Life=0)( EnemyExist=0; 敌人不存在 return;)if(Gam
11、eOver=1)return;if(FireEnable=1&&GameOver=0)如果可以开火(WaitForSingleObject(Mutex,INFINITE);线程拥有互斥对象FireEnable=0;/ 设为不可开火HANDLE bullet=CreateThread(NULL,0,Bulletfly,&ID,0,NULL);/创建子弹线程CloseHandle(bullet);ReleaseMutex(Mutex);/释放互斥对象Sleep(100);)WaitForSingleObject(Mutex,INFINITE);/ 线程拥有互斥对象srand
12、(int)time(0);newD=rand()%4;if(newD=Up)/随机出新的方向并重新绘制坦克 (Redraw();if(Judge(hotpoint0-1,hotpoint1,newD)=0)hotpoint0-;Direction=newD;else(if(Judge(hotpoint0,hotpoint1,newD)=0)Direction=newD;)else if(newD=Down)(Redraw();if(Judge(hotpoint0+1,hotpoint1,newD)=0)(hotpoint0+;Direction=newD;)else(if(Judge(hotp
13、oint0,hotpoint1,newD)=0)Direction=newD;)else if(newD=Left)(Redraw();if(Judge(hotpoint0,hotpoint1-1,newD)=0)hotpoint1-;Direction=newD;)else(if(Judge(hotpoint0,hotpoint1,newD)=0)Direction=newD;)else if(newD=Right)(Redraw();if(Judge(hotpoint0,hotpoint1+1,newD)=0)(hotpoint1+;Direction=newD;)else(if(Judg
14、e(hotpoint0,hotpoint1,newD)=0)Direction=newD;)if(GameOver=0&&Life!=0)DrawTank();ReleaseMutex(Mutex);/ 释放互斥对象Sleep(500-80*Speed);/*子弹线程函数*/DWORD WINAPI Bulletfly(LPVOID IpParameter) (IDint *ID=(int *)lpParameter;/ID用来获取发射子弹坦克的int Pos2;/ 子弹活动点int direction;int Speed;int type;int hit=0;/击中标记int
15、 oldx,oldy;旧活动点int flag=0;/子弹是否有移动的标记if(*ID=Player)/如果是玩家坦克(type=PlayerBullet;direction=();Speed=();Pos0=();Pos1=();)else if(*ID=Enemy)/如果是敌人坦克(type=EnemyBullet;direction=();Speed=();Pos0=();Pos1=();)if(direction=Up)/根据坦克的位置和方向确定子弹的初始坐标(Pos0-;Pos1+;)else if(direction=Down)(Pos0+=3;Pos1+;)else if(dir
16、ection=Left)(Pos0+;Pos1-;)else if(direction=Right)(Pos0+;Pos1+=3;)/子弹的运行这个不再注释了。while(1)WaitForSingleObject(Mutex,INFINITE);/(mapoldxoldy=Empty;SetPos(oldy+1)*2,oldx+1);cout<<""if(GameOver=1)return 0;if(hit=111Pos0<0|Pos0>22|Pos1<0|Pos1>22)如果击中(ReleaseMutex(Mutex);Sleep(5
17、00);if(type=PlayerBullet)=1; else if(type=EnemyBullet)=1;break;switch(mapPos0Pos1)/子弹经过的 MAP勺标记(casemapPos0Pos1=type;SetPos(Pos1+1)*2,Pos0+1);SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSIT Y| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);cout<<" "b
18、reak;caseif(type!=PlayerBullet)(;/生命减少if<=0)GameOver=1;Updata();hit=1;break;caseif(type!=PlayerBullet)hit=1;else(hit=1;Kill+;if(Kill%20=0&&<5)/ 击杀数 +;if=Red)/ 如果击杀红坦克(KillRed+;if(KillRed%10=0&&()<5)();if=Green)/如果击杀绿坦克KillGreen+;if(KillGreen%10=0&&()<5)();)();/擦除敌
19、人=0;/敌人死亡)Updata();break;)oldx=Pos0;oldy=Pos1;if(direction=Up)/子弹移动Pos0-;else if(direction=Down)Pos0+;else if(direction=Left)Pos1-;else if(direction=Right)Pos1+;ReleaseMutex(Mutex);flag=1;Sleep(60-10*Speed);)return 0;,*DWORD WINAPI TankRuning(LPVOID IpParameter)(Sleep(400);int Pos;int Start2;/敌人起始地址
20、int typ;int fire;int spe;while(1)(if(GameOver=1)return 0;srand(int)time(0);/随机出敌人起始地址Pos=rand()%4;if(Pos=0)(Start0=2;Start0=2;else if(Pos=1)(Start0=2;Start1=18; else if(Pos=2)Start0=18;Start1=2;)else if(Pos=3)(Start0=18;Start1=18;)if(Start0,Start1,Down)=0) break;)WaitForSingleObject(Mutex,INFINITE);
21、srand(int)time(0);typ=rand()%3+1;/随机出敌人的种类if(typ=Blue)(spe=1+level;fire=1+level;)else if(typ=Red)(spe=1+level;fire=3+level;)else if(typ=Green)spe=3+level;重新生成敌人坦克fire=1+level;enemy=Tank(Down,Start0,Start1,typ,spe,fire);/=Enemy;=1;=1;ReleaseMutex(Mutex);();return 0;)void Init()/初始化函数Kill=0;KillRed=0;
22、KillGreen=0;player=Tank(Left,0,0,Normal,1,1);enemy=Tank(Left,0,0,Red,1,1);=2;=1;=0;=1;=Player;=Enemy;EnemyExist=0;void Updata()/更新界面信息(SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);int i;SetPos(53,0);cout<<&q
23、uot;生命值:"SetPos(53,1);for(i=0;i<5;i+)(if(i<cout<<" "elsecout<<" "SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_GREEN);SetPos(53,3);cout<<"移动速度:"SetPos(53,4);for(i=0;i<5;i+)(if(i<()cout<<
24、;" "elsecout<<" "SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED);SetPos(53,5);cout<<"火力:"SetPos(53,6);for(i=0;i<5;i+)if(i<()cout<<" "elsecout<<" "SetPos(53,8);SetConsoleText
25、Attribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);cout<<"杀敌数:"<<Kill;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED);SetPos(53,9);cout<<"杀死红坦克:"<
26、;<KillRed;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_GREEN);SetPos(53,10);cout<<"杀死绿坦克:"<<KillGreen;(SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_B
27、LUE);system("cls");int i;for(i=0;i<25;i+)(SetPos(i*2,0);cout<<" "for(i=1;i<25;i+)(SetPos(0,i);cout<<" "SetPos(24*2,i);cout<<" "for(i=0;i<25;i+)(SetPos(i*2,24);cout<<" "Updata();int x;system("cls");SetConsole
28、TextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);SetPos(10,5);cout<<” SetPos(10,6);cout<<" 坦克大战控制台版"SetPos(10,7);cout<<” SetPos(10,8);cout<<" 方向键移动,空格键射击"SetPos(10,9);cout<<&quo
29、t; 敌人分为3种,蓝色为普通敌人”;SetPos(10,10);cout<<" 红色敌人高射速,绿色敌人高机动性”;SetPos(10,11);cout<<" 每杀死10个红坦克,玩家射速提高(最高五级)”;SetPos(10,12);cout<<" 每杀死10个绿坦克,玩家移动性提高(最高五级)"SetPos(10,13);cout<<" 每杀死20个坦克,玩家生命 +1 (最高五格)"SetPos(10,14);cout<<” SetPos(10,15);cout<
30、;<" 何某作(百度ID:HapHapYear)n.SetPos(10,16);cout<<" 按1-3选择难度SetPos(10,17);cout<<" while(1)(x=getch();if(x<='3'&&x>='1')break;level=x-'0'-1;int main()(Init();HideCurSor();Welcome();DrawMap();HANDLE temp;int newD;();while(GameOver=0)(if(G
31、etAsyncKeyState(VK_UP) 按键上WaitForSingleObject(Mutex,INFINITE);newD=Up;();if()-1,(),newD)=0)/移动玩家坦克,原理和敌人函数一样()-1,();(newD);)else(if(),(),newD)=0)(newD);)if(GameOver=0)();ReleaseMutex(Mutex);Sleep()*20);按键延迟,决定玩家坦克的速度)else if(GetAsyncKeyState(VK_DOWN)按键下,同上(WaitForSingleObject(Mutex,INFINITE);newD=Down;();if()+1,(),newD)=0)()+1,();(newD);else (if(),(),newD)=0)(newD);)if(GameOver=0)();ReleaseMutex(Mutex);Sleep()*20);)else if(GetAsyncKeyState(VK_RIGHT)按键右,同上(WaitForSingleObject(Mutex,INFINITE);newD=Right;();if(),()+1,newD)=0)(),()+1);(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024合法的咨询服务合同
- 2024年度医疗设施EPC建设合同
- 2024电子版个人服务合同书
- 2024年度5G基站建设设计与施工服务合同
- 2024年度供应链管理合同:供应商与采购商之间的货物供应与付款协议
- 谁会跑课件教学课件
- 2024年度租赁期满后购买合同标的购买价格
- 2024年师范大学新进教师就业协议
- 2024年度文化旅游项目合作合同
- 2024年度医疗设备研发与生产许可合同
- 北师版 七上 数学 第四章 基本平面图形《角-第2课时 角的大小比较》课件
- 外研版小学英语(三起点)六年级上册期末测试题及答案(共3套)
- 北师大版(2024新版)七年级上册生物期中学情调研测试卷(含答案)
- 产品包装规范管理制度
- 2024年海南省中考物理试题卷(含答案)
- 2024统编新版小学三年级语文上册第八单元:大单元整体教学设计
- 第07讲 物态变化(原卷版)-2024全国初中物理竞赛试题编选
- 高危儿规范化健康管理专家共识解读
- 中国心力衰竭基层诊疗与管理指南(2024年版)
- 2024至2030年中国连续热镀铝硅合金钢板行业市场深度分析及发展趋势预测报告
- 05G335单层工业厂房钢筋混凝土柱
评论
0/150
提交评论