标签:
1 /* 2 8 6 3 1 1 1 1 1 1 1 1 4 1 0 0 1 0 0 1 1 5 1 1 0 0 0 0 0 1 6 1 0 0 1 0 1 0 1 7 1 0 0 0 0 0 0 1 8 1 1 1 1 1 1 1 1 9 */ 10 #include <iostream> //////////-static-libgcc 11 #include <iomanip> 12 #include <ctime> 13 #include <stack> 14 #include<cstdio> 15 #include<windows.h> //Sleep()头文件 16 #include<cstring> 17 #include<mmsystem.h> //播放MP3文件的头文件,工具\编译选项\编译器\在连接器命令加入\-lwinmm 18 #include<conio.h> 19 using namespace std; 20 21 struct position{ 22 int row; // x 23 int col; // y 24 int option; //下一步 25 }; 26 void Pos(int x, int y) { //设置放置位置 27 COORD p; 28 p.X = y;p.Y = x; 29 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), p); 30 } 31 void welcome(); //欢迎模块 32 void play_mp3(char *ps); //播放音乐 33 void MazeGenerator(char **m, int row, int col); //输入模块 34 bool findPath(stack<position> *&path, int **maze, int row, int col); //寻找路径 35 void outputPath(stack<position> *&path); //输出模块 36 37 int **NewDArray(int row, int col) //设置迷宫的大小 38 { 39 int **m = new int *[row]; 40 if (!m) { 41 cout << "Out of Memory !"; return nullptr; 42 } 43 for (int i = 0; i < col; i++) { 44 m[i] = new int [col]; 45 if (!m[i]) { 46 cout << "Out of Memory\n"; 47 for (int k = 0; k < i; k++) delete []m[i]; 48 delete []m; return nullptr; 49 } 50 } 51 52 // for (int i = 0; i < row ; i++) { 53 // for (int j = 0; j < col ; j++) 54 // m[i][j] = 0; 55 // } 56 // for (int i = 0; i < row; i++) { 57 // for (int j = 0; j < col; j++) 58 // cout << m[i][j] << " "; 59 // cout << endl; 60 // } 61 // cout << "row = " << row << ", col = " << col << endl; 62 return m; 63 } 64 65 void DeleteDArray(int **m, int row) //释放迷宫动态内存 66 { 67 for (int i = 0; i < row; i++) 68 delete []m[i]; 69 delete []m; 70 } 71 72 void MazeGenerator(int **m, int row, int col) //随机产生迷宫 73 { 74 int i, j; 75 // time_t t; 76 int code; 77 78 // srand((unsigned)time(&t)); //设置随机种子 79 // for (int i = 0; i < col; i++) { 80 // m[0][i] = 1; 81 // m[row - 1][i] = 1; 82 // } 83 // cout << "Deubg !!"; 84 // for (int j = 1; j < row - 1; j++) m[j][0] = m[j][col - 1] = 1; 85 86 for (i = 0; i < row ; i++) { 87 Pos(10 + i, 22); 88 for (j = 0; j < col ; j++) 89 { 90 cin >> code; 91 m[i][j] = code; 92 } 93 } 94 } 95 96 void MazeDisplay(int **m, int row, int col) //显示迷宫 97 { 98 system("cls"); 99 100 int i, j; 101 102 HANDLE console; 103 console = GetStdHandle(STD_OUTPUT_HANDLE); 104 SetConsoleTextAttribute(console, 7); 105 cout << endl; 106 for (i = 0; i < row; i++) 107 { 108 Pos(7+i, 30); 109 for (j = 0; j < col; j++) 110 cout << ‘ ‘ << m[i][j]; 111 cout << endl; 112 } 113 Pos(7+row, 0); 114 cout << endl; 115 } 116 117 bool findPath(stack<position> *&path, int **maze, int row, int col) 118 { 119 //寻找一条从入口(1,1), 到达出口(size, size)的路径 120 //如果找到, 返回true, 否则返回false 121 122 //初始化偏移量 123 position offset[8]; 124 125 // offset[0].row = 0; offset[0].col = 1; //右 126 // offset[1].row = 1; offset[1].col = 0; //下 127 // offset[2].row = 0; offset[2].col = -1; //左 128 // offset[3].row = -1;offset[3].col = 0; //上 129 // 130 // offset[0].row = 1; offset[0].col = 0; //下 131 // offset[1].row = 0; offset[1].col = 1; //右 132 // offset[2].row = -1;offset[2].col = 0; //上 133 // offset[3].row = 0; offset[3].col = -1; //左 134 135 // 136 // offset[0].row = 0; offset[0].col = -1; //左 137 // offset[1].row = 1; offset[1].col = 0; //下 138 // offset[2].row = 0; offset[2].col = 1; //右 139 // offset[3].row = -1;offset[3].col = 0; //上 140 141 offset[0].row = 0; offset[0].col = 1; //右 142 offset[1].row = 1; offset[1].col = 1; //右下 143 offset[2].row = 1; offset[2].col = 0; //下 144 offset[3].row = -1; offset[3].col = -1; //左下 145 offset[4].row = 0; offset[4].col = -1; //左 146 offset[5].row = -1; offset[5].col = -1; //左上 147 offset[6].row = -1;offset[6].col = 0; //上 148 offset[7].row = -1; offset[7].col = 1; //右上 149 150 151 position here; 152 here.row = 1; here.col = 1; here.option = 0; 153 maze[1][1] = 1; //防止回到入口 154 // int option = 0; //下一步 155 int lastOption = 7; //最后一步 156 157 //寻找一条路径 158 while (here.row != row - 2 || here.col != col - 2) 159 {//没有找到出口 160 //找到要移动的相邻一步 161 int r, c; 162 while (here.option <= lastOption) { 163 r = here.row + offset[here.option].row; 164 c = here.col + offset[here.option].col; 165 if (maze[r][c] == 0) break; //如果是是通路,就一直超着该通路方向. 166 here.option++; //否则,选择下一个方向 167 } 168 //相邻的一步是否找到 ? 169 if (here.option <= lastOption) 170 {//移到maze[r][c] 171 path->push(here); //将(x,y)入栈 172 here.row = r; here.col = c; //求新点坐标,得新(x,y) 173 maze[r][c] = 1; //设置1,以防止重复访问 174 here.option = 0; 175 } 176 else { //没有邻近的一步可以走,返回 177 if (path->empty()) return false; //如果没有路径,则返回 178 // position next = path->top(); //here(当前位置) 和 next(退一步)相邻,next-->here(最后一次移动) 179 here = path->top(); 180 path->pop(); //往回走一步 181 here.option++; //换一个方向走 182 } 183 } 184 path->push(here); 185 return true; //到达出口 186 187 } 188 189 void outputPath(stack<position> *&path) 190 { 191 HANDLE console; 192 console = GetStdHandle(STD_OUTPUT_HANDLE); 193 SetConsoleTextAttribute(console, 14); 194 int len = path->size(), row = 0, col = 0; 195 for (int i = 1; i <= len - 1; i++) { 196 row = path->top().row , col = path->top().col; 197 cout << "(" << row << " , " << col << ")" << " <- " ; 198 if (i % 7 == 0) cout << endl; 199 path->pop(); 200 } 201 row = path->top().row , col = path->top().col; 202 cout << "(" << row << " , " << col << ")"; path->pop(); 203 cout << endl; 204 } 205 206 int main() 207 { 208 welcome(); 209 HANDLE console; 210 console = GetStdHandle(STD_OUTPUT_HANDLE); 211 SetConsoleTextAttribute(console, 13); 212 213 stack<position> *path = new stack<position>; 214 int row, col; 215 Pos(7, 20); 216 cout << "Enter the maze size(row and col): "; 217 cin >> row >> col; 218 int **m = NewDArray(row, col); //返回动态申请的二维数组 219 if (!m) { 220 cout << "out of Memory! \n"; 221 return 1; 222 } 223 Pos(9, 20); 224 cout << "输入迷宫: \n"; 225 MazeGenerator(m, row, col); //随机生成迷宫 226 MazeDisplay(m,row,col); //显示迷宫 227 228 if (findPath(path, m, row, col)) { 229 outputPath(path); 230 // MazeDisplay(m,row,col); //显示迷宫 231 } 232 else { 233 cout << "No Path " << endl; 234 } 235 236 system("pause"); 237 return 0; 238 } 239 240 241 242 void welcome() { 243 char pause; 244 HANDLE console; 245 console = GetStdHandle(STD_OUTPUT_HANDLE); 246 char mp[] = "F:\\KuGou\\薛之谦_绅士.mp3"; 247 play_mp3(mp); 248 Pos(7,33); 249 SetConsoleTextAttribute(console, 15); 250 cout << " Welcome To \n"; 251 Pos(9,31); 252 cout << "↖RAT IN A MAZE↗\n"; 253 Pos(11,31); 254 cout << "by 一念永恒, 2016\n"; 255 Pos(13, 0); 256 SetConsoleTextAttribute(console, 11); 257 cout << "加载ing...\t"; 258 for(int i = 0; i<101; ++i) 259 { 260 printf("%2.0f%%", i/100.0 * 100 ); 261 Sleep(20); 262 printf("\b\b\b"); 263 } 264 cout << "\n\t\t\t"; 265 for(int i = 0; i<5; ++i) 266 { 267 Sleep(500); cout << "@。@\t"; 268 } 269 cout << endl; 270 SetConsoleTextAttribute(console, 11); 271 cout << endl; 272 cout << "===============================按回车键进入游戏=========================================\n"; 273 cin.get(pause); 274 system("cls"); 275 } 276 277 void play_mp3(char *ps) // 歌曲的名字 278 { 279 char str[100] = "play "; 280 strcat(str,ps); 281 mciSendString(str,NULL,0,NULL); 282 }
标签:
原文地址:http://www.cnblogs.com/douzujun/p/5937015.html