1. 程式人生 > 實用技巧 >走迷宮動畫演示

走迷宮動畫演示

需下載EasyX庫https://easyx.cn/

這是無動畫演示的version https://www.cnblogs.com/xxxsans/p/13930576.html

code

#include<fstream>
#include<iostream>
#include<string>
#include<stack>
#include<vector>
#include<graphics.h>//引用圖形庫
using namespace std;

const int MaxSize = 12;//迷宮的最大規模
int maze[MaxSize][MaxSize];//迷宮矩陣二維陣列 int m, n;//迷宮的行列數 int speed = 1000;//設定動畫速度,越大演示的越慢 int win_high = 500, win_width = 500; int rectangle_high = 30, rectangle_width = 30; struct node { int x; int y; }; node current_node;//當前點 node next_node;//下一個點 node start_node;//迷宮起點 node end_node;//迷宮終點 stack<node> S; vector
<node>path; int has_nextnode();//在current_node處是否存在可向前的方向 void forward();//在current_node點,向next_node前進一步 void backward();//後退一步 void draw_rectangle(int x, int y, int high, int width, int type);//在x行y列繪製高high寬widt,型別為type的矩形 void init_win() { initgraph(win_high, win_width);//建立視窗 setorigin(100, 100
);//設定原點 cleardevice();//清理視窗 setcolor(BLACK);//設定背景為黑色 return; } void init_maze()//初始化迷宮矩陣 { int i, j; string filename = "../maze55.txt"; ifstream infile(filename); infile >> m >> n;//讀檔案,獲取行數m,列數n infile >> start_node.x >> start_node.y;//迷宮起點 infile >> end_node.x >> end_node.y;//迷宮終點 for (i = 0; i <= m; i++)//第0行和第n+1行設為障礙 { maze[i][0] = 1; maze[i][n + 1] = 1; } for (j = 0; j <= n; j++)//第0列和第n+1列設為障礙 { maze[0][j] = 1; maze[m + 1][j] = 1; } for (i = 1; i <= m; i++) { for (j = 1; j <= n; j++) { infile >> maze[j][i];//為了和text文件的行列相符合,把矩陣做了一個轉置 } } infile.close(); } void draw_rectangle(int x, int y, int high, int width, int type) { switch (type) {//根據type的值這的不同的顏色; case 0:setfillcolor(WHITE); break;//未走過的路 case 1:setfillcolor(DARKGRAY); break;//障礙 case 2:setfillcolor(BLUE); break;//已經走過的路 case 3:setfillcolor(RED); break;//當前位置 case 4:setfillcolor(GREEN); break;//回退的點 case 5:setfillcolor(YELLOW); break;//求解出的路徑 default:setfillcolor(-1 * type * 0x001100);//負數的時候顯示灰度值 } solidrectangle((x - 1) * rectangle_width, (y - 1) * rectangle_high, (x - 1) * rectangle_width + rectangle_high, (y - 1) * rectangle_high + rectangle_width); } void draw_maze() {//繪製迷宮的各個矩形 setlinestyle(PS_SOLID, 3); setlinecolor(BLACK); for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { draw_rectangle(i, j, rectangle_high - 3, rectangle_width - 3, maze[i][j]);//畫迷宮i行j列的頂點 } } } void display_DFSpath() {//根據棧中保留的路徑突出顯示起點到終點的路徑 while (!S.empty()) { current_node = S.top(); draw_rectangle(current_node.x, current_node.y, rectangle_high - 3, rectangle_width - 3, 5); S.pop(); } } int has_nextnode() { for (int i = 0; i <= 3; i++)//判斷當前current_node是否可以繼續向前 { next_node = current_node; switch (i) { case 0: next_node.x--; break; case 1: next_node.y--; break; case 2: next_node.x++; break; case 3: next_node.y++; break; } if (maze[next_node.x][next_node.y] == 0) return 1;//試探i號方向下的next_node是否可走,若可以,返回1; } return 0;//不存在可向前的方向 } void forward()//在current_node點,向next_node前進 { S.push(next_node);// 把next_node壓棧 draw_rectangle(current_node.x, current_node.y, rectangle_high - 3, rectangle_width - 3, 2); current_node = next_node;//更新current_node為next_node; maze[current_node.x][current_node.y] = 2;//標誌當前點為已經被走過 draw_rectangle(current_node.x, current_node.y, rectangle_high - 3, rectangle_width - 3, 3); Sleep(speed); } void backward()//後退一步 { draw_rectangle(current_node.x, current_node.y, rectangle_high - 3, rectangle_width - 3, 2); S.pop();// 彈棧; current_node = S.top();// current_node更新為回退的點; draw_rectangle(current_node.x, current_node.y, rectangle_high - 3, rectangle_width - 3, 4); Sleep(speed); } int DFS_maze()//深度優先搜尋迷宮的出口 { current_node = start_node; S.push(current_node); maze[current_node.x][current_node.y] = 2;//標記為已經訪問的點 while (!S.empty())//棧不空 { if (has_nextnode())//可以向前走 { forward();//向前走一步; if (current_node.x == end_node.x && current_node.y == end_node.y) return 1; } else { backward();//後退一步 } } if (S.empty()) return 0; } int main() { init_maze(); init_win(); draw_maze(); Sleep(speed); DFS_maze(); display_DFSpath(); Sleep(10000); }