赵yuxuan专用

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值