我目前正致力于国际象棋游戏的一个简单的python 3实现,可以计算合法移动,并且可以确定诸如check,checkmate和stalemate之类的东西。我遇到了导致递归的逻辑错误,而且我不确定如何更改当前的方法来避免这种情况。
我在这里得到了一些伪代码(我的实际代码长达数百行,将它全部粘贴到逻辑问题上是不切实际的。)
我在这段代码背后的思考过程中哪里出错?
class ChessBoard:
def get_position():
# returns fen of position
def set_position(position_code):
# sets the board's position and values using the fen code given
# assume its white's turn right now
def calculate_moves():
# uses vectors to calculate moves for all pieces
for each_move in candidate_moves:
if passes_all_general_conditions:
# now I need to check if the potential
# legal move will leave the user in check
# obviously if the white king can be taken in the next turn
# by the other color then the move cannot be considered legal
temp_board = ChessBoard()
temp_board.set_position(self.get_position())
temp_board.make_move(the_selected_move_that_needs_checking)
if not temp_board.incheck():
# add move to list of legal moves
def incheck():
# player is in check if a piece can take it on the next turn
# don't I need to know what moves can be made before I can know if its check??
# let k equal the current turn (or half-turn as chess players call it)
# in order to calculate the moves for position at turn k
# the moves for position k + 1 must be known
# obviously this just enters infinite recursion
答案 0 :(得分:0)
看起来public void FriendLists(){
GetFriendsListRequest request = new GetFriendsListRequest ();
request.IncludeFacebookFriends = true;
PlayFabClientAPI.GetFriendsList (request, GetFriends, FriendListError);
}
void GetFriends(GetFriendsListResult result){
friends = result.Friends;
Debug.Log("Friends");
for(int i=0;i<friends.Count;i++){
Debug.Log(friends[i].Username);
}
}
未实现。 python方法的默认返回值是None类型。
incheck()
因此,循环中最深嵌套的条件总是计算为True。
答案 1 :(得分:0)
我感谢您没有复制粘贴整个代码,但至少要显示其中的一部分,以便解决您的问题。
由于我无法在没有看到代码的情况下调试代码,我只想猜一下: 我认为你在incheck()中使用calculate_moves(),并且incheck来验证compute_moves是合法的。
如果你这样做,你有两个选择: -Split calculate_moves分为两个函数:一个生成伪合法,另一个然后控制合法性的这些伪子。您只需通过calculate_pseudolegals()替换incheck()中的calculate_moves()。这种方法虽然效率有点低。
- 更有效的解决方案是完全删除你的incheck()例程并编写一个新的,有效的例程。在那里你将用你自己的颜色的每一个数字替换你想要检查的国王,然后测试它是否能够击中对手的同一类型的数字。如果可以,你的国王将受到控制。请注意,您仍需要一个calculate_pseudolegals()函数才能使其正常工作。