界面打飞机游戏,C语言

来源:互联网 发布:cnc编程培训班 编辑:程序博客网 时间:2024/05/16 17:00

 打飞机由来,游戏中心选择的游戏都是极度符合移动平台规律的休闲游戏。就以飞机大战为例吧,微博上有人说这货只是一个程序员一边啃面包一边突发奇想,用一周时间完成的小游戏。

  游戏极为简约,就是漫画式的竖版弹幕作品,游戏也不分什么模式,就是不停的打飞机,看谁的分数高,有两种增益状态随机出现,蓝色的是可以限时增强飞机子弹威力的道具,红色的则是全屏清敌的炸弹。敌机也只有三种,由小到大。我方飞机被敌方飞机碰到,游戏就结束了。

就这么一个作品吧,其上手难度简直就是秒杀全年龄段所有用户,只要智商没问题都能轻松上手。是啊,这么多用户不是每个人都有时间去整天玩各种高端大气的解谜难度作品的,就弄这么几款游戏让我们上下班交通时间,中午午休时间,平日碎片时间放松放松不就得了,嗯,游戏中心满足你们的要求。


我也因此借助网上素材和游戏引擎写了一个简单的打飞机游戏,程序用到很多线程以及图片,精灵等

初始界面有开始游戏和游戏介绍,鼠标被替换了形状

鼠标单击游戏介绍便会出来介绍,再点游戏介绍回到主界面

点开始游戏,会有一个加载动画,然后播放游戏进行音乐

初始有两枚炸弹,炸弹可以清屏地方飞机,我方飞机是连续单发子弹,由鼠标控制,吃到蓝色道具就转变成为双发子弹的飞机,更加厉害,子弹射中敌机,敌机消失,并增加分数,分数每大于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);//暂停10sflagenemy=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;        //背景图片1int startImage=2;//开始小图片2int jieshaoImage=3;//介绍小图片3int 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}

我会努力改的更好,谢谢