首页 > 编程语言 >c++拼图小游戏

c++拼图小游戏

时间:2023-05-16 22:23:45浏览次数:36  
标签:map 拼图 mi c++ mj int 小游戏 include pM

文件目录结构

 

 common.h

#pragma once
#include<iostream>
#include<graphics.h>//图形库
#include<array>//定长数组
#include<algorithm>//乱序算法
#include<functional>//仿函数
#include<ctime>//时间time函数的头文件
using namespace std;
//窗口属性类
//窗口的宽和高
#define WIDTH 800
#define HEIGHT 800
//每一小块图片的大小
#define IMGW 200
#define IMGH 200

game.h

#pragma once
#include "common.h"
#include "window.h"
#include "map.h"
class Game {
public:
Game();
void Run();//玩游戏过程
~Game();
protected:
Map* pM;
Window* pW;
};

map.h

#pragma once
#include "common.h"
class Map {
public:
//类外只能访问公有属性
Map(string whiteURL, string mmURL);
void drawMap();
//获取白块定位
int getWhiteRow();
int getWhiteCols();
//给类外提供一个接口 设置地图的属性
void setValue(int row, int cols, int value);
int getValue(int row, int cols);

protected:
//类外不能访问保护和私有属性
IMAGE whiteIMG;//白色图片
IMAGE mmIMG;//拼图图片
array<array<int, 4>, 4> map;//二维数组4*4定长数组,容器知识

 

};

window.h

#pragma once
#include "common.h"
class Window {
public:
Window(int w, int h, string url="", int flag = 0);//构造函数
void refresh();
~Window();

protected:
int width;
int height;
IMAGE background;
string imgURL;
};

game.cpp

 

#include "game.h"

Game::Game():pW(new Window(WIDTH,HEIGHT)),pM(new Map("white.jpg", "mm2.jpg"))
{

}

void Game::Run()
{
EASYXMSG m;//定义鼠标变量存储鼠标消息
while (1) {
peekmessage(&m, EM_MOUSE);
pM->drawMap();
//白块的行列
int i = pM->getWhiteRow();
int j = pM->getWhiteCols();
if (m.message == WM_LBUTTONDOWN) {
//得到鼠标的行列
int mi = m.y / IMGH;
int mj = m.x / IMGW;
if (i == mi && j + 1 == mj) {
pM->setValue(i, j, pM->getValue(mi, mj));
pM->setValue(mi, mj, 15);
}
if (i == mi && j - 1 == mj) {
pM->setValue(i, j, pM->getValue(mi, mj));
pM->setValue(mi, mj, 15);
}

if (i +1== mi && j == mj) {
pM->setValue(i, j, pM->getValue(mi, mj));
pM->setValue(mi, mj, 15);
}
if (i-1 == mi && j == mj) {
pM->setValue(i, j, pM->getValue(mi, mj));
pM->setValue(mi, mj, 15);
}


}
}
}

Game::~Game()
{
delete pM;
delete pW;
}

map.cpp

 

#include "map.h"

Map::Map(string whiteURL, string mmURL)
{
//加载资源
loadimage(&whiteIMG, whiteURL.c_str(), IMGW, IMGH);
loadimage(&mmIMG, mmURL.c_str(), WIDTH, HEIGHT);
//乱序算法
srand((unsigned int)time(nullptr));
array<int, 16> temp = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,1,15 };
random_shuffle(temp.begin(), temp.end() - 1);
//把一维数组中的值赋给二维数组
int count = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
map[i][j] = temp[count++];
}
}

}

void Map::drawMap()
{
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
int x = j * IMGW;
int y = i * IMGH;
//根据数组中的值去贴图
if (map[i][j] == 15) {
putimage(x, y, &whiteIMG);
}
else {
int row = map[i][j] / 4;
int cols = map[i][j] % 4;
int xx = cols * IMGW;
int yy = row * IMGH;
putimage(x, y, IMGW, IMGH, &mmIMG, xx, yy);
}
}
}
}

int Map::getWhiteRow()
{
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (map[i][j] == 15)
return i;
}

}
return -1;
}

int Map::getWhiteCols()
{
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (map[i][j] == 15)
return j;
}

}
return -1;
}

void Map::setValue(int row, int cols, int value)
{
map[row][cols] =value;
}

int Map::getValue(int row, int cols)
{
return map[row][cols];
}

window.cpp

#include "window.h"

Window::Window(int w, int h, string url, int flag)
{
width = w;
height = h;
imgURL = url;
//创建窗口
initgraph(w, h, flag);
if (url.size() != 0) {
loadimage(&background, url.c_str(), w, h);
putimage(0, 0, &background);
}
}

void Window::refresh()
{
if (imgURL.size() != 0) {
putimage(0, 0, &background);
}
else {
cleardevice();
}
}

Window::~Window()
{
closegraph();//关闭窗口
}

testGame.cpp

//窗口类
//地图类
//游戏类
#include "game.h"
int main() {

Game g;
g.Run();

return 0;
}

运行截图:

 

 

标签:map,拼图,mi,c++,mj,int,小游戏,include,pM
From: https://www.cnblogs.com/moxiaozhi/p/17407052.html

相关文章

  • C/C++银行账户管理系统程序[2023-05-06]
    C/C++银行账户管理系统程序[2023-05-06]编写一个银行账户管理系统程序。银行客户信息以一个账户一条记录的形式存储,每个账户记录包含的信息有身份标识号(ID)、姓名、电话、电子邮箱、身份证号、银行卡号、账户余额等信息。具体功能如下:对于银行客户实现①开户,若无账户,申请开户......
  • 1012 数字分类(C++)
    一、问题描述:给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1​ =能被5整除的数字中所有偶数的和;A2​ =将被5除后余1的数字按给出顺序进行交错求和,即计算 n1​−n2​+n3​−n4​⋯;A3​ =被5除后余2的数字的个数;A4​ =被5除后余3的数字......
  • C++学习简记Ⅱ
    二C++数组Array可以在堆(heap)上创建一个数组int*another=newint[5];//其作用域与在栈上创建不同,直到程序把它销毁之前,它都是处于活动状态的,需要用delete关键字来删除delete[]another;使用new动态分配最大的原因是生存期,用new来分配的内存,它将一直存在,直到手动删......
  • C++学习简记Ⅰ
    一指针内容在C中已经熟悉指针本身为一个代表地址的整数指针的*运算符通常被称为dereference运算符,可逆引用指针。引用引用必须引用已经存在的变量,其本身不是变量也不占用内存,相当于变量的别名使用int&类此的形式声明引用变量其作用为向函数传递变量,而不是只传递值,这使......
  • 【C++深度解析】9、const 常量?只读变量?
    文章目录1const常量的判别准则1.1编程实验2小结看了前面的关于const的内容,不知道是不是有疑问,const什么时候为只读变量,什么时候是常量?1const常量的判别准则只有用字面量初始化的const常量才会进入符号表使用其他变量初始化的const常量仍然是只读变量被volatile修......
  • c++打卡第二十八天
    一、以圆类Circle及立体图形类Solid为基础设计圆柱类Cylinder1、题目描述以点类Point及平面图形类Plane为基类公有派生圆类Circle,再以圆类Circle及立体图形类Solid为基类公有派生圆柱类Cylinder,main(void)函数完成对圆柱类Cylinder的测试。Point类结构说明:Point类的数据成员......
  • c++ - 为什么要在构造函数上使用 constexpr?
    我知道 constexpr 允许您在编译时将对象用作常量,但是什么时候这会有益呢?我试图更好地理解关键字,但我找不到一个很好的例子来解释为什么需要它的构造函数。下面的两个例子都有效,那么为什么要将constexpr放在构造函数上呢?在构造函数上使用constexpr:#include<iostream>us......
  • C++随笔:内联(inline)
    内联(inline)    内联函数以牺牲源文件大小为代价减小程序运行的时间,内联函数类似于一种编译器控制的复制/粘贴功能,当一个函数内部逻辑执行的消耗要远小于函数调用本身的消耗时,会额外增加栈空间的消耗,而被标记为内联的函数,编译器会直接将函数的定义“粘贴”到代码的调用处,直接......
  • C++
    计算时间相减定义一个时间类,小时和分钟是其两个私有成员数据。输入一个起始时间和一个结束时间(起始时间早于结束时间),通过运算符重载-(减号),计算这两个时间相隔多少分钟。说明:这两个时间在同一天之内,且采用24小时计时分式,即从00:00-23:59。输入格式:测试输入包含若干测试用例,每个......
  • C++:全局变量和static变量初始化
    (一)全局变量全局变量、文件域中的静态变量、类中的成员静态变量在main函数执行前初始化;局部变量中的静态变量在第一次调用时初始化。C++保证,全局变量在main函数第一次使用它之前,就把它初始化好。(可以直接理解成在main函数执行前就初始化好)但这个初始化可细分为:编译时初始化和运......