迷宫生成及寻路基于控制台
前言
上一篇blog已经讲述了有关迷宫的核心算法以及具体的代码。这一篇,我们要进行把算法变成游戏的操作了。
一、基于控制台
用那些可以做成交互界面的软件确实要比控制台高大上的多,奈何时间有限,0基础学习那些东西,还不算迷宫具体生成的核心算法,时间才剩下了五天,并且还有很多时间是要干其他的,所以还是感叹一句吧,时间还是太宝贵了呀。有时间的话真的可以自己自学完成MFC,然后做一个非常漂亮的游戏界面。
二、初始化函数
1.玩家自己选择模式
说到选择模式也是靠相关的按键判断的函数,所以那两个按键相关的函数还是必不可少的。我们可以输入一个按键来进行判断,比如输入一个a我们就可以自己走,输入一个b,就是电脑自动寻路,然后还需要加载重新开始的功能。重新开始的话只需在按键判断之后加载初始化函数就可以了。
具体实现代码如下:
int m, n;
full_screen();
system("cls");
system("color 3E");
locate(80, 28);
cout << "请输入地图的长和宽:(长不小于10且不大于115,宽不小于10且不大于65。)" << endl;
locate(80, 29);
cin >> n;
locate(90, 29);
cin >> m;//键盘输入初始化地图的大小参数,长不小于10且不大于115,宽不小于10且不大于70。
if (n > 115 || n < 10 || m < 10 || m>65) {
system("cls");
system("color F4");
locate(80, 28);
cout << "输入的值不符合!";
system("pause");
return 0;
}
locate(80, 30);
cout << "请输入你喜欢的颜色,为十六进制数字:(0=黑色,1 = 蓝色,2 = 绿色,3 = 湖蓝色,4 = 红色,5 = 紫色," << endl;
locate(80, 32);
cout << "7 = 白色,8 = 灰色,9 = 淡蓝色,A = 淡绿色,B = 淡浅绿色,C = 淡红色,D = 淡紫色,E = 淡黄色,F = 亮白)" << endl;
char A, B;
locate(80, 34);
cin >> A;
locate(90, 34);
cin >> B;
color(A, B);
hide();
fill(visit[0], visit[0] + m * n, false); // 将visit数组赋初值false,因为都是未访问。
fill(valF[0], valF[0] + m * n, 0); // 初始化F全为0
fill(path[0][0], path[0][0] + m * n * 2, -1); // 路径同样赋初值-1 。
initMG(m, n);
locate(1, m);
cout << "在英文状态输入小写a和b选择模式,a:自己走迷宫,b:自动寻路。";
while (1) {
ch = _getch();
if (ch == 'a' || ch == 'A')
{
move(a, b);
}
if (ch == 'b' || ch == 'B')
{
A_start(2, 1, zx, zy, a, b);
ENDPath(zx, zy, a, b);
system("pause");
locate(1, b);
cout << "输入'R'重新开始。";
while (1)
{
if (_kbhit())//kbhit()检测是否有按键按下,有按下返回键值,
{
ch = _getch();
switch (ch)
{
case 'r':
initMG(a, b);
break;
case 'R':
initMG(a, b);
break;
}
}
}
}
}
}
2.设置地图的颜色和初始化
我们这时还是需要用到上次做贪吃蛇的已经写好的color函数,实现从键盘输入一个十六进制的数字,然后改变相关的颜色。而在初始化这一方面也需要用到贪吃蛇的定位函数,可以使输出更加美观,看起来更为工整。还以实现窗口最大化,这需要的都是控制台的相关函数。代码如下:
void locate(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
//获取控制台缓冲区句柄
HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
//设置光标位置
SetConsoleCursorPosition(ConsoleHandle, coord);
}
/*隐藏光标*/
void hide() {
CONSOLE_CURSOR_INFO cursor_info = {
1,0 };//函数结构体,赋值为0,光标被隐藏。
/*CONSOLE_CURSOR_INFO结构体定义如下:
typedef struct
{ DWORD dwSize;
BOOL bVisible; //为0时光标不可见
CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
}
*/
SetConsoleCursorInfo(hout, &cursor_info);//函数 SetConsoleCursorInfo 设置光标的大小和可见度。需向其传递指向结构 CONSOLE_CURSOR_INFO 的指针:
void full_screen()
{
HWND hwnd = GetForegroundWindow();
int cx = GetSystemMetrics(SM_CXSCREEN); /* 屏幕宽度 像素 */
int cy = GetSystemMetrics(SM_CYSCREEN); /* 屏幕高度 像素 */
LONG l_WinStyle = GetWindowLong(hwnd, GWL_STYLE); /* 获取窗口信息 */
/* 设置窗口信息 最大化 取消标题栏及边框 */
SetWindowLong(hwnd, GWL_STYLE, (l_WinStyle | WS_POPUP | WS_MAXIMIZE) & ~WS_CAPTION & ~WS_THICKFRAME & ~WS_BORDER);
SetWindowPos(hwnd, HWND_TOP, 0, 0, cx, cy, 0);
}
}
2.更为细节的优化和处理
对于很多功能来说大概都处理完成了,剩下的就只有我们到底需要生成一个什么样子的地图呢?需要用什么来作为地图的样子,什么作为人的样子,地图和人的颜色又是如何呢?关于这些,我在这一次的实验中并没有做到太完善。如果想要输出一个不同样式或者颜色的字符串的话,我们可以定义一个字符串数组,然后只需要在数组中相关元素的信息,比如颜色形状之类的。其余的话我们可以通过二维数组确定所在的位置然后输出我们所设定的字符串数组。这些我做的不太好,我只能展示一下我设置的简单的交互界面。路的颜色原则上应该是跟墙不一样的,但是确实是没时间做了。。。。
源代码的话还是发一下了,确实还需要时间来完善,如果有时间的话,一定要做一个非常漂亮的交互界面。和贪吃蛇一样color函数也在头文件里。
#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>
#include<algorithm>
#incl