最近闲着无聊,写了一个拼图游戏,正好学习一下图片的处理。
效果图如下:
程序中用到了图形库操作,把一张图片分割,用一个二维数组代表各个碎片,初始打乱数组就可以得到打乱的图片。
- 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张图片,为了简化难度,我加了一张纯数字的。
部分截图:
拼图成功后,会出现拼图成功的提示,因为素材限制,只能弄成下面的样。
部分游戏截图:
全部的代码和素材:C语言拼图游戏
下面是代码:
- #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;
- }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
原文链接:https://blog.csdn.net/qq_41505957/article/details/97647776