C语言实现拼图小游戏

所属分类: 软件编程 / C 语言 阅读数: 127
收藏 0 赞 0 分享

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

效果图如下:

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

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

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

更多精彩内容其他人还在看

深入解析C++中派生类的构造函数

这篇文章主要介绍了深入解析C++中派生类的构造函数,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

解析C++中多层派生时的构造函数及一些特殊形式

这篇文章主要介绍了解析C++中多层派生时的构造函数及一些特殊形式,特殊形式主要针对基类和子对象类型的构造函数内容,需要的朋友可以参考下
收藏 0 赞 0 分享

简单介绍C++编程中派生类的析构函数

这篇文章主要介绍了C++编程中派生类的析构函数,析构函数平时一般使用较少,需要的朋友可以参考下
收藏 0 赞 0 分享

深入解析C++中类的多重继承

这篇文章主要介绍了深入解析C++中类的多重继承,包括多重继承相关的二义性问题,需要的朋友可以参考下
收藏 0 赞 0 分享

详解C++中基类与派生类的转换以及虚基类

这篇文章主要介绍了详解C++中基类与派生类的转换以及虚基类,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

解析C++编程中的继承方面的运用

这篇文章主要介绍了解析C++编程中的继承方面的运用,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

详解C++编程的多态性概念

这篇文章主要介绍了C++编程的多态性概念,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

c++统计文件中字符个数代码汇总

本文给大家汇总介绍了3种使用C++实现统计文件中的字符个数的方法,非常的简单实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

详解C++编程中的虚函数

这篇文章主要介绍了详解C++编程中的虚函数,包括在什么情况下应当声明虚函数的相关讲解,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言putenv()函数和getenv()函数的使用详解

这篇文章主要介绍了C语言putenv()函数和getenv()函数的使用详解,用来进行环境变量的相关操作,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多