正在编写推箱子游戏的自动求解程序
生活随笔
收集整理的這篇文章主要介紹了
正在编写推箱子游戏的自动求解程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
網上搜索了一下,有好多人現成的產品,不少國產的。編寫這個程序只是為了回憶一下算法。不能丟了。
自動求解有倆種方案:一個是求最小行走步驟,一個是求最小推箱子數目。
第一種算法簡單些,只要將小人推動的四個方向進行廣度優(yōu)先搜索,通過各種砍掉各種不對的情況來減少搜索數量,但搜索的數量仍然非常巨大。
以下情況可砍掉:
1、前方是墻;
2、前方是箱子,但箱子的前方是墻或者箱子;
3、行動方向和上一步驟的方向是反方向,且上一步沒有推箱子;
4、如果小人移動造成推動箱子,那么檢查移動后形成的棋盤:
??? 4.1 、以 被推動的棋子 為中心,有沒有出現以下死棋。
■■□?? □■■??? □□□?? □□□
■◆□?? □◆■??? ■◆□?? □◆■
□□□?? □□□??? ■■□?? □■■
■ 表示這個位置可能是墻或者箱子;
◆ 表示“被推動的棋子”在推動后所在的位置;
□ 僅為方便理解圖片,無任何其他意義。?
????????????? 如果出現上面的情況,就是死棋。
???? 4.2、比較移動后的步驟和之前的步驟是否出項相同的棋局。
注:這里所指“前方”是指行走方向的前方。
第二種方案是求最小推箱數,這個算法上復雜一些,
以小人為起點,做“油漆桶”處理,什么叫“油漆桶”處理呢,看看畫筆軟件中使用“油漆桶”功能,他可以滲透所有空白的地方。通過此功能,找到所有可以“接觸”到的箱子,對所有這些箱子推動,廣度優(yōu)先算法形成搜索樹。然后和第一種方案基本相似的方式砍掉多余的樹枝。
這個方案我還沒有實施,所以還沒有想的很具體,先實現第一個在說。
希望有興趣的朋友可以給意見,告訴我還有那些死棋可以判斷。
自動求解有倆種方案:一個是求最小行走步驟,一個是求最小推箱子數目。
第一種算法簡單些,只要將小人推動的四個方向進行廣度優(yōu)先搜索,通過各種砍掉各種不對的情況來減少搜索數量,但搜索的數量仍然非常巨大。
以下情況可砍掉:
1、前方是墻;
2、前方是箱子,但箱子的前方是墻或者箱子;
3、行動方向和上一步驟的方向是反方向,且上一步沒有推箱子;
4、如果小人移動造成推動箱子,那么檢查移動后形成的棋盤:
??? 4.1 、以 被推動的棋子 為中心,有沒有出現以下死棋。
■■□?? □■■??? □□□?? □□□
■◆□?? □◆■??? ■◆□?? □◆■
□□□?? □□□??? ■■□?? □■■
■ 表示這個位置可能是墻或者箱子;
◆ 表示“被推動的棋子”在推動后所在的位置;
□ 僅為方便理解圖片,無任何其他意義。?
????????????? 如果出現上面的情況,就是死棋。
???? 4.2、比較移動后的步驟和之前的步驟是否出項相同的棋局。
注:這里所指“前方”是指行走方向的前方。
第二種方案是求最小推箱數,這個算法上復雜一些,
以小人為起點,做“油漆桶”處理,什么叫“油漆桶”處理呢,看看畫筆軟件中使用“油漆桶”功能,他可以滲透所有空白的地方。通過此功能,找到所有可以“接觸”到的箱子,對所有這些箱子推動,廣度優(yōu)先算法形成搜索樹。然后和第一種方案基本相似的方式砍掉多余的樹枝。
這個方案我還沒有實施,所以還沒有想的很具體,先實現第一個在說。
希望有興趣的朋友可以給意見,告訴我還有那些死棋可以判斷。
轉載于:https://www.cnblogs.com/tansm/archive/2005/06/02/166490.html
總結
以上是生活随笔為你收集整理的正在编写推箱子游戏的自动求解程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java与JavaScript的通信
- 下一篇: DotNet软件开发框架