1. 程式人生 > >c++ 飛機大戰控制檯遊戲

c++ 飛機大戰控制檯遊戲

之所以寫這個遊戲,是

#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;

char arr[TOP][LEFT];	//地圖

int gwArrTop[TOP];	//怪物縱座標 
int gwArrLeft[TOP];	//怪物的橫座標 
int gwTot;	//怪物數 
int fjTOP;	//飛機的縱座標 
int fjLeft; 	//飛機的橫座標 
int Score=0;	//得分
int Life=20;//生命 

extern "C"
{
	WINBASEAPI HWND WINAPI GetConsoleWindow();
}

int sjs(int x,int y){		//返回[x,y]的隨機數 
	return rand()%(y-x+1)+x;
}

void print(){			//列印地圖 
	gwTot=0;//怪物統計
	int gw_i=0,gw_j=0;	 
	 
	for(int i=0;i<TOP+2;i++){	 
		for(int j=0;j<LEFT+1;j++){
			//邊界 
			if(i==TOP||j==LEFT){
				cout<<'-';
				continue;
			}
			if(j==LEFT){
				cout<<'-';
				continue;
			}
			if(i==TOP+1){
				cout<<"得分:"<<Score<<"\t"<<"剩餘生命值:"<<Life;
				break; 
			}  
			//邊界
			//計算 
			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'){
					Life--;
				}
			}else if(arr[i][j]=='N'){	//擊中怪物 
				if(arr[i-1][i]=='Y'){
					Score++;
					arr[i-1][j]=space;
					gwTot--;
				}
			} 
			
	
			cout<<arr[i][j];
			
			if(arr[i][j]=='Y'){
				gwArrTop[gw_i++]=i;		//怪物座標 
				gwArrLeft[gw_j++]=j;
				gwTot++;
			}
		} 
		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,2);	//隨機一到三個怪物
	int gwTOP;
	int gwLEFT;
	
	gwTot=tot;
	for(int i=0;i<tot;i++){
		gwTOP=sjs(0,4);
		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];		//TOP
		int l1=gwArrLeft[i];	//Left
		arr[t1][l1]=space;
		int t=sjs(1,3);
		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;
		}
		gwArrTop[i]=t1;
		gwArrLeft[i]=l1;
		arr[t1][l1]='Y';
		//怪物移動到邊界的處理 
		if(t1==TOP-1||l1==0||l1==LEFT-1){
			arr[t1][l1]=space;
		}
		 
	}
}
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];		//TOP
		int l1=gwArrLeft[i];	//Left
		
		arr[t1+1][l1]='*';		//直線 
		arr[t1+1][l1+1]='O';	//右斜線 
		arr[t1+1][l1-1]='0';	//左斜線 
	}
	
}
void zddel(){	//子彈處理  
	for(int i=TOP-1;i>=0;i--){	 
		for(int j=LEFT-1;j>=0;j--){
			if(arr[i][j]=='*'){		//怪物直線子彈 
				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'){	//右斜線子彈 
				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')	//左斜線子彈
			{
				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 func3(LPVOID LpParameter)	//怪物、子彈生成 
{
	while(1)
	{
		gwAct();//怪物隨機動
		zddel();//子彈處理
		Sleep(600);		//怪物、子彈速度控制 
	}
	
	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);
			
		}
		//Sleep(1);
	}
	return 0;
}

DWORD WINAPI func1(LPVOID LpParameter)	//怪物、子彈生成 
{
	MSG msg;
	HWND hwnd = GetConsoleWindow();
	while(1)
	{
		GetMessage(&msg,NULL,0,0);
		if (msg.message == WM_MYMSG)	//按鍵  新增怪物子彈 
		{
			sczd();	//生成子彈 
			if(gwTot<=0){
				GW();
			} 
			
			
		}
		Sleep(3000);
	}
	
	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);
	
	while(1){
		system("cls");//清空螢幕 
		
		print();//列印地圖
		if(Life==0){
			break;
		} 
		Sleep(100);		//速度控制 
	} 
}
int main(){
	memset(arr,space,sizeof(arr));	//地圖初始化
	 
	FJ();//飛機座標初始化 
	GW(); //隨機怪物初始化
	sczd();//生成子彈 
	
	contrl();//總體控制 
	system("cls");//清空螢幕
	cout<<"遊戲結束!得分:"<<Score<<endl;
	Sleep(6000);
	return 0;
}