基於win32的迷宮製作
成果展示
迷宮遊戲是非常經典的遊戲,在該題中要求隨機生成乙個迷宮,並求解迷宮;
要求查詢並理解迷宮生成的演算法,並嘗試用兩種不同的演算法來生成隨機的迷宮。
要求遊戲支援玩家走迷宮,和系統走迷宮路徑兩種模式。玩家走迷宮,通過鍵盤方向鍵控制,並在行走路徑上留下痕跡;系統走迷宮路徑要求基於 a*演算法實現,輸出走迷宮的最優路徑並顯示。 設計互動友好的遊戲圖形介面。
要隨機生成迷宮,並且要給出解決方案。
支援玩家走迷宮和系統走迷宮兩種方案。
設計友好的互動介面。
在這裡,我們選擇了prime演算法來作為實現隨機生成迷宮的演算法,下面我們先了解一下prime演算法。
prime演算法的核心步驟:
在帶權連通圖中v是包含所有頂點的集合, u已經在最小生成樹中的節點,從圖中任意某一頂點v開始,此時集合u=。
重複執行下述操作:
在所有u∈u,w∈v-u的邊(u,w)∈e中找到一條權值最小的邊,將(u,w)這條邊加入到已找到邊的集合,並且將點w加入到集合u中,當u=v時,就找到了這顆最小生成樹。
下面我們通過圖示法來演示一下工作流程:
首先,確定起始頂點。在這裡以頂點a作為起始點。根據查詢法則,與點a相鄰的點有點b和點h,比較ab與ah,ab的權值小,因此我們選擇點b,如下圖。並將點b加入到u中。
繼續下一步,此時集合u中有兩個點,再分別以這兩點為起始點,根據查詢法則(選取權值較小的邊),找到邊bc(當有多條邊權值相等時,可選任意一條),如下圖。並將點c加入到u中。
繼續,此時集合u中有三個點,根據查詢法則,我們找到了符合要求的邊ci,如下圖。並將點i加入到u中。
繼續,此時集合u中有四個點,根據查詢法則,找到符合要求的邊cf(當c有多條邊時,選擇權值最小的那個,因此這裡選擇cf),如下圖。並將點f加入到集合u中。
繼續,依照查詢法則我們找到邊fg,如下圖。並將點g加入到u中。
繼續,依照查詢法則我們找到邊gh,如下圖。並將點h加入到u中。
繼續,依照查詢法則我們找到邊cd,如下圖。並將點d加入到u中。
繼續,依照查詢法則我們找到邊de,如下圖。並將點e加入到u中。
此時,滿足u = v,即找到了這顆最小生成樹。
本次實驗只完成了隨機生成迷宮和人工走迷宮,因此一共分為兩大塊:
第一塊是隨機生成迷宮:
struct block};
struct point start,end;
這是定義乙個向量,以及初始化挖牆的礦工。
vector myblock;
int x_num=
1,y_num=1;
//礦工位置
int g[
100]
[100
];
這是乙個初始化函式,遊戲結束後重新開始,就需初始化。
void
init()
這一部分是礦工找牆。
void
findblock()
if(y_num+
1<=n && g[x_num]
[y_num+1]
== wall)
if(x_num-
1>=
1&& g[x_num-1]
[y_num]
== wall)
if(y_num-
1>=
1&& g[x_num]
[y_num-1]
== wall)
}
這一部分是隨機生成迷宮。
void
createmaze()
case rt:
case lt:
case up:
}//目標塊如果是牆
if(g[x_num]
[y_num]
==wall)
else
//刪除這堵牆(把用不了的牆刪了,對於那些已經施工過了不必再施工了,同時也是確保我們能跳出迴圈)
myblock.
erase
(myblock.
begin()
+randnum);}
}
這一部分是用來在介面上生成迷宮以及展現使用者自己走迷宮的路線。
void
mypaint
(hdc hdc)
}createmaze()
;//繪製路
hbrush hbrwhite=
createsolidbrush
(rgb
(255
,255
,255))
;//建立畫刷顏色為白色,用來繪製路
selectobject
(hdc,hbrwhite)
;//通過for迴圈,將選定座標的對應的矩形塗滿顏色
for(
int i=
1;i//繪製走的路
hbrush hbrred=
createsolidbrush
(rgb
(255,0
,0))
;//建立畫刷顏色為紅色,用來繪製走的路
selectobject
(hdc,hbrred)
;//通過for迴圈,將選定座標的對應的矩形塗滿顏色
rectangle
(hdc,
1*width,
1*height,(1
+1)*width,(1
+1)*height)
;for
(int z=
0;z)//繪製終點
hbrush hbrblue=
createsolidbrush
(rgb(0
,0,255))
;//建立畫刷顏色為藍色,用來繪製終點
selectobject
(hdc,hbrblue)
;rectangle
(hdc,m_destination.x*width,m_destination.y*height,
(m_destination.x+1)
*width,
(m_destination.y+1)
*height);}
//定義乙個程式開始的函式
void
onstart
(hwnd hwnd)
第二部分是用鍵盤走迷宮:
這個結構體用來表示使用者自己走迷宮。
struct playm_play;
下面是鍵盤控制部分。
switch
(wparam)
for(z=m_play.len-
1;z>=
1;z--
)//到達目的地,遊戲結束
if(m_play.m_pos[0]
.x==m_destination.x&&m_play.m_pos[0]
.y==m_destination.y)
else
}
hdc=
getdc
(hwnd)
;//提取迷宮移動的方向的控制代碼
mypaint
(hdc)
;//用畫刷展示
break
;
計算機軟體之母
所謂計算機軟體之母,其實是創造第乙個現代編譯程式的婦女,她同時也是商用計算機程式語言的發明人。附錄 葛麗絲 穆雷 霍普 英語 grace murray hopper,1906年12月9日 1992年1月1日 女,本姓穆雷 murray 霍普 hopper 為夫姓。美國海軍准將及計算機科學家,世界最早...
計算機軟體的發展
在20世紀70年代,隨著科技的發展和各企業工作範圍以及員工工作強度的增加,大家越來越對每天手動除了報表以及紙質檔案感到頭痛以及力不從心,於 是,人們就在尋找一種操作更簡捷運算更準確的工具,於是,傳統企業軟體產生了。此時大家所使用的軟體,只是單機版本的應用軟體,也就是說,軟體只能安裝和 執行在一台計算...
計算機軟體的發展
在20世紀70年代,隨著科技的發展和各企業工作範圍以及員工工作強度的增加,大家越來越對每天手動除了報表以及紙質檔案感到頭痛以及力不從心,於 是,人們就在尋找一種操作更簡捷運算更準確的工具,於是,傳統企業軟體產生了。此時大家所使用的軟體,只是單機版本的應用軟體,也就是說,軟體只能安裝和 執行在一台計算...