C语言实现拼图小游戏

 更新时间:2020年03月27日 17:25:40   作者:张宜强  
这篇文章主要为大家详细介绍了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张图片,为了简化难度,我加了一张纯数字的。

部分截图:

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

部分游戏截图:

全部的代码和素材: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;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Qt实现TCP同步与异步读写消息的示例代码

    Qt实现TCP同步与异步读写消息的示例代码

    这篇文章主要为大家详细介绍了如何在 Qt 中实现 TCP 客户端和服务器的同步和异步读写消息,有需要的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • 详解设计模式中的中介者模式在C++编程中的运用

    详解设计模式中的中介者模式在C++编程中的运用

    这篇文章主要介绍了设计模式中的中介者模式在C++编程中的运用,中介者模式将对象间的通信封装到一个类中,将多对多的通信转化为一对多的通信,降低了系统的复杂性,需要的朋友可以参考下
    2016-03-03
  • C++将txt文件内容保存到数组的方法

    C++将txt文件内容保存到数组的方法

    今天小编就为大家分享一篇C++将txt文件内容保存到数组的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C语言函数调用的三种实现方法实例

    C语言函数调用的三种实现方法实例

    C语言中函数的调用主要有如下三种方法,直接调用,函数指针调用,函数指针传递调用其中后两种本质一样,但在有无返回值时还稍有差别,下面这篇文章主要给大家介绍了关于C语言函数调用的三种实现方法,需要的朋友可以参考下
    2022-01-01
  • c++引用传参和指针传参的区别及说明

    c++引用传参和指针传参的区别及说明

    这篇文章主要介绍了c++引用传参和指针传参的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • C++头文件和cpp文件的原理分析

    C++头文件和cpp文件的原理分析

    这篇文章主要介绍了C++头文件和cpp文件的原理分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 利用上下文属性将 C++ 对象嵌入 QML 里

    利用上下文属性将 C++ 对象嵌入 QML 里

    这篇文章主要介绍了利用上下文属性将 C++ 对象嵌入 QML里,将 QML 对象加载到 C++ 应用程序中时,直接嵌入一些可在 QML 代码中使用的 C++ 数据会很有用。例如,这使得在嵌入对象上调用 C++ 方法或使用 C++ 对象实例作为 QML 视图的数据模型成为可能,下面一起来学习该内容吧
    2021-12-12
  • Opencv实现图像灰度线性变换

    Opencv实现图像灰度线性变换

    这篇文章主要为大家详细介绍了Opencv实现图像灰度线性变换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • C++协程实现序列生成器的案例分享

    C++协程实现序列生成器的案例分享

    序列生成器通常的实现是在一个协程内部通过某种方式向外部传一个值出去,并且将自己挂起,本文围绕序列生成器这个经典的协程案例介绍了协程的销毁、co_await 运算符、await_transform 以及 yield_value 的用法,需要的朋友可以参考下
    2024-05-05
  • c++ map索引不存在的key可能导致的后果分析

    c++ map索引不存在的key可能导致的后果分析

    这篇文章主要介绍了c++ map索引不存在的key可能导致的后果分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论