在使用前需要做的准备工作如下:
需要所用到的图片和歌曲移动到“配置”文件夹。
图片及歌曲(可根据自己的喜好进行歌曲的调整)的命名如下:(命名如需改变需要改变源代码)
代码如下:(运行前需要下载easyx库 https://easyx.cn/ )
#include
#include
#include
#include
#include
#include
#pragma comment(lib,"Winmm.lib")
#define WIDTH 480
#define HEIGHT 680
int score,score_i,sco;
int data[4][4]={0},data_old[4][4]={0};
void win();
int judge();//检查游戏是否结束
void lent();
void lose();
void rands();
void copyData()//复制数据
{
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
data_old[i][j]=data[i][j];
}
void issuccess()
{
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(data[i][j]==2048)
{
win();
}
}
}
}
int compareData()//检查数据是否(变化/移动)
{
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(data_old[i][j] != data[i][j])return 0;
return 1;
}
int getEmptyNum()//剩余的空的位置
{
int i,j,n=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(data[i][j]==0)
n++;
return n;
}
void show1()
{
cleardevice();//清屏
setfont(50,0,"方正行黑简体");//字体设置
RECT r1={0,0,WIDTH,HEIGHT/3};
drawtext("欢迎来到2048的世界",&r1,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
setbkcolor(RGB(251,248,241));
setfont(30,0,"Microsoft Yahei Ul Boid");
solidroundrect(146,140,188,170,10,10);//圆角梯形
solidroundrect(78,140,118,170,10,10);//圆角梯形
setfont(30,0,"微软雅黑");
RECT r2={WIDTH/2-45,HEIGHT/3,WIDTH/2+45,HEIGHT/3+30};
drawtext("开始游戏",&r2,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
RECT r3={WIDTH/2-45,HEIGHT/3+30,WIDTH/2+45,HEIGHT/3+60};
drawtext("游戏介绍",&r3,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
RECT r4={WIDTH/2-45,HEIGHT/3+60,WIDTH/2+45,HEIGHT/3+90};
drawtext("操作说明",&r4,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
RECT r5={WIDTH/2-45,HEIGHT/3+90,WIDTH/2+45,HEIGHT/3+120};
drawtext("退出游戏",&r5,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
setfillcolor(RGB(244,186,1));//设置当前的填充颜色
setfont(30,0,"Microsoft Yahei UI Bold");//设置字体
char sq[] = "作者:LYE_LYE";
outtextxy(155, 440, sq);
char rq[] = "联系QQ:2703164181";
outtextxy(115,480, rq);
settextcolor(RED);//字体颜色
char sbq[] = "温馨提醒:此界面均用鼠标左键点击";
outtextxy(75, 520, sbq);
settextcolor(RGB(150,126,104));
setbkcolor(RGB(244,186,1));
solidroundrect(146,140,188,170,10,10);//圆角梯形
solidroundrect(78,140,118,170,10,10);//圆角梯形
setbkcolor(RGB(251,248,241));
setfont(30,0,"Microsoft Yahei UI Bold");//设置字体
char wq[] = "音乐: 开 / 关 ";
outtextxy(18,140, wq);
}
void show2()
{
cleardevice();//清屏
RECT C2={60,60,640,790};
drawtext("\n\n\n 游戏介绍:每次可以选择\n上下左右其中一个方向去滑动,\n每滑动一次,所有数字方块都会\n往滑动方向靠拢,系统也会在\n空白地方随机出现一个数字方\n块,相同数字会在靠拢碰撞时\n相加。不断的叠加,获得更高\n的分数\n\n\n\n\n ",&C2,DT_WORDBREAK);
RECT R1={2,HEIGHT-200,WIDTH-2,HEIGHT-2};
drawtext("返回",&R1,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
// 单行显示 居中显示 垂直居中显示
MOUSEMSG m;
while(1)
{
m=GetMouseMsg();
if(m.uMsg==WM_LBUTTONDOWN)
{
if(m.x>2&&m.x<WIDTH-2&&m.y>HEIGHT-200&&m.y<HEIGHT-2)
lent();
}
}
}
void show3()
{
cleardevice();//清屏
RECT C1={60,60,640,790};
drawtext("\n\n\n操作说明:\n\n左移: 方向键←\n\n右移: 方向键→\n\n上移: 方向键↑\n\n下移: 方向键↓\n\n", &C1, DT_WORDBREAK);
RECT R1={2,HEIGHT-200,WIDTH-2,HEIGHT-2};
drawtext("返回",&R1,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
MOUSEMSG m;
while(1)
{
m=GetMouseMsg();
if(m.uMsg==WM_LBUTTONDOWN)
{
if(m.x>2&&m.x<WIDTH-2&&m.y>HEIGHT-200&&m.y<HEIGHT-2)
lent();
}
}
}
void show4()
{
cleardevice();//清屏
setfont(100,0,"Microsoft Yahei UI Bold");//设置字体
settextcolor(RGB(120,116,101));
outtextxy(15,0,"2048");
setfont(30,0,"Microsoft Yahei UI Bold");//设置字体
setfillcolor(RGB(141,122,105));
solidroundrect(13,85,200,127,15,15);
setbkcolor(RGB(141,122,105));//背景颜色
settextcolor(RGB(248,247,241));//字体颜色
char wq[] = "音乐:开(n)/关(f)";
outtextxy(18,90, wq);
solidroundrect(13,140,200,200,10,10);
settextcolor(RED);//字体颜色
char rq[] = "温馨提示:此界面";
outtextxy(18,140, rq);
char fq[] = " 均用键盘输入。";
outtextxy(18,170, fq);
setfillcolor(RGB(184,175,160));//设置当前填充颜色
solidroundrect(210,10,330,80,15,15);//圆角梯形
setfont(28,0,"Microsoft Yahei UI Bold");//设置当前字体
setbkcolor(RGB(184,175,160));//背景颜色
settextcolor(RGB(248,247,241));//字体颜色
outtextxy(230,20,"单次得分");
char str[10],str_i[10];
setbkcolor(RGB(184,175,160));
itoa(score_i,str_i,10);
outtextxy(265,52,str_i);//分数
solidroundrect(350,10,460,80,15,15);//圆角梯形
outtextxy(380,20,"总分");
setbkcolor(RGB(184,175,160));
itoa(score,str,10);
outtextxy(395,52,str);//分数
sco=score;
setfillcolor(RGB(141,122,105));
solidroundrect(210,95,460,137,15,15);
setbkcolor(RGB(141,122,105));//背景颜色
setfont(33,0,"Microsoft Yahei UI Bold");
outtextxy(248,100,"返回主页面(esc)");
setfillcolor(RGB(141,122,105));
solidroundrect(210,152,460,195,15,15);
setbkcolor(RGB(141,122,105));//背景颜色
setfont(33,0,"Microsoft Yahei UI Bold");
outtextxy(268,160,"重新开始(t)");
setfillcolor(RGB(187,173,160));
solidroundrect(10,210,470,670,20,20);
if(judge())
lose();
int i,j;
for(i=0;i<4;i++)
{
setfillcolor(RGB(206,192,181));
for(j=0;j<4;j++)
{
solidroundrect(20+110*i,220+110*j,125+110*i,325+110*j,5,5);//圆角矩形
}
}
IMAGE img0,img2,img4,img8,img16,img32,img64,img128,img256,img512,img1024,img2048;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
switch(data[j][i])
{
case 0:loadimage(&img0,".\\配置\\0.jpg");putimage(i*110+20,j*110+220,&img0);break;
case 2:loadimage(&img2,".\\配置\\2.jpg");putimage(i*110+20,j*110+220,&img2);break;
case 4:loadimage(&img4,".\\配置\\4.jpg");putimage(i*110+20,j*110+220,&img4);break;
case 8:loadimage(&img8,".\\配置\\8.jpg");putimage(i*110+20,j*110+220,&img8);break;
case 16:loadimage(&img16,".\\配置\\16.jpg");putimage(i*110+20,j*110+220,&img16);break;
case 32:loadimage(&img32,".\\配置\\32.jpg");putimage(i*110+20,j*110+220,&img32);break;
case 64:loadimage(&img64,".\\配置\\64.jpg");putimage(i*110+20,j*110+220,&img64);break;
case 128:loadimage(&img128,".\\配置\\128.jpg");putimage(i*110+20,j*110+220,&img128);break;
case 256:loadimage(&img256,".\\配置\\256.jpg");putimage(i*110+20,j*110+220,&img256);break;
case 512:loadimage(&img512,".\\配置\\512.jpg");putimage(i*110+20,j*110+220,&img512);break;
case 1024:loadimage(&img1024,".\\配置\\1024.jpg");putimage(i*110+20,j*110+220,&img1024);break;
case 2048:loadimage(&img2048,".\\配置\\2048.jpg");putimage(i*110+20,j*110+220,&img2048);break;
}
}
}
}
int judge()//检查游戏是否结束
{
int i,j;
for(i=0;i<4;++i)
{
for(j=0;j<4;++j)
{
if(data[i][j]==0)//任意一点为空,游戏继续
return 0;
if(i>0)
{
if(data[i-1][j]==data[i][j])//任意两个相邻的单元值相同,游戏继续
return 0;
}
if(j>0)
if(data[i][j-1]==data[i][j])
return 0;
}
}
return 1;
}
void rands()
{
int x,y,temp,num;
srand((int)time(0));
while(1)
{
x=rand()%4;
y=rand()%4;
temp=rand()%5;
if(temp==1)
num=4;
else
num=2;
if(data[y][x]==0)
{
data[y][x]=num;
break;
}
}
}
void moveUP()//向上移动操作
{
int i,j;
int m=0,n=0;
for(i=0;i<4;i++)//列
{
//移动操作
j=0;n=0; //j为当前判定的所在行
while(n<3 && j<3)//n为移动的次数
{
if(data[j][i]==0) //若发现空白格
{
for(m=j;m<3;m++)//下方数据向上平移1格,覆盖空白格
data[m][i]=data[m+1][i];
data[3][i]=0; //最后一行置0
n++; //移动的次数+1
}else j++; //否则:让当前判定的所在行+1
}
//合并操作
for(j=0;j<3;j++)//行
if(data[j][i]==data[j+1][i] && data[j][i]!=0)//相同(且不是0)则合并
{ // 0和0不需要合并
data[j][i]=data[j][i]*2;//上面的保存合并后的数字
data[j+1][i]=0; //下面的清零
score_i=data[j][i];//得分
score=score+score_i;
}
//移动操作
j=0;n=0;
while(n<3 && j<3)
{
if(data[j][i]==0)
{
for(m=j;m<3;m++)
data[m][i]=data[m+1][i];
data[3][i]=0;
n++;
}else j++;
}
}
if(compareData()==0)
{
rands();
}
}
void moveDOWN()//向下移动操作
{
int i,j;
int m=0,n=0;
for(i=0;i<4;i++)//列
{
//移动操作
j=3;n=0;
while(n<3 && j>0)
{
if(data[j][i]==0)
{
for(m=j;m>0;m--)data[m][i]=data[m-1][i];
data[0][i]=0;
n++;
}else j--;
}
//合并操作
for(j=3;j>0;j--)//行
if(data[j][i]==data[j-1][i] && data[j][i]!=0)//相同(且不是0)则合并
{
data[j][i]=data[j][i]*2;//下面的保存合并后的数字
data[j-1][i]=0; //上面的清零
score_i=data[j][i];//得分
score=score+score_i;
}
//移动操作
j=3;n=0;
while(n<3 && j>0)
{
if(data[j][i]==0)
{
for(m=j;m>0;m--)data[m][i]=data[m-1][i];
data[0][i]=0;
n++;
}else j--;
}
}
if(compareData()==0)
{
rands();
}
}
void moveLEFT()//向左移动操作
{
int i,j;
int m=0,n=0;
for(i=0;i<4;i++)
{
//移动操作
j=0;n=0;
while(n<3 && j<3)
{
if(data[i][j]==0)
{
for(m=j;m<3;m++)data[i][m]=data[i][m+1];
data[i][3]=0;
n++;
}else j++;
}
//合并操作
for(j=0;j<3;j++)
if(data[i][j]==data[i][j+1] && data[i][j]!=0)
{
data[i][j]=data[i][j]*2;
data[i][j+1]=0;
score_i=data[i][j];//得分
score=score+score_i;
}
//移动操作
j=0;n=0;
while(n<3 && j<3)
{
if(data[i][j]==0)
{
for(m=j;m<3;m++)data[i][m]=data[i][m+1];
data[i][3]=0;
n++;
}else j++;
}
}
if(compareData()==0)
{
rands();
}
}
void moveRIGHT()//向右移动操作
{
int i,j;
int m=0,n=0;
for(i=0;i<4;i++)
{
//移动操作
j=3;n=0;
while(n<3 && j>0)
{
if(data[i][j]==0)
{
for(m=j;m>0;m--)data[i][m]=data[i][m-1];
data[i][0]=0;
n++;
}else j--;
}
//合并操作
for(j=3;j>0;j--)
if(data[i][j]==data[i][j-1] && data[i][j]!=0)
{
data[i][j]=data[i][j]*2;
data[i][j-1]=0;
score_i=data[i][j];//得分
score=score+score_i;
}
//移动操作
j=3;n=0;
while(n<3 && j>0)
{
if(data[i][j]==0)
{
for(m=j;m>0;m--)data[i][m]=data[i][m-1];
data[i][0]=0;
n++;
}else j--;
}
}
if(compareData()==0)
{
rands();
}
}
void updateWithInput()//与输入有关的更新
{
int keyboard;
EndBatchDraw();//结束批量绘图
keyboard=getch();
int i,j,num=0;
copyData();
if(keyboard==72)//上
{
moveUP();
}
else if(keyboard==80)//下
{
moveDOWN();
}
else if(keyboard==75)//左
{
moveLEFT();
}
else if(keyboard==77)//右
{
moveRIGHT();
}
if(keyboard==27)
lent();
else if(keyboard=='t')
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
data[i][j]=0;
score=0;
rands();
rands();
}
else if(keyboard=='n')
{
mciSendString("open \".\\配置\\背景音乐.mp3\" alias music ", NULL, 0, NULL);//背景音乐
mciSendString("play music", NULL, 0, NULL);
}
else if(keyboard=='f')
{
mciSendString("close music", NULL, 0, NULL);
}
}
void win()
{
mciSendString("close music", NULL, 0, NULL);
mciSendString("open \".\\配置\\胜利.mp3\" alias music ", NULL, 0, NULL);//背景音乐
mciSendString("play music", NULL, 0, NULL);
cleardevice();//清屏
settextcolor(RGB(249,6,43));
setfont(40,0,"Microsoft Yahei UI Bold");
RECT C2={60,300,640,790};
drawtext("恭喜你完成了,真不错啊小伙子,继续努力。",&C2,DT_WORDBREAK);
RECT R1={2,HEIGHT-200,WIDTH-2,HEIGHT-2};
drawtext("回到主页面",&R1,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
MOUSEMSG m;
while(1)
{
m=GetMouseMsg();
if(m.uMsg==WM_LBUTTONDOWN)
{
if(m.x>2&&m.x<WIDTH-2&&m.y>HEIGHT-200&&m.y<HEIGHT-2)
mciSendString("close music", NULL, 0, NULL);
lent();
}
}
}
void lose()
{
mciSendString("close music", NULL, 0, NULL);
mciSendString("open \".\\配置\\失败.mp3\" alias music ", NULL, 0, NULL);//背景音乐
mciSendString("play music", NULL, 0, NULL);
cleardevice();//清屏
settextcolor(RGB(0,0,0));
setfont(40,0,"Microsoft Yahei UI Bold");
RECT C2={60,300,640,790};
drawtext("就这!!!你不行啊",&C2,DT_WORDBREAK);
RECT R1={2,HEIGHT-200,WIDTH-2,HEIGHT-2};
drawtext("回到主页面",&R1,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
MOUSEMSG m;
while(1)
{
m=GetMouseMsg();
if(m.uMsg==WM_LBUTTONDOWN)
{
if(m.x>2&&m.x<WIDTH-2&&m.y>HEIGHT-200&&m.y<HEIGHT-2)
mciSendString("close music", NULL, 0, NULL);
lent();
}
}
}
void start()
{
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
data[i][j]=0;
rands();
rands();
while(1)
{
show4();
BeginBatchDraw();//批量画图,无闪烁
setbkcolor(RGB(251,248,241));
updateWithInput();//与输入有关的更新
issuccess();
}
}
void lent()
{
mciSendString("close music", NULL, 0, NULL);
mciSendString("open \".\\配置\\背景音乐.mp3\" alias music ", NULL, 0, NULL);//背景音乐
mciSendString("play music repeat", NULL, 0, NULL);
initgraph(WIDTH,HEIGHT);//长宽
setbkcolor(RGB(251,248,241));//背景
settextcolor(RGB(150,126,104));
MOUSEMSG m;
while(1)
{
show1();
EndBatchDraw();//结束批量绘图
BeginBatchDraw();//批量绘图
m=GetMouseMsg();//获取鼠标信息
if(m.uMsg==WM_LBUTTONDOWN)
{ EndBatchDraw();//结束批量绘图
if(m.x>WIDTH/2-45&&m.x<WIDTH/2+45&&m.y>HEIGHT/3&&m.y<HEIGHT/3+30)
start();
else if(m.x>WIDTH/2-45&&m.x<WIDTH/2+45&&m.y>HEIGHT/3+30&&m.y<HEIGHT/3+60)
show2();
else if(m.x>WIDTH/2-45&&m.x<WIDTH/2+45&&m.y>HEIGHT/3+60&&m.y<HEIGHT/3+90)
show3();
else if(m.x>WIDTH/2-45&&m.x<WIDTH/2+45&&m.y>HEIGHT/3+90&&m.y<HEIGHT/3+120)
exit(0);
else if(m.x>78&&m.x<118&&m.y>140&&m.y<170)
{
mciSendString("open \".\\配置\\背景音乐.mp3\" alias music ", NULL, 0, NULL);//背景音乐
mciSendString("play music repeat ", NULL, 0, NULL);
}
else if(m.x>146&&m.x<188&&m.y>140&&m.y<170)
{
mciSendString("close music", NULL, 0, NULL);
}
}
}
_getch();
}
int main (void)
{
lent();
return 0;
}