我會盡力解釋我的問題。我正在嘗試在 PHP 中創建一個國際象棋引擎(只是為了好玩 :-))代碼中的整數只是返回有效的移動(為簡單起見 - 在實際代碼中它是對象和移動模式取決于它是關于哪一塊的)我正在尋找一種有效搜索數組的方法。有效地我的意思是盡可能快??纯次以谙旅娲a中的評論“是否可以在不遍歷所有 1000 個值的情況下跳出循環?” 我希望評論能解釋我想要達到的目標。我只是在尋找優化以下代碼的想法,而不是完整的代碼:-)//This is for demonstrating//1000 values to go through$moves_maybe_valid = range(1,1000);shuffle($moves_maybe_valid);//Go through possible values$move_checked = [];$nr=0;foreach($moves_maybe_valid as $mmv) { $move_is_valid = check_move($mmv); //Check if not in checked array if ($move_is_valid === false && !in_array($mmv, $move_checked)) { //Add to checked move array $move_checked[] = $mmv; } //IS it possible to break out of loop without //going through all 1000 values? //When all valid moves are true I want to break here //but I don't know when that is.}//for demonstration purpose only//numbers (5,6) that returns true are unknown until an//an actual check is done in this functionfunction check_move($nr) { if ($nr == 5 || $nr == 6) { return true; } return false;}如果我說我會從一開始就生成有效的移動(基于下面的評論)$valid_moves = [5,6];跳出循環的最佳方法是什么?
1 回答

慕雪6442864
TA貢獻1812條經驗 獲得超5個贊
在正常情況下,您可能遇到的最大有效移動數約為 100。隨著升級,它可能會更高一些,所以如果您有 9 個皇后,您可能會達到 200。不過,1000 還是太大了。
生成有效動作列表應該意味著您甚至不需要檢查它們是否有效。但是,我想你正在生成所有組合的列表,即使它們涉及通過另一塊,用你自己的塊落在一個正方形上,或者落在棋盤域之外。
我會說,在你的第一代做這些檢查:
對于每個棋子,檢查 4 種可能的移動并存儲有效的移動
對于每個城堡或主教,按順序檢查 14 個可能的位置,從棋子位置開始,向 4 個方向前進,直到你擊中一個無效空間(擊中你自己的棋子意味著你走得太遠了。擊中對手棋子意味著你'我打了最后一個)
對于皇后,與城堡或主教相同,但有 8 個方向而不是 4 個
對于騎士,檢查 8 種可能的動作是否有效
對于國王,檢查 8 種可能的移動是否有效
檢查兩個城堡移動中的任何一個是否可行
對于每一步,您還需要確保它不會讓您受制于人。該功能可能可以優化,因此您只能從國王的位置向外看。
一旦你遍歷了所有棋子,最多 16 個,你的動作列表應該只包含有效的動作。
事情變得昂貴的地方是你的前瞻性。您想模擬未來的多少步?你如何衡量每一步的價值/風險?
然后是簡介。您需要一個好的采樣分析器來優化和找到您的熱點。注意昂貴的便利功能,如有in_array
可能請避免使用。循環中的循環會降低性能。
- 1 回答
- 0 關注
- 107 瀏覽
添加回答
舉報
0/150
提交
取消