C语言小游戏:拼图游戏

最近闲着无聊,写了一个拼图游戏,正好学习一下图片的处理。

效果图如下:

程序中用到了图形库操作,把一张图片分割,用一个二维数组代表各个碎片,初始打乱数组就可以得到打乱的图片。

void get_arr()
{
	int book[10] = { 0 };
	srand((unsigned int)time(NULL));                 //设置时间种子
	for(int i=0; i<3; i++)                           //随机arr数组,打乱图片顺序
		for (int j = 0; j < 3; j++)
		{
			if (i == 2 && j == 2)
				break;
			while (1)
			{
				int s = rand() % 8;
				if (book[s] == 0)
				{
					book[s] = 1;
					arr[i][j] = s;
					break;
				}
			}
		}
	arr[2][2] = 9;
}

因为这里数字并不大,所以我就暴力写了一下。

总共有5张图片,为了简化难度,我加了一张纯数字的。

 

 部分截图:

 

拼图成功后,会出现拼图成功的提示,因为素材限制,只能弄成下面的样。

部分游戏截图:

全部的代码和素材:

https://download.csdn.net/download/qq_41505957/11446221

下面是代码:

#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <windows.h>
#include <conio.h>
#include<time.h> 
#include <iostream>
#include <algorithm>
#define N 600             //图片长和宽,为便于计算取600
#define M N/3             //分为9块,每块有
using namespace std;
IMAGE t, over;
int arr[5][5];

void get_arr()
{
	int book[10] = { 0 };
	srand((unsigned int)time(NULL));                 //设置时间种子
	for(int i=0; i<3; i++)                           //随机arr数组,打乱图片顺序
		for (int j = 0; j < 3; j++)
		{
			if (i == 2 && j == 2)
				break;
			while (1)
			{
				int s = rand() % 8;
				if (book[s] == 0)
				{
					book[s] = 1;
					arr[i][j] = s;
					break;
				}
			}
		}
	arr[2][2] = 9;
}
void choosephoto()
{
	int choose;
	srand((unsigned int)time(NULL));                 //设置时间种子
	choose = rand() % 5;							 //选择图片
	if(choose==0)
		loadimage(&t, "少司命.jpeg", N, N);                //加载图片
	if (choose == 1)
		loadimage(&t, "柯南.jpg", N, N);
	if (choose == 2)
		loadimage(&t, "马里奥.jpeg", N, N);
	if (choose == 3)
		loadimage(&t, "火影.jpeg", N, N);
	if (choose == 4)
		loadimage(&t, "数字.png", N, N);
}
void Game()                          //显示拼图
{
	initgraph(N, N);
	
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			putimage(j * M, i * M, M, M, &t, arr[i][j]%3*M, arr[i][j]/3*M);     //切割图片
		}
	}
}
int GameOver()
{
	int temp = 1;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (arr[i][j] != 3 * i + j)
			{
				temp = 0;
				break;
			}
		}
		if (temp == 0)
			break;
	}
	if (temp == 1)
	{
		loadimage(&over, "游戏结束.png", 400, 400);
		putimage(100, 100, &over);
		return 1;
	}
}
void Gamestart()
{
	char ch;
	int tx, ty;
	
	while (1)
	{
		if (_kbhit()) {                     //检测键盘输入
			for (int i = 0; i < 3; i++)
			{
				for (int j = 0; j < 3; j++)
					if (arr[i][j] == 9)
					{
						tx = i;
						ty = j;
						break;
					}
			}
			ch = _getch();
			if (ch == 72 || ch=='w')                          //按键为w或者上
			{
				if (tx >= 1)
				{
					//swap(arr[tx][ty], arr[tx - 1][ty]);	
					int x = arr[tx][ty];
					arr[tx][ty] = arr[tx - 1][ty];
					arr[tx - 1][ty] = x;
				}
			} 
			else if (ch == 75 || ch=='a')                //按键为a或者左
			{
				if (ty >= 1)
				{
					int x = arr[tx][ty];
					arr[tx][ty] = arr[tx][ty - 1];
					arr[tx][ty - 1] = x;
				}
			}
			else if (ch == 80 || ch=='s')               //按键为s或者下
			{
				if (tx < 2)
				{
					int x = arr[tx][ty];
					arr[tx][ty] = arr[tx + 1][ty];
					arr[tx + 1][ty] = x;
				}
			}
			else if (ch == 77 || ch=='d')                //按键为d或者右
			{
				if (ty < 2)
				{
					int x = arr[tx][ty];
					arr[tx][ty] = arr[tx][ty + 1];
					arr[tx][ty + 1] = x;
				}
			}

			Game();                                   //输出拼图界面
			if (GameOver())
				break;
		}
	}
	while (ch=getchar())
		if (ch == '\n')
			break;

}

int main()
{	
	get_arr();                  //获取初始数组
	choosephoto();             //选择图片
	Game();                    //输出起始拼图
	Gamestart();               //游戏开始
	system("pause");
	closegraph();              //关闭画布
	return 0;
}

 

 

posted @ 2019-07-29 16:18  宿星  阅读(817)  评论(0编辑  收藏  举报