C++基于EasyX库实现拼图小游戏

 更新时间:2021年07月23日 08:37:27   作者:好吃的秋梨膏  
这篇文章主要为大家详细介绍了C++基于EasyX库实现拼图小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

用C++的EasyX库做的拼图小游戏,供大家参考,具体内容如下  

记录一下自己做的第一个项目,还有一些改进空间QWQ,可以支持难度升级,但是通关判断似乎有点小问题肯定不是我菜通不了关 。

#pragma once
#include <iostream>
#include <graphics.h>
#include <Windows.h>
#include <algorithm>
#include <easyx.h>
#include <cstdlib>
#include <random>
#include <cmath>
using namespace std;

static const int MAX_MAP = 30;     //定义最大行或者列分块常量
int check[MAX_MAP][MAX_MAP];     //检查数组
int map[MAX_MAP][MAX_MAP];      //序号储存
int random[MAX_MAP * MAX_MAP];     //随机化数组
IMAGE img_total;        //原图片
IMAGE img_blank;        //白底
IMAGE img[MAX_MAP][MAX_MAP];     //储存分块图片

int level = 3;         //关卡难度
int width_temp = 0;        //分块宽度
int height_temp = 0;       //分块高度
int flagi = 0;         //标记块行位置
int flagj = 0;         //标记块列位置
int mousei = 0;         //标记鼠标位置
int mousej = 0;         //标记鼠标位置
int FLAG = 0;         //胜利标记

void Get_graphics();       //读取图片并预载到原图中
void Set_graphics();       //设置好图片位置及对应关系
void Line_flush();        //画线条分割图片
void Rand_array();        //初始化随机数组
void Get_mouse();        //获取鼠标操作
void Judge_graphics();       //判定是否通关并选择是否下一关
void Show_graphics();       //显示分块图片

inline void Get_graphics()      //读取图片并预载到原图中
{
 loadimage(&img_total, L"1.png");
 loadimage(&img_blank, L"0.png");
 initgraph(img_total.getwidth(), img_total.getheight());
}

inline void Set_graphics()      //设置好图片位置及对应关系
{
 width_temp = img_total.getwidth() / level;
 height_temp = img_total.getheight() / level;
 //载入各分块的图片
 SetWorkingImage(&img_total);
 for (int i = 0; i < level; i++)
 {
  for (int j = 0; j < level; j++)
   getimage(&img[i][j], i * width_temp, j * height_temp, width_temp, height_temp);
 }
 SetWorkingImage();
 //校验数组初始化
 int cnt = 0;
 for (int i = 0; i < level; i++)
 {
  for (int j = 0; j < level; j++)
  {
   check[i][j] = cnt;
   cnt++;
  }
 }
}

inline void Line_flush()        //画线条分割图片
{
 for (int i = 0; i < level; i++)
 {
  //setlinecolor(RED);   //可以更改线条颜色 默认白色
  line(i * width_temp, 0, i * width_temp, img_total.getheight());
  line(0, i * height_temp, img_total.getwidth(), i * height_temp);
 }
}

inline void Rand_array()        //初始化随机数组
{
 for (int i = 0; i < level * level; i++)
  random[i] = i;

 random_device rd;
 mt19937 g(rd());         // 随机数引擎
 shuffle(random, random + level * level, g);   // 打乱顺序

 int cnt = 0;
 for (int i = 0; i < level; i++)
 {
  for (int j = 0; j < level; j++)
  {
   map[j][i] = random[cnt];     //逆转赋值1
   cnt++;
  }
 }
}

void Get_mouse()
{
 MOUSEMSG msg = GetMouseMsg();
 if (msg.uMsg == WM_LBUTTONDOWN)
 {
  mousei = msg.x / width_temp;
  mousej = msg.y / height_temp;
  if ((mousei + 1 == flagi && mousej == flagj) ||
   (mousei == flagi && mousej + 1 == flagj) ||
   (mousei - 1 == flagi && mousej == flagj) ||
   (mousei == flagi && mousej - 1 == flagj))
  {
   //交换图片分块
   swap(map[mousej][mousei], map[flagj][flagi]);
  }
 }
}

void Judge_graphics()
{
 int cnt = 0;
 for (int i = 0; i < level; i++)
 {
  for (int j = 0; j < level; j++)
  {
   if (map[i][j] == check[i][j])
    cnt++;
  }
 }
 if (cnt == level * level)
 {
  MessageBox(GetHWnd(), _T("过关了."), _T("消息提示."), MB_OK);
  FLAG = 1;
  exit(0);
 }
}

inline void Show_graphics()         //显示分块图片
{
 for (int i = 0; i < level; i++)
 {
  for (int j = 0; j < level; j++)
  {
   if (map[j][i] == level * level - 1)    //逆转赋值2
   {
    flagi = i;
    flagj = j;
    putimage(i * width_temp, j * height_temp, &img_blank);
   }
   else
   {
    int countj = map[j][i] % level;
    int counti = map[j][i] / level;
    putimage(i * width_temp, j * height_temp, &img[countj][counti]);
   }
  }
 }
 Line_flush();
}

int main()
{
 Get_graphics();
 Set_graphics();
 Rand_array();
 Show_graphics();

 while (1)
 {
  BeginBatchDraw();   //双缓冲防止闪烁
  Get_mouse();
  Show_graphics();
  EndBatchDraw();    //双缓冲防止闪烁
  Judge_graphics(); 
 }

 if (FLAG)
 {
  putimage(0, 0, &img_total);
  FLAG = 0;
 }

 system("pause");
 return 0;
}

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

相关文章

  • C语言中关于库函数 qsort 的模拟实现过程

    C语言中关于库函数 qsort 的模拟实现过程

    库函数的模拟实现有利于我们去深入了解这个函数内部是怎样实现的,以及学习它的算法,使我们更加了解这个函数该怎样去使用,接下来我将详细的介绍qsort的应用及用法,并且用代码模拟实现它们的功能
    2021-09-09
  • VS2019配置opencv详细图文教程和测试代码的实现

    VS2019配置opencv详细图文教程和测试代码的实现

    这篇文章主要介绍了VS2019配置opencv详细图文教程和测试代码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • C语言数据结构之线性表的链式存储结构

    C语言数据结构之线性表的链式存储结构

    线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列,这篇文章带你学习下线性表的链式存储结构
    2021-11-11
  • Qt使用SQLite数据库实现数据增删改查

    Qt使用SQLite数据库实现数据增删改查

    这篇文章主要为大家详细介绍了Qt如何使用SQLite数据库实现数据增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-06-06
  • C++ 函数模板和类模板详情

    C++ 函数模板和类模板详情

    这篇文章主要对C++ 函数模板和类模板的相关资料的详细介绍,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • C语言栈的表示与实现实例详解

    C语言栈的表示与实现实例详解

    这篇文章主要介绍了C语言栈的表示与实现,对于数据结构与算法的研究有一定的借鉴价值,需要的朋友可以参考下
    2014-07-07
  • C语言中字符串处理函数sscanf的用法

    C语言中字符串处理函数sscanf的用法

    一直对于一些日期字符串中数字的提取比较头疼,现看到 sscanf 对于字符串中的内容提取较方便,本文主要介绍了C语言中字符串处理函数sscanf的用法,具有一定参考价值,感兴趣的可以了解一下
    2023-08-08
  • C语言实现24点游戏源代码

    C语言实现24点游戏源代码

    这篇文章主要为大家详细介绍了C语言实现24点游戏源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • C++实现动态烟花代码

    C++实现动态烟花代码

    这篇文章主要介绍了利用C++实现的放烟花程序,用到了EGE图形库,文中的示例代码讲解详细,对我们学习C++有一定帮助,需要的可以参考一下
    2023-01-01
  • c++ 指针与引用的区别介绍及使用说明

    c++ 指针与引用的区别介绍及使用说明

    指针与引用看上去完全不同(指针用操作符*和->,引用使用操作符.),但是它们似乎有相同的功能,感兴趣的朋友可以了解下啊,或许本文对你有所帮助,好了,话不多说,切入正题
    2013-01-01

最新评论