(BFS稍微变化)实现连连看过程,带连线,无通关

12 篇文章 0 订阅
3 篇文章 0 订阅
#pragma once
#include"InitializeMap.h"
#include<windows.h>
#include"resource.h"
class LoadingResource
{
unsigned Msize;
HBITMAP** hbitmap;
public:
LoadingResource();
~LoadingResource();
void Loadingimage(HINSTANCE instance, InitializeMap &arr, unsigned size);
void clear();
HBITMAP* & operator[](int  i);
};


#include "LoadingResource.h"
LoadingResource::LoadingResource()
{
hbitmap = NULL;
Msize = 0;
}
void LoadingResource::clear()
{
if (hbitmap)
{
for (unsigned i = 0; i < Msize; ++i)
delete[]hbitmap[i];
delete[]hbitmap;
hbitmap = NULL;
Msize = 0;
}
}
HBITMAP* & LoadingResource::operator[](int  i)
{
return hbitmap[i];
}
LoadingResource::~LoadingResource()
{
if (hbitmap)
clear();
}
void LoadingResource::Loadingimage(HINSTANCE instance, InitializeMap &arr, unsigned size)//加载资源
{
if (hbitmap)
clear();
this->Msize = size;
hbitmap = new HBITMAP*[size];
for (unsigned i = 0; i < size; ++i)
hbitmap[i] = new HBITMAP[size];
for (unsigned i = 0; i < size; ++i)
{
for (unsigned j = 0; j < size; ++j)
{
switch (arr[i][j])
{
case 0:
case 7:
hbitmap[i][j] = LoadBitmap(instance, MAKEINTRESOURCE(IDB_BITMAP7));
break;
case 1:
hbitmap[i][j] = LoadBitmap(instance, MAKEINTRESOURCE(IDB_BITMAP1));
break;
case 2:
hbitmap[i][j] = LoadBitmap(instance, MAKEINTRESOURCE(IDB_BITMAP2));
break;
case 3:
hbitmap[i][j] = LoadBitmap(instance, MAKEINTRESOURCE(IDB_BITMAP3));
break;
case 4:
hbitmap[i][j] = LoadBitmap(instance, MAKEINTRESOURCE(IDB_BITMAP4));
break;
case 5:
hbitmap[i][j] = LoadBitmap(instance, MAKEINTRESOURCE(IDB_BITMAP5));
break;
case 6:
hbitmap[i][j] = LoadBitmap(instance, MAKEINTRESOURCE(IDB_BITMAP6));
break;
}
}
}
}
#pragma once
#include<windows.h>
#include<vector>
#include<queue>
#include"InitializeMap.h"
#include"LoadingResource.h"
using namespace std;
class playGame
{
struct point//点的结构体
{
point(int x, int y) :x(x), y(y){}//带参构造
point(){};//无参构造
point &operator=(point & a)//重载=
{
x = a.x;
y = a.y;
return *this;
}
point operator+(point & a)//重载+
{
point t;
t.x = x + a.x;
t.y = y + a.y;
return t;
}
bool operator==(point& a)//重载==
{
return (x == a.x) && (y == a.y);
}
int x;
int y;
};
struct pnode//用来存储路径,通过它生成反向树状路径结构
{
point node;
pnode* parentnode;
};
point det[4];
point Begin;
point End;
point Inflexion[4];
RECT rec;
int m;
vector<point>  pointpatch;
int num;
int Status;
public:
int get_m()
{
return m;
}
playGame();
~playGame();
void DrawLine(HDC& hdc, bool &T, LoadingResource &hbitmap, HINSTANCE instance, InitializeMap& arr, unsigned size);
void Draw(HDC& hdc, bool &U, HINSTANCE instance, LPARAM lparam, unsigned size);
RECT& Get_rec()
{
return rec;
}
bool BFS(InitializeMap& arr, unsigned size);
bool SelectPoint(InitializeMap &arr, LPARAM lparam, unsigned size);
template <class T>
void Clear(T **arr,unsigned size);
void MPatch(int const &x, int const& y);//存储路径
const point* Inflexion_q()
{
return Inflexion;
}
int BeGin_x()
{
return Begin.x;
}
int BeGin_y()
{
return Begin.y;
}
int End_x()
{
return  End.x;
}
int  Ends_y()
{
return  End.y;
}
void MainLogic();
};
template <class T>
void playGame::Clear(T **arr, unsigned size)
{
for (unsigned i = 0; i < size; ++i)
delete[]arr[i];
delete[]arr;
}
#include "playGame.h"
using namespace std;
playGame::playGame()
{
this->Status = 0;
det[0].x = 0;
det[0].y = 1;
det[1].x = 1;
det[1].y = 0;
det[2].x = -1;
det[2].y = 0;
det[3].x = 0;
det[3].y = -1;
}
playGame::~playGame()
{
}
void playGame::Draw(HDC& hdc, bool &U, HINSTANCE instance, LPARAM lparam,unsigned size)
{
POINT p;
HPEN hP = CreatePen(CP_WINANSI, 5, RGB(0, 0, 0));
SelectObject(hdc, hP);
MoveToEx(hdc, (LOWORD(lparam) / ((rec.right - rec.left) / size))*((rec.right - rec.left) / size), (HIWORD(lparam) / ((rec.bottom - rec.top) / size))* ((rec.bottom - rec.top) / size), &p);
LineTo(hdc, (LOWORD(lparam) / ((rec.right - rec.left) / size)+1)*((rec.right - rec.left) / size),(HIWORD(lparam) / ((rec.bottom - rec.top) / size))* ((rec.bottom - rec.top) / size) );
MoveToEx(hdc, (LOWORD(lparam) / ((rec.right - rec.left) / size)+1)*((rec.right - rec.left) / size), (HIWORD(lparam) / ((rec.bottom - rec.top) / size))* ((rec.bottom - rec.top) / size), &p);
LineTo(hdc, (LOWORD(lparam) / ((rec.right - rec.left) / size) + 1)*((rec.right - rec.left) / size), (HIWORD(lparam) / ((rec.bottom - rec.top) / size)+1)* ((rec.bottom - rec.top) / size));
MoveToEx(hdc, (LOWORD(lparam) / ((rec.right - rec.left) / size)+1)*((rec.right - rec.left) / size), (HIWORD(lparam) / ((rec.bottom - rec.top) / size)+1)* ((rec.bottom - rec.top) / size), &p);
LineTo(hdc, (LOWORD(lparam) / ((rec.right - rec.left) / size) )*((rec.right - rec.left) / size), (HIWORD(lparam) / ((rec.bottom - rec.top) / size)+1)* ((rec.bottom - rec.top) / size));
MoveToEx(hdc, (LOWORD(lparam) / ((rec.right - rec.left) / size))*((rec.right - rec.left) / size), (HIWORD(lparam) / ((rec.bottom - rec.top) / size)+1)* ((rec.bottom - rec.top) / size), &p);
LineTo(hdc, (LOWORD(lparam) / ((rec.right - rec.left) / size) )*((rec.right - rec.left) / size), (HIWORD(lparam) / ((rec.bottom - rec.top) / size))* ((rec.bottom - rec.top) / size));
U = false;
DeleteObject(hP);
}
void playGame::DrawLine(HDC& hdc, bool &T, LoadingResource &hbitmap, HINSTANCE instance, InitializeMap& arr, unsigned size)
{
POINT p;
HPEN hP = CreatePen(CP_WINANSI, 7, RGB(0, 0, 0));
SelectObject(hdc, hP);
for (int i = 0; i <m+ 1; ++i)
{
MoveToEx(hdc, Inflexion[i].y*(int)((rec.right - rec.left) / size) + (int)((rec.right - rec.left) / (size * 2)), Inflexion[i].x*(int)((rec.right - rec.left) / size) + (int)((rec.right - rec.left) / (size * 2)), &p);
LineTo(hdc, Inflexion[i + 1].y*(int)((rec.right - rec.left) / size) + (int)((rec.right - rec.left) / (size * 2)), Inflexion[i + 1].x*(int)((rec.right - rec.left) / size) + (int)((rec.right - rec.left) / (size * 2)));
}
T = false;
DeleteObject(hP);
hbitmap[Begin.x][Begin.y] = LoadBitmap(instance, MAKEINTRESOURCE(IDB_BITMAP7));
hbitmap[End.x][End.y] = LoadBitmap(instance, MAKEINTRESOURCE(IDB_BITMAP7));
arr[Begin.x][Begin.y] = 0;
arr[End.x][End.y] = 0;
}
bool playGame::SelectPoint(InitializeMap &arr, LPARAM lparam, unsigned size)//point选择机制
{
if (arr[HIWORD(lparam) / ((rec.bottom - rec.top) / size) ][LOWORD(lparam) / ((rec.right - rec.left) / size) ] != 0)
{
if (!Status)
{
Begin.y = LOWORD(lparam) / ((rec.right - rec.left) / size) ;
Begin.x = HIWORD(lparam) / ((rec.bottom - rec.top) / size) ;
Status++;
}
else
{
End.y = LOWORD(lparam) / ((rec.right - rec.left) / size) ;
End.x = HIWORD(lparam) / ((rec.bottom - rec.top) / size) ;
if (!(Begin == End))
Status++;
}
if (Status == 2)
{
Status = 0;
return true;
}
}
return false;
}
bool playGame::BFS(InitializeMap &arr,unsigned size)//广度寻路
{
unsigned index = 0;
bool ** isfind = new bool*[size];
for (unsigned i = 0; i < size; ++i)
{
isfind[i] = new bool[size];
}
for (unsigned i = 0; i < size; ++i)
{
for (unsigned j = 0; j < size; ++j)
isfind[i][j] = false;
}
queue<pnode*>  My;//关键用来层次遍历,也可以用两个vector来实现类似的思想
pnode* Current;//设置当前节点
pnode*pnew;//生成新的节点
pnew = new pnode;
pnew->node = Begin;
pnew->parentnode = NULL;
vector<pnode*> ptemp;//用来保存所有节点指针,方便后期删防止内存泄漏
vector<pnode*> Pch;
ptemp.push_back(pnew);//压入起点
m = 0;
int T = 1;
int H = 0;
if (!(Begin == End))//如果起点终点系统不进入
{
My.push(pnew);
while (m < 3)
{
for (int i = 0; i < T; ++i)
{
if (!My.empty())
{
Current = My.front();
isfind[Current->node.x][Current->node.y] = true;
My.pop();
}
else
{
for (unsigned i = 0; i < ptemp.size(); ++i)//删除所有节点
delete ptemp[i];
Clear(isfind,size);
return false;
}
for (unsigned i = 0; i < 4; ++i)
{
point temp = Current->node + det[i];
while (true)
{
if (End == temp)
{
pnew = new pnode;
pnew->node = (temp);
pnew->parentnode = Current;
ptemp.push_back(pnew);
Pch.push_back(pnew);//保存路径
int i = 0;
while (pnew)
{
Inflexion[i].x = pnew->node.x;
Inflexion[i].y = pnew->node.y;
pnew = pnew->parentnode;
i++;
}
Pch.clear();
Clear(isfind,size);
for (unsigned i = 0; i < ptemp.size(); ++i)//删除所有节点
delete ptemp[i];
return true;
}
else if (temp.x < (int)size && temp.y < (int)size && temp.x >= 0
&& temp.y >= 0 && !isfind[temp.x][temp.y] && !arr[temp.x][temp.y])
{
pnew = new pnode;
pnew->node = temp;
pnew->parentnode = Current;
ptemp.push_back(pnew);//保存节点地址
My.push(pnew);//进队
H++;
}
else
break;
temp = temp + det[i];
}
}
}
T = H;
H = 0;
m++;
}
Clear(isfind,size);
for (unsigned i = 0; i < ptemp.size(); ++i)//删除所有节点
delete ptemp[i];
return false;
}
for (unsigned i = 0; i < ptemp.size(); ++i)//删除所有节点
delete ptemp[i];
return false;
}
#pragma once
#include<time.h>
#include<iostream>
class InitializeMap
{
int **Map;
unsigned Maxsize;
public:
InitializeMap();
~InitializeMap();
void Clear();//清除
void Swap(unsigned size);//随机交换
void CreatMap(unsigned size);//生成地图
unsigned GetMaxsize();
int*& operator[](int i);
};
#include "InitializeMap.h"
InitializeMap::InitializeMap() :Maxsize()
{
Map = NULL;
Maxsize = 0;
}
InitializeMap::~InitializeMap()
{
Clear();
}
void InitializeMap::Clear()
{
if (Map)
{
for (unsigned i = 0; i < Maxsize; ++i)
delete[]Map[i];
delete[]Map;
Map = NULL;
Maxsize = 0;
}
}
void InitializeMap::Swap(unsigned size)
{
for (unsigned i = 0; i < 20; ++i)
{
int a = rand() % ((size-2)/2) + 1;
int b = rand() % (size-2) + 1;
int c = rand() % ((size - 2) / 2) + size/2;
int d = rand() % (size - 2) + 1;
Map[a][b] ^= Map[c][d];
Map[c][d] ^= Map[a][b];
Map[a][b] ^= Map[c][d];
}
}
void InitializeMap::CreatMap(unsigned size)
{
if (Map)
Clear();
Map = new int*[size];
for (unsigned i = 0; i < size; ++i)
Map[i] = new int[size];
for (unsigned i = 0; i < size; ++i)
{
for (unsigned j = 0; j < size; ++j)
{
if (i == 0 || j == 0 || i == size - 1 || j == size - 1)
Map[i][j] = 0;
}
}
srand(unsigned(time(NULL)));
for (unsigned i = 1; i < size / 2; ++i)
{
for (unsigned j = 1; j < size - 1; ++j)
{
Map[i][j] = Map[size / 2 - 1 + i][j] = rand() % 6 + 1;
}
}
Maxsize = size;
Swap(size);
}
int*& InitializeMap::operator[](int i)
{
return Map[i];
}
unsigned InitializeMap::GetMaxsize()
{
return Maxsize;
}
#pragma once
#include<iostream>
#include<memory.h>
#include<windows.h>
#include<tchar.h>
#include "InitializeMap.h"
#include"LoadingResource.h"
#include"playGame.h"
using namespace std;
#include"作业.h"
HINSTANCE instance;
HWND hwnd;
InitializeMap arr;
LPARAM param;
LoadingResource hbitmap;
RECT rec;
bool T = false;
bool U = false;
unsigned size = 6;
int num = (size - 2)*(size - 2);
playGame PG;
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
bool MycreateWnd(const HINSTANCE & hinstance, int mode);
ATOM MyRegisterClass(const HINSTANCE& hinstance);
void Drawing(HDC hdc, LoadingResource &hbitmap);//渲染
void MainLogic();//主逻辑;
bool MainLogic(LPARAM lparam, LoadingResource& hbitmap)//主逻辑
{

if (PG.SelectPoint(arr, lparam,size) && PG.BFS(arr,size) /*&& PG.DisposePatch(arr) */&& (arr[PG.End_x()][PG.Ends_y()] == arr[PG.BeGin_x()][PG.BeGin_y()]))
{
num -= 2;
return true;
}
return  false;
}
ATOM MyRegisterClass(const HINSTANCE& hinstance)
{
WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = NULL;
wc.hInstance = hinstance;
wc.lpfnWndProc = WinProc;
wc.lpszClassName = L"连连看";
wc.lpszMenuName = NULL;
wc.style = CS_VREDRAW | CS_HREDRAW;
return RegisterClass(&wc);
}
bool MycreateWnd(const HINSTANCE & hinstance, int mode)
{
hwnd = CreateWindow(L"连连看", L"连连看", WS_MINIMIZEBOX | WS_SYSMENU, 300, 10, 1000, 1000, NULL, NULL, hinstance, 0);
if (!hwnd)
return false;
ShowWindow(hwnd, mode);
UpdateWindow(hwnd);
return true;
}
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{

switch (msg)
{
case WM_LBUTTONUP:
if (MainLogic(lparam, hbitmap))
{
T = true;
SetTimer(hwnd, 1000, 200, NULL);
InvalidateRect(hwnd, NULL, true);
}
U = true;
param = lparam;
InvalidateRect(hwnd, NULL, false);
break;
case WM_TIMER:
InvalidateRect(hwnd, NULL, true);
KillTimer(hwnd, 1000);
break;
case WM_CREATE:
arr.CreatMap(size);
hbitmap.Loadingimage(instance, arr, arr.GetMaxsize());
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
 Drawing(hdc, hbitmap);//渲染
 if (T)
 {
PG.  DrawLine(hdc, T, hbitmap, instance, arr,size);//画路径
 }
 if (U)
 {
 PG.Draw(hdc, U, instance, param,size);//画框
 }
EndPaint(hwnd, &ps);
if (num == 0)
{
size += 2;
arr.CreatMap(size);
hbitmap.Loadingimage(instance, arr, size);
num = (size - 2)*(size - 2);
}
}
break;
default:
return DefWindowProc(hwnd, msg, wparam, lparam);
break;
}
return 0;
}
void Drawing(HDC hdc, LoadingResource &hbitmap)//渲染
{
GetClientRect(hwnd, &rec);
PG.Get_rec() = rec;
HDC hmdc = CreateCompatibleDC(hdc);
HGDIOBJ old;
for (unsigned i = 0; i < size - 1; ++i)
{
for (unsigned j = 0; j < size - 1; ++j)
{
if (i == 0 && j == 0)
old = SelectObject(hmdc, hbitmap[i][j]);
else
SelectObject(hmdc, hbitmap[i][j]);
StretchBlt(hdc, j * (rec.right - rec.left) / size, i*(rec.bottom - rec.top) / size, (rec.right - rec.left) / size, (rec.bottom - rec.top) / size, hmdc, 0, 0, 113, 113, SRCCOPY);
}
}
SelectObject(hmdc, old);
//for (unsigned i = 0; i < size; ++i)
//{
// for (unsigned j = 0; j < size; ++j)
// {
// DeleteObject(hbitmap[i][j]);
// }
//}
DeleteDC(hmdc);
}
int _stdcall _tWinMain(HINSTANCE hinstance, HINSTANCE hinpstance, LPTSTR lptstr, int mode)
{
instance = hinstance;
MSG Msg;
if (!MyRegisterClass(hinstance))
MessageBox(NULL, L"注册失败", L"注册失败", MB_OK);
if (!MycreateWnd(hinstance, mode))
MessageBox(NULL, L"创建失败", L"创建失败", MB_OK);
while (true)
{
if (PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE))
{
if (GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
else
return 0;
}
}
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值