在之前的作業中,曾經實現過牧師與魔鬼這個益智小遊戲,但是一些小朋友玩這個遊戲的時候可能有些困難(比如十年前在qq空間玩這個遊戲的我),因此,我們可以開發乙個autonext的功能,給小朋友提示一下下一步該怎麼操作。
由於這次的智慧型設計比較簡單,只有三個牧師和三個魔鬼,因此我們可以使用狀態圖來幫助分析遊戲當前的狀態,然後根據當前狀態執行下一步正確操作即可。以下為狀態圖的表示,每乙個狀態記錄在起始岸(右岸)上的牧師與魔鬼數。
需要注意的是,每一次箭頭指出之後,船的位置會發生變化,也就是說同樣的右岸上3人1鬼,船在左側和船在右側的操作是不一樣的。即使是3人3鬼這樣比較小的資料,其狀態還是有很多種的(以至於我畫流程圖到2人2鬼的時候,實在受不了了,於是就把後面的其他過程省略了…)。然而這麼多的狀態,能成功的解法卻很少,把遊戲失敗的狀態以及多餘的步驟去掉之後,我們就能得出這個遊戲的正確解法流程。
如此一來,流程就變得簡單多了,接下來就是用**實現了。首先,當使用者選擇執行autonext操作時,需要判斷當前遊戲狀態,然後執行最優解。舉個栗子,如當前船在右岸,岸上3人2鬼,接下來的步驟可以是:
從狀態圖中可以看出,無論岸上剩下1人2鬼還是2人1鬼(意味對岸是1人2鬼),遊戲都會以失敗結束,因此方法1和2是不可行的。其次,方法4和5雖然不會導致遊戲失敗,但從狀態圖中可看出方法4和5其實是一種回溯,也就是步驟重複,因此也不是最優解。那麼只剩下方法3是可行的方案了。
具體實現如下:
step 1.在gengameobject類(建立遊戲物件和處理物件運動)中,定義列舉型別act,新增兩個列舉型矩陣,分別記錄船在左右兩岸時不同的遊戲狀態下的下一步執行操作標記。使用矩陣(狀態表)的目的是表達清晰,方便更改維護,且能減少邏輯判斷複雜度。
act列舉說明:l(r)表示左岸(右岸)的人物進行上船操作,e表示魔鬼上船,h表示人類(牧師)上船,he表示1人1鬼上船,hh表示2人上船,ee表示2鬼上船,x代表對應狀態不存在或是該狀態下遊戲結束(失敗或勝利)。
[貼一張狀態表]
// ai次狀態表,以列舉型矩陣形式儲存
private enum act ;
private act[,] matleft = new act[4, 4]
, ,,}
; private act[,] matright = new act[4, 4]
, ,,}
;
step 2.同樣在gengameobject類中,設計自動執行最優解步驟的函式(僅上船操作)
// 自動執行最優解步驟
public
void
autoact()
}else
if (side == 1)}}
step 3.更改ui介面以及autonext的相應操作
if (gui.button(new rect(x + width + 5f, (height + 5f) * 2 + y, width, height), "autonext"))
step 4.更新basecode類中的函式接 Unity3D 魔鬼與牧師遊戲記錄 MVC架構
遊戲成品圖 設定60s倒計時 60s後如果未能安全運送所有魔鬼與牧師,遊戲失敗。嘗試改進介面,對一些東西還不太熟悉。1列出遊戲中提及的事物 objects object 三個魔鬼 用白cube表示 三個牧師 用黑sphere表示 一艘船 兩個岸 2遊戲架構 iscenecontroller.cs和i...
3D遊戲設計與分析 牧師與魔鬼V2
在動作分離版的設計,將上船 下船以及船的移動都分離出來,畫出簡略的uml圖如下 這個類是用來控制具體的遊戲事件,有三個方法 start update 和ssactionevent start 方法用於將ssdirector例項化,update 方法用於實現具體的遊戲事件,ssactionevent ...
Unity3D遊戲開發
入門級unity安裝教程 一 unity五大面板 unity3d的介紹 1 介面 選單 面板 元件 unity5.x 編輯器介紹 unity開啟篇 一 滑鼠右鍵 wsadeq前後左右上下移動 shift加速移動 滑鼠右鍵旋轉檢視 滑鼠中鍵移動檢視 alt 右鍵縮放 alt 左鍵旋轉物體視角 q移動場...