200行代码让你找回童年的记忆,C + EasyX实现《拼图》小游戏!

游戏思路:

  1. 每张图片都有一个数字对应 空用0表示
  2. 使用二维数组 保存每个图片对应的数据
  3. 鼠标点击图片 向周围空地移动
  4. 判断游戏 是否游戏胜利

需要的素材:
在这里插入图片描述

游戏效果如下所示:
在这里插入图片描述


代码如下所示:

#include <graphics.h>		//图形界面库
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <mmsystem.h>		//音乐头文件
#pragma comment (lib,"winmm")		//库文件

class JigsawPuzzle		//拼图的类
{
private:
	const int Size = 640;		//游戏界面大小
	IMAGE img[9];
	int arr[3][3] = { 0 };		//存储地图元素的意思
	int arr_fz[9] = { 0 };		//9 个数字 随机不重复

public:

	void InitRun();			//初始化游戏开始界面
	void InitLinePic();			//开始游戏之后的画面
	void RunGame();				//开始游戏
	bool JudgeGame();			//判断游戏
};


int main()
{
	srand((unsigned)time(nullptr));
	JigsawPuzzle jigsawpuzzle;

	jigsawpuzzle.InitRun();
	jigsawpuzzle.RunGame();

	return 0;
}


void JigsawPuzzle::InitRun()
{
	initgraph(Size, Size, SHOWCONSOLE);

	mciSendString("play bj.mp3 repeat", 0, 0, 0);

	loadimage(nullptr, "start.jpg", 640, 640);

	//rectangle(Size / 2 - 80, Size / 2 + 30, Size / 2 + 80, Size / 2 + 90);

	settextstyle(40, 15, "楷体");
	settextcolor(RED);
	setbkmode(TRANSPARENT);
	outtextxy(Size / 2 - 60, Size / 2 + 40, "开始拼图");

	MOUSEMSG msg;

	while (1)			//改变颜色
	{
		msg = GetMouseMsg();		//获取鼠标消息

		if (msg.x - (Size / 2 - 80) < 160 && msg.x - (Size / 2 - 80) > 0 && msg.y - (Size / 2 + 30) < 60 && msg.y - (Size / 2 + 30) > 0)
		{
			settextcolor(RGB(0, 255, 255));
			if (msg.mkLButton)
				break;
		}
		else
			settextcolor(RED);
		outtextxy(Size / 2 - 60, Size / 2 + 40, "开始拼图");
	}

	InitLinePic();		// 开始拼图后的画面

}

void JigsawPuzzle::InitLinePic()
{
	setbkcolor(RGB(0, 255, 255));
	cleardevice();

	setlinecolor(GREEN);

	for (int i = 1; i < 3; i++)
	{
		line(0, i * 213, Size, i * 213);
		line(i * 213, 0, i * 213, Size);
	}

	for (int i = 0; i < 9; i++)			//九个数字不重复		//只用一次   赋值给二维数组arr
	{
		arr_fz[i] = rand() % 9 + 1;

		for (int j = i - 1; j >= 0; j--)
		{
			if (arr_fz[i] == arr_fz[j])
			{
				i--;
				break;
			}
		}
	}


	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
			arr[i][j] = arr_fz[i * 3 + j];
	}


	//加载图片		存放的图片不是按顺序来的 跟arr_fz里面的数据一样
	char buf[16];
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			memset(buf, 0, sizeof(buf));
			sprintf(buf, "pic\\%d.jpg", arr[i][j]);
			loadimage(&img[i], buf, 180, 180);

			putimage(j * 213 + 20, i * 213 + 20, &img[i]);
		}
	}
}


void JigsawPuzzle::RunGame()
{
	MOUSEMSG msg;		//
	BeginBatchDraw();
	while (1)
	{
		msg = GetMouseMsg();

		if (msg.mkLButton)
		{
			if (JudgeGame() == true)
			{
				MessageBox(nullptr, "            游戏胜利", "	 拼图游戏", MB_OK);
				exit(0);
			}
			for (int i = 0; i < 3; i++)
			{
				for (int j = 0; j < 3; j++)
				{
					//鼠标点击到了一块拼图
					if (msg.x - (j * 213 + 20) < 180 && msg.y - (i * 213 + 20) < 180 &&
						msg.x - (j * 213 + 20) > 0 && msg.y - (i * 213 + 20) > 0)
					{
						if (i - 1 >= 0 && arr[i - 1][j] == 3)// || arr[i / 3 + 1][i % 3] == 3 || arr[i / 3][i % 3 - 1] == 3 || arr[i / 3][i % 3 + 1] == 3)
						{
							int t = arr[i - 1][j];
							arr[i - 1][j] = arr[i][j];
							arr[i][j] = t;
							break;
						}
						else if (i + 1 <= 2 && arr[i + 1][j] == 3)
						{
							int t = arr[i + 1][j];
							arr[i + 1][j] = arr[i][j];
							arr[i][j] = t;
							break;
						}
						else if (j - 1 >= 0 && arr[i][j - 1] == 3)
						{
							int t = arr[i][j - 1];
							arr[i][j - 1] = arr[i][j];
							arr[i][j] = t;
							break;
						}
						else if (j + 1 <= 2 && arr[i][j + 1] == 3)
						{
							int t = arr[i][j + 1];
							arr[i][j + 1] = arr[i][j];
							arr[i][j] = t;
							break;
						}
					}
				}
			}

			char buf[16];
			for (int i = 0; i < 3; i++)
			{
				for (int j = 0; j < 3; j++)
				{
					memset(buf, 0, sizeof(buf));
					sprintf(buf, "pic\\%d.jpg", arr[i][j]);
					loadimage(&img[i], buf, 180, 180);

					putimage(j * 213 + 20, i * 213 + 20, &img[i]);
				}
			}
			std::cout << std::endl;
			for (int i = 0; i < 3; i++)
			{
				for (int j = 0; j < 3; j++)
				{
					std::cout << arr[i][j];
				}
				std::cout << std::endl;
			}


		}
		EndBatchDraw();
	}

}


bool JigsawPuzzle::JudgeGame()
{
	if (arr[0][0] == 1 && arr[0][1] == 2 && arr[0][2] == 3 &&
		arr[1][0] == 4 && arr[1][1] == 5 && arr[1][2] == 6 &&
		arr[2][0] == 7 && arr[2][1] == 8 && arr[2][2] == 9)
	{
		return true;
	}
	else
		false;
}

猜你喜欢

转载自blog.csdn.net/weixin_42100963/article/details/107447491