您的位置:首页 > 其它

马里奥吃金币游戏

2017-08-25 11:20 671 查看
 马里奥吃金币游戏

游戏生成8个金币以及4个炸弹,都是动态的精灵

马里奥可以上下左右移动

100s内吃完金币算赢,碰到炸弹算输

开始游戏后会有倒计时100s,在最后10s秒数每隔1s闪烁一次,右上角会显示吃到的金币数

赢了之后界面暂停,显示红色文字You Win!从小到大慢慢显示,输了之后显示youlose



游戏界面等自主设计,但采用了别人的游戏引擎,这点还需要多加改进,但游戏思路可以有



游戏引擎采用的别人的设计的接口

需要自己多加考虑函数里面是怎么写的

但给我提供了一种设计思想也是不错的

游戏大概代码如下:

#include <yzkgame.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>//sqrt
#include <stdio.h>
#pragma comment( linker, "/subsystem:\"console\" /entry:\"mainCRTStartup\"" )//
//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )//改成windows只有游戏窗口
#pragma comment(lib, "YZKGame.lib")

void gameMain(void)
{
time_t timep;					//定义时间
int bgImg=0,i,x=200,y=500,x1,y1,time1;		//定义及初始化
int mario=0,leap,n=8,k=0;
char a[]="0";
char b[20][2]={"1","2","3","4","5","6","7","8"};
int coinNums[]={1,2,3,4,5,6,7,8};					//8个精灵金币的编号
int coinX[]={100,300,50,90,150,260,550,390};		//定义及初始化8个金币生成的坐标,也可随机产生
int coinY[]={33,500,50,100,120,240,360,450};
int boomx[5];
int boomy[5];
char time2[15]={0};
time1=time(&timep);									//time1得到游戏开始时间
setGameSize(1000,600);								//设置窗口大小
setGameTitle("马里奥吃金币");						//设置窗口名称
srand((unsigned)time(NULL));						//随机时间函数

createText(14,"倒计时 100s");						//游戏倒计时100s,时间到没吃完结束
setTextColor(14,1,1,0);								//设置文本颜色
setTextFontSize(14,25);								//设置文本大小
setTextPosition(14,500,550);						//设置文本位置
createImage(10,"0.png");							//创建图片,编号为10,是金币的图
setImagePosition(10,900,550);						//设置位置
createText(0,"X");									//创建文本
setTextColor(0,1,1,0);
setTextPosition(0,930,550);
createText(1,a);
setTextColor(1,1,1,0);
setTextPosition(1,950,550);
createImage(bgImg,"大片草地.png");					//设置背景
createSprite(mario,"mario");						//创建精灵mario
playSpriteAnimate(mario,"walk");					//播放精灵动画
setSpritePosition(mario,200,500);					//设置精灵位置

for(i=10;i<13;i++)								//随机生成4个炸弹的位置
{
createSprite(i,"bomb");
playSpriteAnimate(i,"laser");
x1=rand()%1000;
boomx[i-10]=x1;
y1=rand()%600;
boomy[i-10]=y1;
setSpritePosition(i,x1,y1);
}

for(i=0;i<8;i++)								//设置金币的位置
{
createSprite(coinNums[i],"coin");
playSpriteAnimate(coinNums[i],"rotate");
setSpritePosition(coinNums[i],coinX[i],coinY[i]);
}
createText(13,"You Lose!");				//只是输了,并先隐藏
hideText(13);
while(1)									//连续移动人物mario
{
int ch=getPressedKeyCode();//只适合连续
if(RP_KEY_DOWN==ch)							//下移
setSpritePosition(0,x,--y);
if(RP_KEY_UP==ch)							//上移
setSpritePosition(0,x,++y);
if(RP_KEY_LEFT==ch)							//左移
{
setSpritePosition(0,--x,y);
setSpriteFlipX(0,FALSE);				//改变朝向
}
if(RP_KEY_RIGHT==ch)						//右移
{
setSpritePosition(0,++x,y);
setSpriteFlipX(0,TRUE);					//改变朝向
}
leap=0;										//标志位,判断是否吃到金币
for(i=0;i<n;i++)
{
if(isSpriteVisible(coinNums[i])&&((x-coinX[i])*(x-coinX[i])+(y-coinY[i])*(y-coinY[i]))<100)	//判断与金币的位置小于10像素且金币是显示的就算吃到
{
leap=1;
break;
}
}
if(leap==1)								//如果吃到隐藏
{
hideSprite(coinNums[i]);
setText(1,b[k++]);					//金币数+1
}
for(i=10;i<13;i++)							//判断与炸弹是否接触,接触的话显示出you lose文字
{
if(isSpriteVisible(i)&&((x-boomx[i-10])*(x-boomx[i-10])+(y-boomy[i-10])*(y-boomy[i-10]))<100)
{
showText(13);
setTextColor(13,1,0,0);
setTextPosition(13,400,250);
setTextFontSize(13,30);
for(i=0;i<10;i++)
{
setTextFontSize(13,30+i*10);
setTextPosition(13,475-i*5,250-i*5);
pauseGame(50);
}
pauseGame(2000);
break;
}
}
if(k==8)				//如果金币数等于8,算赢
{
createText(12,"You Win!");
setTextColor(12,1,0,0);
setTextPosition(12,475,250);
setTextFontSize(12,30);
for(i=0;i<10;i++)					//由小变大显示出You Win!
{
setTextFontSize(12,30+i*10);
setTextPosition(12,475-i*5,250-i*5);
pauseGame(50);
}
pauseGame(5000);
break;
}
sprintf(time2,"倒计时 %ds",100-(time(&timep)-time1));//倒计时秒数
setText(14,time2);						//改变倒计时处的文字
if((time(&timep)-time1)>=90)			//如果剩下最后10秒,文字每隔一秒闪动一次
{
hideText(14);
if((100-(time(&timep)-time1))%2==0)
showText(14);
}
if((time(&timep)-time1)>=100)			//100秒后还没吃完金币游戏结束
break;
pauseGame(10);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息