基於A 演算法的迷宮遊戲開發

2021-10-22 00:04:33 字數 2871 閱讀 8591

1.1 專案目標和主要內容

3×3九宮棋盤,放置數碼為1 -8的8個棋牌,剩下乙個空格,通過數字向空格的移動來改變棋盤的布局。

1.2 專案的主要功能

根據給定初始布局(即初始狀態)和目標布局(即目標狀態),如何移動棋牌才能從初始布局到達目標布局,找到合法的過程序列。

2、 專案設計

2.1 專案總體框架

2.2 系統詳細設計

啟發式搜尋就是在狀態空間中的搜尋對每乙個搜尋的位置進行評估,得到最好的位置,再從這個位置進行搜尋直到目標。這樣可以省略大量無謂的搜尋路徑,提高了效率。在啟發式搜尋中,對位置的估價是十分重要的。採用了不同的估價可以有不同的效果。

啟發中的估價是用估價函式表示的,如:f(n) = g(n) + h(n)

其中f(n) 是節點n的估價函式,g(n)是在狀態空間中從初始節點到n節點的實際代價,h(n)是從n到目標節點最佳路徑的估計代價。在這裡主要是h(n)體現了搜尋的啟發資訊,因為g(n)是已知的。如果說詳細點,g(n)代表了搜尋的廣度的優先趨勢。但是當h(n) >> g(n)時,可以省略g(n),而提高效率。

(2)a*演算法過程:

(1). 把起點加入 open list 。

(2). 重複如下過程:

a. 遍歷open list ,查詢f值最小的節點,把它作為當前要處理的節點,然後移到close list中

b. 對當前方格的相鄰方格一一進行檢查,如果它是不可抵達的或者它在close list中,忽略它。否則,做如下操作:

□ 如果它不在open list中,把它加入open list,並且把當前方格設定為它的父親

□ 如果它已經在open list中,檢查這條路徑 ( 即經由當前方格到達它那裡 ) 是否更近。如果更近,把它的父親設定為當前方格,並重新計算它的g和f值。如果你的open list是按f值排序的話,改變後可能需要重新排序。

c. 遇到下面情況停止搜尋:

□ 把終點加入到了 open list 中,此時路徑已經找到了,或者

□ 查詢終點失敗,並且open list 是空的,此時沒有路徑。

(3). 從終點開始,每個方格沿著父節點移動直至起點,形成路徑。

#include

#include

using namespace std;

int const maxsize = 1000;

int const maxsteps = 100;

struct node;

int counth(int* status)

h = h + sqrt(pow((i % 3 - j % 3), 2) + pow((i / 3 - j / 3), 2));//歐式距離

}return h;}

int* right(int* s, int index)

temp = status[index + 1];

status[index + 1] = 0;

status[index] = temp;

return status;

}int* up(int* s, int index)

temp = status[index - 3];

status[index - 3] = 0;

status[index] = temp;

return status;

}int* down(int* s, int index)

temp = status[index + 3];

status[index + 3] = 0;

status[index] = temp;

return status;}/*

*篩選新節點

/**顯示移動過程

/void show_all(node node)

step++;

node = node->parent;//向上輸出

}cout << 「----------------------」 << endl;

cout << 「一共執行了:」 << total << 「步」 << endl;

cout << 「----------------------」 << endl;

for (i = step - 1; i >= 0; i–)

cout << 「----------------------」 << endl;}}

//判斷逆序數(不包含0)

int inverse_num(int a, int n) }}

return sum;}/*

主函式/

int main()

int s1 = inverse_num(status, 9);

int s2 = inverse_num(status0, 9);

cout << "初始狀態逆序數:" << s1 << endl;

cout << "目標狀態逆序數:" << s2 << endl;

if (!((s1 % 2) == (s2 % 2)))

begintime = clock();

for (i = 0; i < 9; i++) //判斷0節點位置

p = initnode(status, i, 0, null, 0); //獲得初始節點

open[o] = *p; //將初始節點放入open中

o++;

q = search();

if (!q)

cout << "無解" << endl;

else

show_all(q);

endtime = clock();

cout << "run time:" << endtime - begintime << "ms" << endl;

return 0;

基於C 的勇闖迷宮遊戲

一 使用說明 1.1 專案簡介 迷宮只有兩個門,乙個門叫入口,另乙個門叫出口。乙個騎士騎馬從入口進入迷宮,迷宮設定很多障礙,騎士需要在迷宮中尋找通路以到達出口。1.2 專案功能要求 可以採用二維陣列,回溯和遞迴或非遞迴加棧實現 也可以用bfs演算法 即圖的廣度優先搜尋演算法,又叫寬度優先搜尋演算法 ...

基於C 的勇闖迷宮遊戲

一 使用說明 1.1 專案簡介 迷宮只有兩個門,乙個門叫入口,另乙個門叫出口。乙個騎士騎馬從入口進入迷宮,迷宮設定很多障礙,騎士需要在迷宮中尋找通路以到達出口。1.2 專案功能要求 可以採用二維陣列,回溯和遞迴或非遞迴加棧實現 也可以用bfs演算法 即圖的廣度優先搜尋演算法,又叫寬度優先搜尋演算法 ...

小遊戲開發 迷宮(遞迴版)

前面我們寫到迷宮的普通版,那這篇文章就來寫一下如何用遞迴來實現!遞迴實現迷宮問題同普通版差不多,其中關鍵思路 初始化及列印地圖 建立位置結點類等與普通版一樣,只有判斷座標的合理性與尋找迷宮通路的方法不同而已。源 如下 include include using namespace std inclu...