#include "labyrith.h"
int Wall[22][22]; // 墙壁
int entranceX; // 入口
int entranceY;
int exitX; // 出口
int exitY;
// 默认构造函数
FrameWindow::FrameWindow()
{
initgraph(960, 660); // 建立图形界面
setbkcolor(LIGHTGREEN); // 设置背景颜色为亮绿色
direct = 0; // 设置 direct 的初值为 0
control = 0; // 默认控制权为 0
loadimage(&img, "res\\bk.jpg", 29, 29); // 加载图片
}
// 运行控制
void FrameWindow::Run()
{
cleardevice(); // 清屏
NewBackground(); // 绘制新背景图
DrawSome(); // 绘制些神马
control = 0; // 首先将函数对程序程序的控制权置 0
direct = 0; // 设置 direct 的初值为 0
// 主循环
while(1)
{
if(kbhit()) // 检测按键
{
direct = getch(); // 从按键获取输入
mciSendString("play res\\key.wav", NULL, 0, NULL); // 按键声
if( direct == 115 && control == 0) // s 的键值为 115
{
StartDrawLabyrith(); // 开始绘制迷宫
}
if(direct == 101 && control == 2) // e 的键值为 101
{
SetLabyrith(); // 设置迷宫的入口和出口
}
if(direct == 100 && control == 3) // d 的键值为 100
{
control = -1; // 将 control 设置为 -1 的目的是
// 让程序从 Demo() 回到 Run() 时只响应刷新操作
Demo(); // 寻找路径并演示
}
if(direct == 63 && (control == 0 || control == -1)) // 按 F5 刷新
{
break;
}
}
else
{
Sleep(10);
}
}
}
// 绘制新背景
void FrameWindow::NewBackground()
{
float H, S, L; // 定义 HSL 颜色模型的 3 个变量
H = 110; // 色相
S = 1; // 饱和度
L = 0.4522f; // 亮度
for(int y = 0; y != 660; ++y) // 绘制迷宫背景颜色
{
L += 0.000125f;
S -= 0.00125f;
setcolor(HSLtoRGB(H, S, L));
line(0, y, 660, y);
}
H = 50; // 色相
S = -3.2555f; // 饱和度
L = 0.525617f; // 亮度
for(y = 0; y != 660; ++y) // 绘制提示信息部分背景
{
L += 0.000000085f;
S -= 0.0015f;
setcolor(HSLtoRGB(H, S, L));
line(660, y, 960, y);
}
}
// 绘制些神马
void FrameWindow::DrawSome()
{
setcolor(LIGHTRED);
for(int i = 0; i < 22; ++i)
{
// 外围墙壁在 Wall 数组中的位置置 1
Wall[0][i] = 1;
Wall[i][0] = 1;
Wall[21][i] = 1;
Wall[i][21] = 1;
// 绘制外围墙壁
putimage(0 * 30 + 1, i * 30 + 1, &img);
putimage(i * 30 + 1, 0 * 30 + 1, &img);
putimage(631, i * 30 + 1, &img);
putimage(i * 30 + 1, 631, &img);
putimage(931, i * 30 + 1, &img);
line(i * 30, 0, i * 30, 660); // 绘制格子线
line(0, i * 30, 660, i * 30); // 绘制格子线
}
for(i = 0; i < 10; ++i) // 绘制提示区域外围框
{
putimage(i * 30 + 661, 1, &img);
putimage(i * 30 + 661, 631, &img);
}
for(i = 1; i <= 20; ++i) // 其它的 Wall 数组的值暂时置 0
{
for(int j = 1; j <= 20; ++j)
{
Wall[i][j] = 0;
}
}
// 绘制提示信息
RECT r = {710, 40, 900, 300};
setbkmode(TRANSPARENT); // 设置输出文字背景模式为透明
setcolor(BLUE); // 设置输出文字颜色
setfont(15, 0, "宋体");
// 输出提示信息
drawtext("游戏操作介绍:\n\n按键 S:绘制迷宫。\n鼠标左键绘制墙壁,\
鼠标右键擦除墙壁。\n\n按键 E:设置迷宫的入口和出口。\n使用鼠标\
左键来设置入口和出口,右键取消设置。\n\n按键 D:进行迷宫的探索\
,寻找从入口到出口的最短路径,由小球来演示从入口到出口的路径。",
&r, DT_WORDBREAK);
setbkmode(OPAQUE); // 恢复默认填充颜色
// 输出提示信息
outtextxy(730, 400, "迷宫状态: ");
outtextxy(810, 400, "等待绘制");
outtextxy(750, 500, "按 F5 重新开始");
}
// 开始绘制迷宫
void FrameWindow::StartDrawLabyrith()
{
int x = 0, y = 0; // 标记鼠标的坐标使用
outtextxy(810, 400, "正在绘制"); // 修改迷宫状态
FlushMouseMsgBuffer(); // 清空鼠标消息缓冲区
// 主循环
while(1)
{
if(kbhit())
{
direct = getch(); // 获取按键信息
mciSendString("play res\\key.wav", NULL, 0, NULL); // 按键声
if(direct == 101) // e 的键值为 101
{
control = 2; // 控制权值为 2
break;
}
else if(direct == 63) // F5 刷新
{
break;
}
}
else if(MouseHit())
{
msg = GetMouseMsg(); // 获取鼠标消息
x = msg.x / 30; // 获取鼠标所在格子在 Wall 中的位置
y = msg.y / 30;
if(msg.x > 30 && msg.x < 630 && msg.y > 30 && msg.y < 630) // 只能在这个区域里面响应鼠标消息
{
switch(msg.uMsg) // 消息的种类
{
case WM_LBUTTONDOWN: // 左键按下
{
Wall[y][x] = 1; // y 对应行, x 对应列, 将对应的位置置 1
putimage(x * 30 + 1, y * 30 +1, &img); // 放置图片
}
break;
case WM_RBUTTONDOWN: // 右键按下
{
Wall[y][x] = 0; // y 对应行, x 对应列, 将对应的位置置 0
PrintGrid(x * 30, y * 30); // 重新绘制这个格子
setcolor(BLUE );
}
break;
default:break;
}
}
}
else
{
Sleep(10);
}
}
}
// 设置入口和出口
void FrameWindow::SetLabyrith()
{
int x = 0, y = 0; // 临时参数
entranceX = -1; // 入口
entranceY = -1;
exitX = -1; // 出口
exitY = -1;
outtextxy(810, 400, "设置入口"); // 提示信息
// 主循环
while(1)
{
if(kbhit()) // 键盘消息
{
direct = getch(); // 获取消息
mciSendString("play res\\key.wav", NULL, 0, NULL); // 按键声
if(direct == 100 && entranceX != -1 && exitX != -1) // 如果出入口都设置好, 按 d 键退出设置模式
{
control = 3; // 控制权变为 3, 回到 Run 中由其判断由谁控制程序;
break;
}
else if(direct == 63) // F5 刷新
{
control = 0;
break;
}
}
else if(MouseHit())
{
msg = GetMouseMsg(); // 获取鼠标消息
x = msg.x / 30; // 获取鼠标所在格子在 Wall 中的位置
y = msg.y / 30;
if(entranceX != -1 && exitX != -1) // 完成设置
{
outtextxy(810, 400, "设置完成");
}
if(msg.x > 30 && msg.x < 630 && msg.y > 30 && msg.y < 630) // 只能在这个区域里面响应鼠标消息
{
if(Wall[y][x] == 0 && msg.uMsg == WM_LBUTTONDOWN) // 如果这个位置不是墙壁, 并且按下左键
{
if(entranceX == -1 && (exitX != x || exitY != y)) // 确保此处没被设置
{
entranceX = x; // 入口位置
entranceY = y;
Wall[y][x] = 1;
outtextxy(x * 30 + 8, y * 30 + 10,_T("In")); // 将此处标记为 In
if(exitX == -1) // 若此时还未设置出口
{
outtextxy(810, 400, "设置出口"); // 改变迷宫状态
}
}
else if(exitX == -1 && (entranceX != x || entranceY != y)) // 此处未设置出口且不是入口位置
{
exitX = x; // 出口位置
exitY = y;
Wall[y][x] = 1;
outtextxy(x * 30 + 4, y * 30 + 8,_T("Out")); // 将此处标记为 Out
if(entranceX == -1) // 若此时还未设置入口
{
outtextxy(810, 400, "设置入口"); // 改变迷宫状态
}
}
}
else if(Wall[y][x] == 1 && msg.uMsg == WM_RBUTTONDOWN) // 如果这个位置不是墙壁, 并且按下右键
{
if(x == entranceX && y == entranceY) // 取消设置入口
{
entranceX = -1;
entranceY = -1;
Wall[y][x] = 0;
outtextxy(810, 400, "设置入口"); // 改变迷宫状态
PrintGrid(x * 30, y * 30); // 从新绘制格子
setcolor(BLUE); // 恢复原线条颜色
}
else if(x == exitX && y == exitY) // 取消设置出口
{
exitX = -1;
exitY = -1;
Wall[y][x] = 0;
outtextxy(810, 400, "设置出口"); // 改变迷宫状态
PrintGrid(x * 30, y * 30); // 重新绘制格子
setcolor(BLUE); // 恢复原线条颜色
}
}
}
}
}
}
// 探索迷宫路径, 并演示成果
void FrameWindow::Demo()
{
Queue qu;
Node node;
int zx[4] = {1,0,-1,0},zy[4] = {0,1,0,-1}; // 四个方向
int find = 0; // find 值为 1 表示结束寻找路径
int x = 0, y = 0; // 临时参数 x, y
node.x = entranceX; // 入口位置
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
实用c语言支持自己创建迷宫,并求解最短路径.zip (13个子文件)
c语言支持自己创建迷宫,并求解最短路径
迷宫2
迷宫2.exe 120KB
res
bk.jpg 12KB
主界面.ico 2KB
resource.h 456B
key.wav 15KB
Script1.aps 33KB
Script1.rc 2KB
labyrith.h 2KB
main.cpp 305B
迷宫2.dsw 535B
迷宫2.dsp 4KB
labyrinth.cpp 11KB
项目说明.zip 46KB
共 13 条
- 1
资源评论
DC头发很茂密
- 粉丝: 1941
- 资源: 606
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功