#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include //包含getch()函数
#include
#include
#pragma comment(lib,"Winmm.lib")
#define WIDTH 480
#define HEIGHT 680int 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.xHEIGHT - 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.xHEIGHT - 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;elsenum = 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; //最后一行置0n++; //移动的次数+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.xHEIGHT - 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.xHEIGHT - 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.xHEIGHT / 3 && m.y < HEIGHT / 2-30)start();else if (m.x > 20 && m.xHEIGHT / 3 + 30 && m.y < HEIGHT / 2 )show2();else if (m.x > 20 && m.xHEIGHT / 3 + 60 && m.y < HEIGHT / 2 + 60)show3();else if (m.x > 20 && m.xHEIGHT / 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;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!