写迷宫程序首先需要安装图形库easyX 安装地址链接:https://pan.baidu.com/s/1qZwFn3m 密码:ozge
项目截图:
//左上角是七点,右下角是终点,蓝色表示的是走过的路径,红色表示的是当前位置,采用的是深度优先遍历
mg.h
1 #pragma once 2 #define _CRT_SECURE_NO_WARNINGS 3 #include <stdio.h> 4 #include <graphics.h> 5 #include <mmsystem.h> 6 #include <stdlib.h> 7 #include <time.h> 8 #include <string.h> 9 #include "conio.h" 10 #pragma comment(lib,"winmm.lib") 11 12 //每一个格子的像素 13 #define ELEM 20 14 //界面的宽和高 15 #define WINDOW_WIDTH 500 16 #define WINDOW_HEIGHT 500 17 18 //枚举四个方向 19 typedef enum DIR{ up = 72, down = 80, left = 75, right = 77}DIR; 20 21 //当前到的位置 22 int cur_x, cur_y; 23 //一共走的步数 24 int total_count = 0; 25 26 //初始化游戏 27 void GameInit(); 28 //绘制游戏 29 void GamePaint(); 30 //判断能不能走 31 bool judge(int cur_x, int cur_y, char dir); 32 //人工操作移动 33 void move(); 34 //判断能否成功走出来 35 bool judgeSuc(int,int);
main.cpp
1 #include "mg.h" 2 3 //初始化地图 4 //0表示没走过的点,1表示障碍,2表示当前在的位置,3表示已经走过的路径 5 int map[WINDOW_HEIGHT / ELEM][WINDOW_WIDTH / ELEM] = { 0 }; 6 7 void main() 8 { 9 //初始化游戏 10 GameInit(); 11 //以下是实现人工操作 12 //while (1) 13 //{ 14 // //如果没有键盘按下 15 // while (!_kbhit()) 16 // { 17 // GamePaint(); 18 // run(cur_x, cur_y); 19 // } 20 // move(); 21 //} 22 system("pause"); 23 } 24 25 //初始化游戏界面,并初始化地图 26 void GameInit() 27 { 28 //设置窗口大小 29 initgraph(WINDOW_HEIGHT, WINDOW_WIDTH); 30 //设置窗口颜色 31 setbkcolor(LIGHTGRAY); 32 //强制绘图,显示界面 33 cleardevice(); 34 35 //初始化时间种子,随机生成一个地图,并且判断地图能不能走出来 36 srand(time(0)); 37 do 38 { 39 for (int i = 0; i < WINDOW_HEIGHT / ELEM; i++) 40 { 41 for (int j = 0; j < WINDOW_WIDTH / ELEM; j++) 42 { 43 int num = rand() % 10; 44 if (num < 7) 45 map[i][j] = 0; 46 else 47 map[i][j] = 1; 48 } 49 } 50 //左上角位置是人的初始位置 51 map[0][0] = 2; 52 //右下角 53 map[WINDOW_HEIGHT / ELEM - 1][WINDOW_WIDTH / ELEM - 1] = 0; 54 GamePaint(); 55 } while (judgeSuc(0,0) == false);//如果不能走出来则继续生成迷宫 56 } 57 58 //绘制 59 void GamePaint() 60 { 61 //按行绘制 62 for (int y = 0; y < WINDOW_HEIGHT / ELEM; y++) 63 { 64 for (int x = 0; x < WINDOW_WIDTH / ELEM; x++) 65 { 66 //没有走过 67 if (map[y][x] == 0 ) 68 { 69 //设置画笔颜色 70 setcolor(RED); 71 //设置填充颜色 72 setfillcolor(DARKGRAY); 73 //填充矩形 74 fillrectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM); 75 //画矩形 76 rectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM); 77 } 78 79 //障碍物 80 if (map[y][x] == 1) 81 { 82 setcolor(RED); 83 setfillcolor(BLACK); 84 fillrectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM); 85 rectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM); 86 } 87 88 //当前位置 89 if (map[y][x] == 2) 90 { 91 setcolor(RED); 92 setfillcolor(RED); 93 fillrectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM); 94 rectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM); 95 } 96 97 //已经走过的路径 98 if (map[y][x] == 3) 99 { 100 setcolor(RED); 101 setfillcolor(GREEN); 102 fillrectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM); 103 rectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM); 104 } 105 } 106 } 107 } 108 109 //判断能不能走 110 bool judge(int cur_x,int cur_y,char dir) 111 { 112 switch (dir) 113 { 114 case up: 115 if (cur_y - 1 < 0 || map[cur_y - 1][cur_x] == 1 || map[cur_y - 1][cur_x] == 3) 116 { 117 return false; 118 } 119 break; 120 case down: 121 if (cur_y + 1 > WINDOW_HEIGHT / ELEM - 1 || map[cur_y + 1][cur_x] == 1 || map[cur_y + 1][cur_x] == 3) 122 { 123 return false; 124 } 125 break; 126 case left: 127 if (cur_x - 1 < 0 || map[cur_y][cur_x - 1] == 1 || map[cur_y][cur_x - 1] == 3) 128 { 129 return false; 130 } 131 break; 132 case right: 133 if (cur_x + 1 > WINDOW_HEIGHT / ELEM - 1 || map[cur_y][cur_x + 1] == 1 || map[cur_y][cur_x + 1] == 3) 134 { 135 return false; 136 } 137 break; 138 } 139 140 return true; 141 } 142 143 144 //判断地图能否走出去 145 bool judgeSuc(int cur_x, int cur_y) 146 { 147 total_count++;//走一次步数加一 148 map[cur_y][cur_x] = 3;//把走过的标记 149 150 if (cur_x == WINDOW_WIDTH / ELEM - 1 && cur_y == WINDOW_HEIGHT / ELEM - 1) 151 { 152 char res[100]; 153 sprintf(res, "成功走出迷宫,一共走了%d步", total_count); 154 MessageBoxA(0,res, "提示",0); 155 //return true; 156 return false; 157 } 158 else 159 { 160 //右下左上 161 if (judge(cur_x, cur_y, right)) 162 { 163 //下一个走到的位置设置为2 164 map[cur_y][cur_x + 1] = 2; 165 //绘制当前状态,并且等待100ms 166 GamePaint(); 167 Sleep(100); 168 //从下一个位置开始走 169 judgeSuc(cur_x+1, cur_y); 170 //递归还原 171 total_count--; 172 } 173 174 if (judge(cur_x, cur_y, down)) 175 { 176 map[cur_y + 1][cur_x] = 2; 177 GamePaint(); 178 Sleep(100); 179 judgeSuc(cur_x, cur_y+1); 180 total_count--; 181 } 182 183 if (judge(cur_x, cur_y, left)) 184 { 185 map[cur_y][cur_x - 1] = 2; 186 map[cur_y][cur_x] = 0; 187 GamePaint(); 188 Sleep(100); 189 judgeSuc(cur_x-1, cur_y); 190 total_count--; 191 } 192 193 if (judge(cur_x, cur_y, up)) 194 { 195 map[cur_y - 1][cur_x] = 2; 196 map[cur_y][cur_x] = 0; 197 GamePaint(); 198 Sleep(100); 199 judgeSuc(cur_x, cur_y-1); 200 total_count--; 201 } 202 203 if (total_count == 1) 204 { 205 return false; 206 } 207 } 208 } 209 210 //向各个方向移动 211 void move() 212 { 213 //方向 214 char dir; 215 dir = _getch(); 216 217 //各个方向判断 218 switch (dir) 219 { 220 case up: 221 if (judge(cur_x, cur_y, up)) 222 { 223 map[cur_y - 1][cur_x] = 2; 224 map[cur_y][cur_x] = 0; 225 cur_y -= 1; 226 } 227 break; 228 case down: 229 if (judge(cur_x, cur_y, down)) 230 { 231 map[cur_y + 1][cur_x] = 2; 232 map[cur_y][cur_x] = 0; 233 cur_y += 1; 234 } 235 break; 236 case left: 237 if (judge(cur_x, cur_y, left)) 238 { 239 map[cur_y][cur_x - 1] = 2; 240 map[cur_y][cur_x] = 0; 241 cur_x -= 1; 242 } 243 break; 244 case right: 245 if (judge(cur_x, cur_y, right)) 246 { 247 map[cur_y][cur_x + 1] = 2; 248 map[cur_y][cur_x] = 0; 249 cur_x += 1; 250 } 251 break; 252 } 253 }