#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>//包含getch()函数
#include <string.h>
#include <graphics.h>
#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();//清屏
IMAGE img01;
loadimage(&img01, _T("01.jpg"));
putimage(0,0,&img01);
setbkmode(TRANSPARENT);//设置背景模式透明
setfont(30, 0, _T("楷体"));
RECT r1 = { 20,HEIGHT / 3,WIDTH ,HEIGHT / 2 };
drawtext(_T("开始游戏"), &r1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
RECT r2 = {20,HEIGHT / 3 + 30,WIDTH ,HEIGHT / 2 + 60 };
drawtext(_T("游戏介绍"), &r2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
RECT r3 = {20,HEIGHT / 3 + 60,WIDTH ,HEIGHT / 2 + 150 };
drawtext(_T("操作说明"), &r3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
RECT r4 = { 20,HEIGHT / 3 + 90,WIDTH ,HEIGHT / 2 + 210 };
drawtext(_T("退出游戏"), &r4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
setfillcolor(RGB(244, 186, 1));//设置当前的填充颜色
setfont(20, 0, _T("楷体"));//设置字体
TCHAR rq[] = _T("适度游戏益脑,沉迷游戏伤身");
outtextxy(115, 560, rq);
//settextcolor(RED);
TCHAR sbq[] = _T("合理安排时间,享受健康生活");
outtextxy(115, 580, sbq);
TCHAR sq[] = _T("作者:AAA2048市场批发");
outtextxy(155, 500, sq);
}
void show2()
{
cleardevice();//清屏
RECT C1 = { 60,60,640,790 };
drawtext(_T("\n\n\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(_T("返回"), &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 C2 = { 60,60,640,790 };
drawtext(_T("\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(_T("返回"), &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, _T("Microsoft Yahei UI Bold"));//设置字体
settextcolor(RGB(120, 116, 101));
outtextxy(15, 0, _T("2048"));
setfont(30, 0, _T("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));//字体颜色
TCHAR wq[] = _T("Music:on/off");
outtextxy(18, 90, wq);
solidroundrect(13, 140, 200, 200, 10, 10);
settextcolor(RGB(248, 247, 241));//字体颜色
TCHAR rq[] = _T("HAPPY");
outtextxy(18, 140, rq);
TCHAR fq[] = _T("GAME");
outtextxy(18, 170, fq);
setfillcolor(RGB(184, 175, 160));//设置当前填充颜色
solidroundrect(210, 10, 330, 80, 15, 15);//圆角梯形
setfont(28, 0, _T("Microsoft Yahei UI Bold"));//设置当前字体
setbkcolor(RGB(184, 175, 160));//背景颜色
settextcolor(RGB(248, 247, 241));//字体颜色
outtextxy(245, 20, _T("Score"));
TCHAR 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, _T("Total"));
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, _T("Microsoft Yahei UI Bold"));
outtextxy(248, 100, _T("Home Page(esc)"));
setfillcolor(RGB(141, 122, 105));
solidroundrect(210, 152, 460, 195, 15, 15);
setbkcolor(RGB(141, 122, 105));//背景颜色
setfont(33, 0, _T("Microsoft Yahei UI Bold"));
outtextxy(268, 160, _T("Restart(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, _T("0.jpg")); putimage(i * 110 + 20, j * 110 + 220, &img0); break;
case 2:loadimage(&img2, _T("2.jpg")); putimage(i * 110 + 20, j * 110 + 220, &img2); break;
case 4:loadimage(&img4, _T("4.jpg")); putimage(i * 110 + 20, j * 110 + 220, &img4); break;
case 8:loadimage(&img8, _T("8.jpg")); putimage(i * 110 + 20, j * 110 + 220, &img8); break;
case 16:loadimage(&img16, _T("16.jpg")); putimage(i * 110 + 20, j * 110 + 220, &img16); break;
case 32:loadimage(&img32, _T("32.jpg")); putimage(i * 110 + 20, j * 110 + 220, &img32); break;
case 64:loadimage(&img64, _T("64.jpg")); putimage(i * 110 + 20, j * 110 + 220, &img64); break;
case 128:loadimage(&img128, _T("128.jpg")); putimage(i * 110 + 20, j * 110 + 220, &img128); break;
case 256:loadimage(&img256, _T("256.jpg")); putimage(i * 110 + 20, j * 110 + 220, &img256); break;
case 512:loadimage(&img512, _T("512.jpg")); putimage(i * 110 + 20, j * 110 + 220, &img512); break;
case 1024:loadimage(&img1024, _T("1024.jpg")); putimage(i * 110 + 20, j * 110 + 220, &img1024); break;
case 2048:loadimage(&img2048, _T("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, _T("Microsoft Yahei UI Bold"));
RECT C2 = { 60,300,640,790 };
drawtext(_T("恭喜你完成了,真不错啊小伙子,继续努力。"), &C2, DT_WORDBREAK);
RECT R1 = { 2,HEIGHT - 200,WIDTH - 2,HEIGHT - 2 };
drawtext(_T("回到主页面"), &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, _T("Microsoft Yahei UI Bold"));
RECT C2 = { 60,300,640,790 };
drawtext(_T("就这!!!你不行啊"), &C2, DT_WORDBREAK);
RECT R1 = { 2,HEIGHT - 200,WIDTH - 2,HEIGHT - 2 };
drawtext(_T("回到主页面"), &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 > 20 && m.x<WIDTH && m.y>HEIGHT / 3 && m.y < HEIGHT / 2-30)
start();
else if (m.x > 20 && m.x<WIDTH && m.y>HEIGHT / 3 + 30 && m.y < HEIGHT / 2 )
show2();
else if (m.x > 20 && m.x<WIDTH && m.y>HEIGHT / 3 + 60 && m.y < HEIGHT / 2 + 60)
show3();
else if (m.x > 20 && m.x<WIDTH && m.y>HEIGHT / 3 + 90 && m.y < HEIGHT / 2 + 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)
{
//音乐循环播放
PlaySound("2048游戏音乐.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
lent();
return 0;
}
赵yuxuan专用
最新推荐文章于 2024-10-08 20:32:22 发布