1. 程式人生 > >介面打飛機遊戲,C語言

介面打飛機遊戲,C語言

 打飛機由來,遊戲中心選擇的遊戲都是極度符合移動平臺規律的休閒遊戲。就以飛機大戰為例吧,微博上有人說這貨只是一個程式設計師一邊啃麵包一邊突發奇想,用一週時間完成的小遊戲。

  遊戲極為簡約,就是漫畫式的豎版彈幕作品,遊戲也不分什麼模式,就是不停的打飛機,看誰的分數高,有兩種增益狀態隨機出現,藍色的是可以限時增強飛機子彈威力的道具,紅色的則是全屏清敵的炸彈。敵機也只有三種,由小到大。我方飛機被敵方飛機碰到,遊戲就結束了。

就這麼一個作品吧,其上手難度簡直就是秒殺全年齡段所有使用者,只要智商沒問題都能輕鬆上手。是啊,這麼多使用者不是每個人都有時間去整天玩各種高階大氣的解謎難度作品的,就弄這麼幾款遊戲讓我們上下班交通時間,中午午休時間,平日碎片時間放鬆放鬆不就得了,嗯,遊戲中心滿足你們的要求。


我也因此藉助網上素材和遊戲引擎寫了一個簡單的打飛機遊戲,程式用到很多執行緒以及圖片,精靈等

初始介面有開始遊戲和遊戲介紹,滑鼠被替換了形狀

滑鼠單擊遊戲介紹便會出來介紹,再點遊戲介紹回到主介面

點開始遊戲,會有一個載入動畫,然後播放遊戲進行音樂

初始有兩枚炸彈,炸彈可以清屏地方飛機,我方飛機是連續單發子彈,由滑鼠控制,吃到藍色道具就轉變成為雙發子彈的飛機,更加厲害,子彈射中敵機,敵機消失,並增加分數,分數每大於5000,地方飛機下落速度會增加!

遊戲上方會顯示遊戲堅持的時間,以激勵人的某種慾望,以及有分數顯示

藍色道具和紅色道具會從遊戲介面上方隨機產生位置並左右飄落,遇到牆壁往反方向飄落,藍色道具可以變成雙發子彈的飛機,紅色道具為可以使用的炸彈

我方飛機碰到地方飛機為遊戲結束,結束後停止播放遊戲進行曲,播放失敗的音效

並在結束頁面顯示堅持的秒數以及分數,可以點選結束遊戲或重新開始

下面簡單介紹一下

1.遊戲初始介面


2.點選介紹後的頁面

3.再次點選介紹回到主頁面


4.點開始遊戲會有載入動畫



6.遊戲開始後介面


隨機藍色道具飄落

需要飛機碰到才算擁有,道具會左右來回飄動,緩慢下降


紅色道具類似會這樣產生

使用紅色道具可以清屏


碰到敵機身亡,顯示


大概如此,有待改進,如敵機也發射子彈,不同敵機需要擊中次數不一樣才消失,介面也還需優化

主要程式碼如下

int xiangjiao(int x1,int y1,int width1,int height1,int x2,int y2,int width2,int height2) //兩個矩形框是否相交
{
	if(x1>x2+width2||x1+width1<x2||y1>y2+height2||y1+height1<y2)
		return 0;
	return 1;
}
int isimagejiao(int image1,int image2)//兩張圖是否相交
{
	int x1=getImageX(image1);
	int y1=getImageY(image1);
	int width1=getImageWidth(image1);
	int height1=getImageHeight(image1);
	int x2=getImageX(image2);
	int y2=getImageY(image2);
	int width2=getImageWidth(image2);
	int height2=getImageHeight(image2);
	return xiangjiao(x1,y1,width1,height1,x2,y2,width2,height2);
}
int issprite(int image1,int image2)//兩個精靈是否相交
{
	int x1=getSpriteX(image1);
	int y1=getSpriteY(image1);
	int width1=getSpriteWidth(image1);
	int height1=getSpriteHeight(image1);
	int x2=getSpriteX(image2);
	int y2=getSpriteY(image2);
	int width2=getSpriteWidth(image2);
	int height2=getSpriteHeight(image2);
	return xiangjiao(x1,y1,width1,height1,x2,y2,width2,height2);
}

int ismouseimage(int image)//滑鼠與圖是否相交
{
	int mousex=getMousePositionX();
	int mousey=getMousePositionY();
	int x1=getImageX(image);
	int y1=getImageY(image);
	int width1=getImageWidth(image);
	int height1=getImageHeight(image);
	if(mousex>=x1&&mousex<=(x1+width1)&&mousey>=y1&&mousey<=(y1+height1))
	{
		return 1;
	}
	return 0;
}
int ismouseSprite(int Sprite)//滑鼠與精靈是否相交
{
	int mousex=getMousePositionX();
	int mousey=getMousePositionY();
	int x1=getSpriteX(Sprite);
	int y1=getSpriteY(Sprite);
	int width1=getSpriteWidth(Sprite);
	int height1=getSpriteHeight(Sprite);
	if(mousex>=x1&&mousex<=(x1+width1)&&mousey>=y1&&mousey<=(y1+height1))
	{
		return 1;
	}
	return 0;
}
int k=10;			//開始敵機編號
int flagenemy=1;	//標誌位,我的飛機沒有死的時候
int k1=20000;		//開始子彈編號
long sum;			//總分
int k2=19500;	//雙發子彈道具
int doublezidan=1;	//全域性變數子彈速度
int down1=5;//初始下落速度
int boom=2;		//初始擁有炸彈數量
void f1(void * k)//執行緒執行每架敵機的下降
{
	int fd=(int)k;
	int i;

	for(i=0;i<200;i++)
	{
		setSpritePosition(fd,getSpriteX(fd),getSpriteY(fd)-down1);
		pauseGame(100);
	}
}
void f11(void * arg)		//執行緒建立敵機,建立的時候近幾架飛機不能重疊
{
	char str[256];
	int n,i,leap;
	srand((unsigned)time(NULL));
	while(flagenemy==1)
	{
		n=rand()%13+1;
		sprintf(str,"%dfly",n);
		createSprite(k,str);
		hideSprite(k);
		playSpriteAnimate(k,"fly");
		if(n==1||n==4||n==6||n==7||n==9||n==10||n==11||n==13||n==8)		//小飛機的概率要大
		{
			
			while(1)
			{
				leap=0;				
				setSpritePosition(k,(rand()%20)*21+rand()%11+15,850);		
				for(i=k-20;i<k;i++)
				{
					if(isValidSprite(i)==0||isSpriteVisible(i)==0)
					{						
						continue;
					}
					if(issprite(i,k))
					{
						leap=1;
						break;
					}
				}
				if(leap==0)
				{
					showSprite(k);
					break;
				}
			}
		}
		if(2==n||n==5||n==12)				//中飛機概率
		{
			while(1)
			{
				leap=0;				
				setSpritePosition(k,(rand()%8)*50+rand()%15+15,850);		
				for(i=k-20;i<k;i++)
				{
					if(isValidSprite(i)==0||isSpriteVisible(i)==0)
					{						
						continue;
					}
					if(issprite(i,k))
					{
						leap=1;
						break;
					}
				}
				if(leap==0)
				{
					showSprite(k);
					break;
				}
			}
		}
		if(3==n)			//大飛機
		{
			while(1)
			{
				leap=0;				
				setSpritePosition(k,(rand()%5)*80-20,850);		
				for(i=k-20;i<k;i++)
				{
					if(isValidSprite(i)==0||isSpriteVisible(i)==0)
					{						
						continue;
					}
					if(issprite(i,k))
					{
						printf("精靈相交\n");
						leap=1;
						break;
					}
				}
				if(leap==0&&i==k)
				{
					showSprite(k);
					break;
				}
			}
		}
		asyncRun(f1,(void*)k);
		k++;
		pauseGame(300);
	}
}

void f111(void * num1)		//執行緒執行子彈自動從開始位置發出
{
	
	int num=(int)num1;
	int i,j;
	char str[256];
	int x=getSpriteX(num);
	int y=getSpriteY(num);
	for(i=0;i<10&&flagenemy==1;i++)
	{
		setSpritePosition(num,x,getSpriteY(num)+100);
		pauseGame(200);
		for(j=10;j<k;j++)
		if(isSpriteVisible(j)&&issprite(num,j))		//射中敵機分數+100
		{
			sum=sum+100;

			sprintf(str,"分數:%08ld",sum);
			setText(1,str);
			playSpriteAnimate(j,"die");
			hideSprite(num);
			setSpritePosition(num,3000,3000);
			pauseGame(800);
			hideSprite(j);
			setSpritePosition(j,5000,5000);
			return;
		}
	}
	
}
void zidan(void* a)					//執行緒執行發射子彈位置
{
	while(flagenemy==1&&doublezidan==1)				//沒吃到道具發射一個子彈
	{
		createSprite(k1,"zidan");
		playSpriteAnimate(k1,"fly");
		setSpritePosition(k1,getMousePositionX()+getSpriteWidth(1)/2,getMousePositionY()+getSpriteHeight(1));
		asyncRun(f111,(void*)k1);
		pauseGame(100);
		k1++;
	}
	while(flagenemy==1&&doublezidan==2)			//吃到道具雙發子彈
	{
		createSprite(k1,"zidan");
		playSpriteAnimate(k1,"fly");
		setSpritePosition(k1,getMousePositionX()+getSpriteWidth(1)/2-18,getMousePositionY()+getSpriteHeight(1));
		asyncRun(f111,(void*)k1);
		pauseGame(100);
		k1++;
		createSprite(k1,"zidan");
		playSpriteAnimate(k1,"fly2");
		setSpritePosition(k1,getMousePositionX()+getSpriteWidth(1)/2+18,getMousePositionY()+getSpriteHeight(1));
		asyncRun(f111,(void*)k1);
		pauseGame(100);
		k1++;		
	}	
}
//緩落飄下可以得到的雙發子彈道具,碰左壁向右飄,碰右壁向左飄
void f1111(void * a)//遊戲變成不可預知性太多,需要多多測試
{
	int leap;
	int down=10;
	int lr=18;
	createSprite(8,"double");
	playSpriteAnimate(8,"d");
	hideSprite(8);
	while(flagenemy==1)
	{
		pauseGame(10000);
		showSprite(8);
		setSpritePosition(8,rand()%450+58,840);
		leap=0;
		while(getSpriteY(8)>=0&&leap==0)					//碰壁後改變
		{
			if(getSpriteX(8)+getSpriteWidth(8)+28>=480)
				lr=-lr;
			if(getSpriteX(8)-28<=0)
				lr=-lr;
			setSpritePosition(8,getSpriteX(8)+lr,getSpriteY(8)-down);

			if(issprite(8,1))				//吃到道具後
			{
				doublezidan=2;
				hideSprite(8);
				return;
			}
			pauseGame(150);
		}
		
	}

}
//緩落飄下可以得到的炸彈,碰左壁向右飄,碰右壁向左飄
void f11111(void * a)//遊戲變成不可預知性太多,需要多多測試
{
	int leap;
	int down=10;
	int lr=18;
	createSprite(19499,"double");
	playSpriteAnimate(19499,"boom");
	hideSprite(19499);
	while(flagenemy==1)
	{
		pauseGame(15000);
		showSprite(19499);
		setSpritePosition(19499,rand()%450+58,840);
		leap=0;
		while(getSpriteY(19499)>=0&&leap==0)			//碰壁後改變
		{
			if(getSpriteX(19499)+getSpriteWidth(19499)+28>=480)
				lr=-lr;
			if(getSpriteX(19499)-28<=0)
				lr=-lr;
			setSpritePosition(19499,getSpriteX(19499)+lr,getSpriteY(19499)-down);

			if(issprite(19499,1))			//吃到道具後
			{
				boom++;
				hideSprite(19499);
				break;
			}
			pauseGame(150);
		}		
	}
}
void play()
{
	int a=10,j,i,speed=5000,time1;			//speed是一個量,分數每大於5000就加快敵機下落速度
	char str[256];
	char str1[256];
	char str2[256];
	time_t timep;
	time1=time(&timep);               //開始的秒數
	playSound("game_music.mp3",1);		//播放遊戲進行音樂
	createText(1,"分數:00000000");			//開始的分數
	setTextFontSize(1,35);					//設定文字位子及顏色
	setTextPosition(1,10,810);
	setTextColor(1,1,1,0);

	createText(2,"堅持秒數:000s");			//設定堅持秒數
	setTextFontSize(2,30);
	setTextPosition(2,280,810);
	setTextColor(2,1,1,0);

	createImage(10,"bomb.png");        //設定炸彈位置
	setImagePosition(10,20,20);

	createText(3,"X 00");				//設定炸彈數量
	setTextFontSize(3,25);
	setTextPosition(3,90,20);
	setTextColor(3,1,0,1);

	asyncRun(f11,(void*)a);			
	asyncRun(f1111,(void*)a);
	asyncRun(f11111,(void*)a);
	showSprite(1);					//顯示我方人物
	asyncRun(zidan,(void*)a);		//執行緒執行子彈
	while(1)
	{	
		setSpritePosition(1,getMousePositionX(),getMousePositionY());
		if(sum>=speed)       //分數每大於5000,下路速度增加
		{
			speed=speed*2;
			down1=down1+1;
		}
		sprintf(str1,"堅持秒數:%03ds",time(&timep)-time1);		//實時變化堅持秒數
		setText(2,str1);
		sprintf(str2,"X %02d",boom);			//實時變化擁有炸彈數量
		setText(3,str2);

		for(j=10;j<k;j++)							//實時檢測有沒有碰到敵機而身亡
		if(isSpriteVisible(j)&&issprite(1,j))
		{
			flagenemy=0;
			closeSound("game_music.mp3");			//碰到的話停止播放遊戲進行音樂
			playSound("game_over.mp3",0);			//播放遊戲結束音樂
			for(i=20000;i<k1;i++)
				if(isSpriteVisible(i))
					setSpritePosition(i,3000,3000);
			createSprite(3,"over");					//建立結束精靈背景圖
			playSpriteAnimate(3,"over1");
			sprintf(str,"%ld",sum);					//結束後顯示分數
			setText(1,str);
			setTextFontSize(1,55);
			setTextPosition(1,50,400);
			setTextColor(1,0,0,0);

			setText(2,str1);						//結束後顯示堅持秒數
			setTextFontSize(2,55);
			setTextPosition(2,50,300);
			setTextColor(2,0,0,0);

			showMouseCursor();						//滑鼠恢復顯示
			createSprite(7,"game");
			playSpriteAnimate(7,"restart");				//選擇重新開始
			setSpritePosition(7,100,200);
			createSprite(9,"game");
			playSpriteAnimate(9,"over");
			setSpritePosition(9,100,150);
			if(isMouseLeftButtonDown()==1&&ismouseSprite(9))//選擇結束遊戲
				exit(0);

			pauseGame(10000);
			break;
		}
	}
	pauseGame(10000);			//暫停10s
	flagenemy=0;

	while(1);
}
void normalkeyup(unsigned char key)		//空格被按下,且炸彈數量大於等於1,觸發炸彈清屏
{
	int i;
	if(key==' '&&boom>=1)
	{
		boom--;
		for(i=10;i<k;i++)
			if(isSpriteVisible(i))				//把螢幕上所有飛機移走
				setSpritePosition(i,2000,2000);
	}
}
void gameMain(void)
{
	int bgImage=1;        //背景圖片1
	int startImage=2;		//開始小圖片2
	int jieshaoImage=3;		//介紹小圖片3
	int bg1Image=4;			//初始介面背景小圖
	int mouse=5;
	int load=0;
	onNormalKeyUp(normalkeyup);              //普通鍵被按下,如空格
	setGameTitle("打飛機");//標題名字
	setGameSize(480, 852);//視窗大小
	createImage(bgImage,"background.png");//設定背景圖
	createImage(startImage,"game_start.png");
	createImage(jieshaoImage,"121 拷貝.png");
	createImage(bg1Image,"shoot_copyright.png");
	createImage(mouse,"滑鼠.png");
	setImagePosition(bg1Image,20,500);			//設定相關圖片位置
	setImagePosition(startImage,100,420);
	setImagePosition(jieshaoImage,100,330);
	hideMouseCursor();      //隱藏滑鼠
		
	createSprite(0,"gamejiazai");//精靈0載入動畫
	playSpriteAnimate(0,"load");//播放精靈0動畫
	hideSprite(0);              //隱藏精靈
	createText(0,"移動操作,吃到藍色飛行道具變雙發連射導彈");//文字0介紹
	hideText(0);
	createSprite(1,"mefly");//精靈1英雄
	playSpriteAnimate(1,"fly");
	hideSprite(1);

	while(1)
	{
		setImagePosition(mouse,getMousePositionX()-10,getMousePositionY()-getImageHeight(mouse)+5);//新的圖片滑鼠跟著滑鼠移動的而改變
		if(isMouseLeftButtonDown()==1&&ismouseimage(startImage))		//滑鼠按下且是在開始的按鍵地方
		{
			hideImage(mouse);											//影藏滑鼠圖片
			setImagePosition(bg1Image,5000,5000);						//讓背景移走
			setImagePosition(jieshaoImage,5000,5000);
			setImagePosition(startImage,5000,5000);
			setSpritePosition(0,100,420);								//設定動畫載入頁面
			showSprite(0);												//顯示載入動畫
			pauseGame(1000);											//暫停1秒來顯示再入動畫
			setSpritePosition(0,4100,4420);								//開始後移走
			//接下來進入遊戲
			play();
			break;
		}
		if(isMouseLeftButtonDown()&&ismouseimage(jieshaoImage))			//滑鼠按下且是在介紹的按鍵地方
		{
			while(1)
			{
				setImagePosition(mouse,getMousePositionX()-10,getMousePositionY()-getImageHeight(mouse)+5);		//開啟介紹內容
				setImagePosition(bg1Image,5000,5000);
				setImagePosition(startImage,5000,5000);	
				setTextPosition(0,100,420);
				showText(0);
				if(isMouseLeftButtonDown()&&ismouseimage(jieshaoImage))		//再次點選介紹,關閉介紹內容,返回主介面
				{					
					setImagePosition(bg1Image,20,500);
					setImagePosition(startImage,100,420);
					hideText(0);
					setTextPosition(0,5100,5420);					
					while(isMouseLeftButtonDown()==0);
					break;
				}
			}			
		}
	}
	pauseGame(10000);//休眠10s
}

我會努力改的更好,謝謝