用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++)
{
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];
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)
{
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;
}
|