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