拼图_游戏(C语言--vs2019编译器)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <easyx.h>//引用图形库头文件
#include<mmsystem.h>//系统多媒体头文件
#pragma comment(lib,"winmm.lib")//多媒体库
#define ROW 4
#define COL 4
int map[ROW][COL];//存储序号
IMAGE img [ROW][COL];//存储序号对应的图片
IMAGE* pimg = (IMAGE*)img;
IMAGE img_total;//图片总
void gameInit()
{
	//把map里面的数据从小到大赋值(从0开始)
	//0   1   2    3
	//4   5   6    7
	//8   9   10  11
	//12 13 14  15
	int cnt = 0;
	for (int i=0;i<ROW;i++)
	{
		for (int j=0;j<COL;j++)
		{
			map[i][j] = cnt++;
		}
	}
	//打乱序号
	for (int i=0;i<100;i++)
	{
		int r1, c1;
		int r2, c2;
		r1 = rand() % ROW;
		c1 = rand() % COL;
		r2 = rand() % ROW;
		c2 = rand() % COL;
		int t = map[r1][c1];
		map[r1][c1] = map[r2][c2];
		map[r2][c2] = t;
	}
	//加载图片
	loadimage(&img_total, _T("妮寇.jpg"), getwidth(), getheight());
	//切割图片并保存
	SetWorkingImage(&img_total);
	for (int i=0;i<ROW;i++)
	{
		for (int j=0;j<COL;j++)
		{
			getimage(&img[i][j], j * 100, i * 100, 100, 100);
		}
	}
	SetWorkingImage();
	loadimage(&img[ROW - 1][COL - 1], _T("white.png"), 100, 100);
}
void gameDraw()
{
	//将序号与图片建立联系
	for (int i=0;i<ROW;i++)
	{
		for (int j=0;j<COL;j++)
		{
			putimage(j * 100, i * 100, &pimg[map[i][j]]);
		}
	}
	//setlinecolor(RED);
	//把线画出来
	for (int i=0;i<=ROW;i++)
	{
		line(0, i * 100, getwidth(), i * 100);//横线
		line(i*100,0,i*100,getheight());//竖线
	}
}
void showmap()
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			printf("%2d ", map[i][j]);
		}
		printf("\n");
	}
}
void MouseEvent()
{
	//获取鼠标信息
	ExMessage msg = getmessage();
	//针对不同鼠标消息进行处理
	if (msg.message == WM_LBUTTONDOWN)
	{
		int r=msg.y/100;
		int c=msg.x/100;
		//获取白块数组   序号15
		int wr = 0;
		int wc = 0;
		for (int i=0;i<ROW;i++)
		{
			for (int j=0;j<COL;j++)
			{
				if (map[i][j] == 15)
				{
					wr = i;
					wc = j;
				}
			}
		}
		if (r == wr + 1 && c == wc||
			r== wr -1 && c==wc ||
			r==wr && c==wc+1 ||
			r==wr && c==wc-1
			)
		{
			int t = map[r][c];
			map[r][c] = map[wr][wc];
			map[wr][wc] = t;
		}
	}
	else if (msg.message == WM_RBUTTONDOWN)
	{
		//冒泡排序
		int* p = (int*)map;//二维转一维
		//确定趟数
		for (int i=0;i<ROW*COL-1;i++)
		{
			//确定对数
			for (int j=0;j<ROW*COL-1-i;j++)
			{
				if (p[j] > p[j + 1])
				{
					int t = p[j];
					p[j] = p[j + 1];
					p[j + 1] = t;
				}
			}
		}
	}
}
bool judge()
{
	int* p = (int*)map;
	for (int i=0;i<ROW*COL-1;i++)
	{
		if (p[i] > p[i + 1])
			return false;
	}
	return true;
}
int main()
{
	srand((unsigned int)time(NULL));
	//初始化图形窗口
	initgraph(400, 400,EX_SHOWCONSOLE);
	//打开音乐
	mciSendString("open aaa.mp3", NULL, 0, NULL);
	//播放音乐
	mciSendString("play aaa.mp3", NULL, 0, NULL);
	gameInit();
	showmap();
	//双缓冲绘图
	BeginBatchDraw();
	while (true)
	{
		gameDraw();
		FlushBatchDraw();
		if (judge())
		{
			MessageBox(GetHWnd(), _T("恭喜你,过关鸟!!!"), _T("boom"), MB_OK);
			exit(0);
		}
		MouseEvent();
	}
	EndBatchDraw();
	getchar();//防止界面闪退
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值