The aim of this puzzle is to simulate games of War, given two initial decks. It is a good start to develop a function to compare the value of 2 cards. Once you have it, it is basically a lot of control flow statemens to handle wars, and the possible outcomes of a round. My solution gives a simple example of error management in Python.

# Game configuration : the differents cards possible and their value # We would only need to modify this dictionnary if the order of the # card changed, or if we wanted to play with a 32 card game for example values = {'2D':2, '2H':2, '2C':2, '2S':2, '3D':3, '3H':3, '3C':3, '3S':3, '4D':4, '4H':4, '4C':4, '4S':4, '5D':5, '5H':5, '5C':5, '5S':5, '6D':6, '6H':6, '6C':6, '6S':6, '7D':7, '7H':7, '7C':7, '7S':7, '8D':8, '8H':8, '8C':8, '8S':8, '9D':9, '9H':9, '9C':9, '9S':9, '10D':10, '10H':10, '10C':10, '10S':10, 'JD':11, 'JH':11, 'JC':11, 'JS':11, 'QD':12, 'QH':12, 'QC':12, 'QS':12, 'KD':13, 'KH':13, 'KC':13, 'KS':13, 'AD':14, 'AH':14, 'AC':14, 'AS':14} def compare(c1, c2): ''' returns : - 0 if card1 and card 2 have equal values - 1 if card1 wins over card2 - 1 if card2 wins over card1''' global values if values[c1] < values[c2]: return -1 elif values[c1] > values[c2]: return 1 else: return 0 # Reads input to initialize decks deck1, deck2 = [], [] for i in range(int(input())): deck1.append(input()) for i in range(int(input())): deck2.append(input()) nbRounds = 0 while True: # Each loop is one game round # pile1 and pile2 are the cards played this turn by player 1 and 2 try: pile1, pile2 = [deck1.pop(0)], [deck2.pop(0)] except IndexError: # this error means one of the two decks is empty winner = '1' if len(deck1) > 0 else '2' print(winner, nbRounds) break nbRounds+=1 # In case of war(s) try: # While there is a war, each player plays 3 other cards while compare(pile1[-1], pile2[-1]) == 0: for i in range(4): pile1.append(deck1.pop(0)) pile2.append(deck2.pop(0)) except IndexError: # an index error means one of the two decks got empty # during a war, and both players are equally first print('PAT') break # Moves the 2 piles to the round winner's deck bottom if compare(pile1[-1], pile2[-1]) == -1: deck2 = deck2 + pile1 + pile2 else: deck1 = deck1 + pile1 + pile2