详细编写2048小游戏
图片资源和图形库可以私聊我。
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>/*用到graphics,此处没有图形库插件,可能会报错,只需安装插件EasyX插件就行.*/
#include <windows.h>//清屏时用到的头文件
#include <conio.h>//getch函数用到的头文件
#include <time.h>
int i,j;
IMAGE img[12];//定义12张图片
int Map[4][4]={0};//绘制表格
int imgIndex[12]={0,2,4,8,16,32,64,128,256,512,1024,2048};//imgIndex表示角码,
void loadResource()//定义子函数,加载图片资源,
{
for(i=0;i<12;i++)
{
char fileName[20]="";
sprintf(fileName,"%d.bmp",imgIndex[i]);//图片类型为.bmp
loadimage(img+i,fileName);
}
}
void drawMap()//子函数,画图,
{
setbkcolor(RGB(250,215,215));//背景颜色
cleardevice();//清屏
settextcolor(WHITE);//文本颜色
settextstyle(35,0,"隶书");//字号,
outtextxy(50,10,"2048游戏");//字体距离
//画表格,表格为4*4的,用for循环
int x,y,k;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
x=60*j;
y=60*i+40;//,x,y表示长宽
for(k=0;k<12;k++)
{
if(imgIndex[k]==Map[i][j])
break;
}
putimage(x,y,img+k);//显示图片函数
}
}
}
int randIntNum()//产声随机数,用到头文件time.h
{
srand((unsigned int)time(NULL));
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(Map[i][j]==0)
{
Map[i][j]=(rand()%3)*2;//产生随机数0,1,2;然后*2,使动一次,随机产生2或4
if(Map[i][j]==0)
continue;
return 0;
}
}
}
return 0;
}
int moveRight()//向右移动,有两种移动,
{
int flag=0;
for(i=0;i<4;i++)//第一种,例如 2 2 4 4 →0 4 0 8
{
for(j=3;j>=0;j--)
{
int curKey=Map[i][j];//curKey表示当前位置,curKeyNext表示当前位置的下一个
if(curKey!=0)
{
int k=j-1;
while(k>=0)
{
int curKeyNext=Map[i][k];
if(curKeyNext!=0)
{
if(curKeyNext==curKey)
{
flag=1;
Map[i][j]+=Map[i][k];
Map[i][k]=0;
}
k=-1;
break;
}
k--;
}
}
}
}
for(i=0;i<4;i++)//第二种,例如 0 2 0 8 → 0 0 2 8
{
for(j=3;j>0;j--)
{
int curKey=Map[i][j];
if(curKey==0)
{
int k=j-1;
while(k>=0)
{
int curKeyNext=Map[i][k];
if(curKeyNext!=0)
{
flag=1;
Map[i][j]=curKeyNext;
Map[i][k]=0;
k=-1;
}
k--;
}
}
}
}
if(flag)
return 0;
else
return 4;//结束标志,
}
int moveLeft()//上下左和上面类似,不过建议自己动手重新写一遍。
{
int flag=0;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
int curKey=Map[i][j];
if(curKey!=0)
{
int k=j+1;
while(k<4)
{
int curKeyNext=Map[i][k];
if(curKeyNext!=0)
{
if(curKeyNext==curKey)
{
flag=1;
Map[i][j]+=Map[i][k];
Map[i][k]=0;
}
k=4;
break;
}
k++;
}
}
}
}
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
int curKey=Map[i][j];
if(curKey==0)
{
int k=j+1;
while(k<4)
{
int curKeyNext=Map[i][k];
if(curKeyNext!=0)
{
flag=1;
Map[i][j]=curKeyNext;
Map[i][k]=0;
k=4;
}
k++;
}
}
}
}
if(flag)
return 0;
else
return 4;
}
int moveUp()//上
{
int flag=0;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
int curKey=Map[i][j];
if(curKey!=0)
{
int k=i+1;
while(k<4)
{
int curKeyNext=Map[k][j];
if(curKeyNext!=0)
{
if(curKeyNext==curKey)
{
flag=1;
Map[i][j]+=Map[k][j];
Map[k][j]=0;
}
k=4;
break;
}
k++;
}
}
}
}
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
int curKey=Map[i][j];
if(curKey==0)
{
int k=i+1;
while(k<4)
{
int curKeyNext=Map[k][j];
if(curKeyNext!=0)
{
flag=1;
Map[i][j]=curKeyNext;
Map[k][j]=0;
k=4;
}
k++;
}
}
}
}
if(flag)
return 0;
else
return 4;
}
int moveDown()//下
{
int flag=0;
for(i=3;i>=0;i--)
{
for(j=0;j<4;j++)
{
int curKey=Map[i][j];
if(curKey!=0)
{
int k=i-1;
while(k>=0)
{
int curKeyNext=Map[k][j];
if(curKeyNext!=0)
{
if(curKeyNext==curKey)
{
flag=1;
Map[i][j]+=Map[k][j];
Map[k][j]=0;
}
k=-1;
break;
}
k--;
}
}
}
}
for(i=3;i>0;i--)
{
for(j=0;j<4;j++)
{
int curKey=Map[i][j];
if(curKey==0)
{
int k=i-1;
while(k>=0)
{
int curKeyNext=Map[k][j];
if(curKeyNext!=0)
{
flag=1;
Map[i][j]=curKeyNext;
Map[k][j]=0;
k=-1;
}
k--;
}
}
}
}
if(flag)
return 0;
else
return 4;
}
//子函数控制按键,
void keyDown()
{
char key=_getch();
switch(key)
{
case 'w':
case 'W':
case 72://数字表示电脑小键盘上的箭头
randIntNum();
drawMap();//重新画图
moveUp();//调用方向子函数
break;
case 's':
case 'S':
case 80:
randIntNum();
drawMap();
moveDown();
break;
case 'a':
case 'A':
case 75:
randIntNum();
drawMap();
moveLeft();
break;
case 'd':
case 'D':
case 77:
randIntNum();
drawMap();
moveRight();
break;
}
}
int main()
{
loadResource();//调用加载资源
initgraph(60*4,60*4+50);//创建窗口
//IMAGE background;//声明图片变量
//loadimage(&background,"class.jpg",800,400);//加载图片,用loadimage
//putimage(0,0,img+0);//显示图片,用putimage
drawMap();
while(1)
{
keyDown();
drawMap();//调用函数
}
getchar();//防止闪屏
closegraph();//关闭窗口
system("pause");
return 0;
}
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码