in nevergrad/functions/games/game.py [0:0]
def war_play_game(self, policy1, policy2, batawaf=False):
# pylint: disable=too-many-return-statements
self.batawaf = batawaf
if policy1 is None and policy2 is None:
if batawaf:
return 10 * 18 * 6
return 10 * 26 * 13
cards = [i // 4 for i in range(52)] if not batawaf else [i // 6 for i in range(36)]
shuffled_cards = list(np.random.choice(cards, size=len(cards), replace=False))
if batawaf:
cards1 = shuffled_cards[:18]
cards2 = shuffled_cards[18:]
else:
cards1 = shuffled_cards[:26]
cards2 = shuffled_cards[26:]
assert len(cards1) == len(cards2)
stack = []
for _ in range(500): # A game of length 5000 is a draw.
# print cards1, " vs ", cards2
if not (cards1 or cards2):
return 0
elif not cards1:
return 2
elif not cards2:
return 1
# Pick up first card.
card1 = cards1[0]
card2 = cards2[0]
del cards1[0]
del cards2[0]
stack += [card1, card2]
# Standard case.
if card1 > card2:
cards1 += self.war_decide(policy1, len(cards1), sorted(stack, reverse=True))
stack = []
continue
if card2 > card1:
cards2 += self.war_decide(policy2, len(cards2), sorted(stack, reverse=True))
stack = []
continue
# Battle!
if len(cards1) < 2 or len(cards2) < 2:
return 1 if len(cards2) < len(cards1) else 2 if len(cards1) < len(cards2) else 0
stack += [cards1[0], cards2[0]]
del cards1[0]
del cards2[0]
return 0