这个问题在这里已有答案:
我正在尝试编写基本的黑杰克策略。我想让我的程序根据经销商的上牌和比赛开始时的玩家2张牌返回正确的动作。我已经整理了一个简单的功能来处理传入的玩家卡,在处理经销商卡和玩家卡的功能中。
def player_has(card_sets, player_cards):
for card_set in card_sets:
if (card_set[0] and card_set[1]) in player_cards:
return True
return False
def get_best_move(player_cards, dealer_card):
move = ''
if dealer_card == 2 or dealer_card == 3 or dealer_card == 4 and \
player_has([[2, 2], [3, 3], [6, 6], [7, 7], [8, 8], [9, 9], [11, 11]], player_cards):
print('split')
elif dealer_card == 2 or dealer_card == 3 or dealer_card == 4 and player_has([[4, 4]], player_cards):
print('Hit')
elif dealer_card == 2 or dealer_card == 3 or dealer_card == 4 and player_has([[5, 5]], player_cards):
print('Double Down')
elif dealer_card == 2 or dealer_card == 3 or dealer_card == 4 and player_has([[10, 10]], player_cards):
print('Stand')
print(move)
return move
_player_cards = [10, 10]
_dealer_card = 3
get_best_move(_player_cards, _dealer_card)
问题是这个测试应该返回带有值[10,10]的elif语句,或者print('stand')。但相反,它返回顶部的if语句,不包括玩家卡10和10的组合。
你在布尔表达式中缺少一些括号。
在主要的if
语句中,您希望在所有or
s周围加上括号,例如:
if (dealer_card == 2 or dealer_card == 3 or dealer_card == 4) and ..
否则,and
优先于or
s。
正如评论中指出的那样,您需要:
if (card_set[0] in player_cards) or (card_set[1] in player_cards):
而不是你拥有,因为你想检查in
两次。
见operator precedence section of the Python docs for more info。