C语言实现拼图游戏

C语言 专栏收录该内容
8 篇文章 0 订阅

C语言实现拼图游戏

这篇文章主要为大家详细介绍了C语言实现拼图游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下哦~

1.实现图形界面
一维数组,二维数组,图形库里面的贴图
图形库(画矩形,填充颜色),音乐播放,鼠标操作
2.加载资源
切割技术,用到随机函数,随机产生一维数组下标,然后赋值给二维数组进行初始化。
3.贴图
我这里4行4列的。遍历二维数组进行 贴图。
4.游戏过程
主要是鼠标操作,遇到空白的一块,左右上下都可以交换。

/************************************************************************
*  项目名称:拼图游戏
*  项目描述:图片切割,随机函数,一维二维间的赋值,音乐播放
*  项目环境:VS2019
*  生成日期:2020-8-11
*  作者所属:LYX新
*************************************************************************/
#define _CRT_SECURE_NO_WARNINGS //如果您使用的不是VS系列请把第一行注释掉
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<mmsystem.h>
#include<time.h>
#pragma comment(lib,"winmm.lib")
HWND hwnd;            //句柄
//IMAGE 图像类
IMAGE mm[8];          //第一张图片
IMAGE white;          //白色方块
int map[4][4];        //地图
int NUMBER = -1;      //当前照片序号
int main();

//加载资源
void loadResoure()    
{
	
	char name[10];
	//利用for循环批量加载图片到mm数组
	loadimage(&mm[0], "MM.jpg", 800, 800);      //加载第一个图片文件
	loadimage(&white, "白块.jpg", 200, 200);    //加载白色图片文件
	//加载第2个到第8个文件
	for (int i = 1; i < 8; i++)
	{
		sprintf(name,"%d.jpg", i);           //sprintf的作用是将一个格式化的字符串输出到一个目的字符串中
		loadimage(&mm[i], name, 800, 800);   //从图片文件获取图像加载到mm数组中,将图片文件设置大小为800x800支持(bmp/gif/jpg/png/tif/emf/wmf/ico)图片文件   
	}
}

//画出地图
void drawMap()
{
	//根据map的值画出地图
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			int x = j * 200;           
			int y = i * 200;
			if (map[i][j] == 15)         //如果为15,打印白色的图片
				putimage(x, y, &white);
			else
				//以下局部代码将mm[NUMBER]所指图片文件 ((map[i][j] % 4 * 200), (map[i][j] / 4 * 200)) 起始的 200x200 的图像拷贝至 (x,y) 位置
				putimage(x, y,200,200, &mm[NUMBER], (map[i][j] % 4 * 200), (map[i][j] / 4 * 200));
		}
	}
}

//返回白色图片的 y坐标,如果找不到则返回-1
int searchWhite_i()
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (map[i][j] == 15)
				return i;          
		}
	}
	return -1;  //没找到返回-1,因为-1不是数组下标
}
//返回白色图片的 x坐标,如果找不到则返回-1
int searchWhite_j()
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (map[i][j] == 15)
				return j;
		}
	}
	return -1;  //没找到返回-1,因为-1不是数组下标
}

//判断游戏是否结束,没有结束返回1,否则返回0
int gameOver()
{
	int count = 0;
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (map[i][j] != count++)
			{
				return 0;
			}
		}
	}
	return 1;
}

//开始游戏
void playGame()
{
	MOUSEMSG m;                //创建储存鼠标信息变量
	while (TRUE)               //一直循环直到游戏结束
	{
		drawMap();             //画出地图
		if (gameOver())        //判断是否拼出该图形,条件成立弹出提示并开始下一关,否则继续游戏
		{
			if (MessageBox(hwnd, "成功啦,是否要继续", "拼图游戏", MB_YESNO) == IDYES)
			{
				main();
			}
			exit(0);          //结束程序,0为正常退出
		}
		m = GetMouseMsg();    //获取一个鼠标消息。如果没有,就等待
		int w_i = searchWhite_i();     //获取白色方块的y坐标
		int w_j = searchWhite_j();	   //获取白色方块的x坐标
		int m_i;
		int m_j;
		switch (m.uMsg)
		{
		case WM_LBUTTONDOWN:
			m_i = m.y / 200;           //换算成鼠标左键点击图片的所对数组Map的值

			m_j = m.x / 200;			   //换算成鼠标左键点击图片的所对数组Map的值

			if (w_i == m_i && w_j + 1 == m_j)    //如果点击的是白色图片左边的图片,所点击图片与白色图片交换位置
			{
				map[w_i][w_j] = map[m_i][m_j];
				map[m_i][m_j] = 15;
			}

			if (w_i == m_i && w_j - 1 == m_j)    //如果点击的是白色图片右边的图片,所点击图片与白色图片交换位置
			{
				map[w_i][w_j] = map[m_i][m_j];
				map[m_i][m_j] = 15;
			}

			if (w_i + 1 == m_i && w_j == m_j)    //如果点击的是白色图片下边的图片,所点击图片与白色图片交换位置
			{
				map[w_i][w_j] = map[m_i][m_j];
				map[m_i][m_j] = 15;
			}

			if (w_i - 1 == m_i && w_j == m_j)    如果点击的是白色图片上边的图片,所点击图片与白色图片交换位置
			{
				map[w_i][w_j] = map[m_i][m_j];
				map[m_i][m_j] = 15;
			}
			break;
		}
	}
}

int Num = 15;
int temp[15];
//判断参数n,是否在temp中存在,若存在数组元素前移返回1,否则返回0
bool Lookup(int n)
{
	for (int i = 0; i < Num; i++)
	{
		if (temp[i] == n)
		{
			for (int m = i; m < Num-1 ; m++)
			{
				temp[m] = temp[m + 1];
			}
			return 1;
		}
	}
	return 0;
}

void random()
{
	int Count = 0;            
	int Mumber = 0;           //计数
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			Mumber++;
			Count = temp[rand() % Num];  //利用辅助数组随机产生0 - 14不重复的数字
			if (Lookup(Count))
			{
				map[i][j] = Count;
				Num--;                   //赋值成功temp数值-1;
			}
			if (Mumber == 15)            //计数判断是否为map数组 赋15个值,因为最后一个值为15:白色图片的值
			{
				break;
			}
		}
	}
	map[3][3] = 15;                      //最后一个元素值为15:白色图片
}
int main(void)
{
	NUMBER++;                            //当前图片编号
	if (NUMBER == 8)                     //如果NUMBER == 8则弹出窗口并结束程序
	{
		MessageBox(hwnd, "恭喜您通关啦!", "拼图游戏", MB_OK);
		exit(0);
	}
	srand((unsigned int)time(NULL));
	
	for (int i = 0; i < 15; i++)    //为辅助数组赋值
	{
		temp[i] = i;
	}

	random();
	hwnd=initgraph(800, 800);       //初始化图形环境长为:800,宽为:800
	cleardevice();                  //清屏
	mciSendString("open Inspire.mp3", 0, 0, 0);   //加载背景音乐
	mciSendString("play Inspire.mp3", 0, 0, 0);   //播放背景音乐
	loadResoure();      //加载资源
	playGame();         //开始哟西
	closegraph();       //关闭图形环境
	return 0;
}

运营结果如图:
在这里插入图片描述
本篇到此结束。以下代码需要一些资源文件,如果需要请加我,如果您发现本篇中有什么错误或者需要补充的地方麻烦您在评论区留言,谢谢!
如果遇到什么问题欢迎大家进群讨论或者加我qq
群内有各种学习资料,欢迎大家一起来学习!
本人qq:846581636
qq学习群:759252814
期待你的关注
感谢大家的支持,谢谢!

  • 24
    点赞
  • 4
    评论
  • 72
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值