import random

# given an input list of cards, shuffle them and return a new shuffled list
def shuffle(deck):
numCards = len(deck)
for i in range(0, numCards):
rand_index = random.randrange(0, numCards)
temp = deck[rand_index]
deck[rand_index] = deck[i]
deck[i] = temp
return deck

# ensure the human player picks a valid spade from the remaining cards in hand
def p1_algorithm(p1_spades):
p1_bid = 0
while not (p1_bid in p1_spades):
p1_bid = int(input("Enter player 1 bid: "))
return p1_bid

# given the complete state of the game, this AI algorithm will make a choice
# for the computer player and return the resulting selection.
def p2_algorithm(middle_cards,diamonds,p1_spades,p2_clubs):
# this simple algorithm just makes a random selection from the available cards

index = random.randrange(0, len(p2_clubs))
p2_selection = p2_clubs[index]
return p2_selection

def play_round(diamonds, p1_spades, p2_clubs, p1_capture, p2_capture, middle_cards):
middle_card = diamonds.pop(0);
middle_cards.append(middle_card);
print(str.format("Middle card(s): {0}", str(middle_cards)));
print(str.format(" Player 1 available: {0}", str(p1_spades)));
player1_bid = p1_algorithm(p1_spades);
p1_spades.remove(player1_bid);
player2_bid = p2_algorithm(middle_cards,diamonds,p1_spades,p2_clubs);
p2_clubs.remove(player2_bid);
print(str.format(" Player 2 bid: {0}", str(player2_bid)));
if (player1_bid > player2_bid):
while len(middle_cards) > 0:
value = middle_cards.pop(0);
p1_capture.append(value);
middle_cards.clear();
print(str.format(" Player 1 wins bid, has captured {0}", str(p1_capture)));

if (player2_bid > player1_bid):
while len(middle_cards) > 0:
value = middle_cards.pop(0);
p2_capture.append(value);
middle_cards.clear();
print(str.format(" Player 2 wins bid, has captured {0}", str(p2_capture)));

if (player2_bid == player1_bid):
print(" Tie bid - middle card remains");
return

def determine_winner(p1_capture, p2_capture):
print("===GAME OVER===")
print("Player 1 captured: " + str(p1_capture));
print("Player 2 captured: " + str(p2_capture));
p1_score = 0
while len(p1_capture) > 0:
p1_score = p1_score + p1_capture.pop(0)
p2_score = 0
while len(p2_capture) > 0:
p2_score = p2_score + p2_capture.pop(0)
print("Player 1 scored " + str(p1_score), "Player 2 scored " + str(p2_score));
if (p1_score > p2_score):
print("PLAYER 1 WINNER");
if (p2_score > p1_score):
print("PLAYER 2 WINNER");
if (p1_score == p2_score):
print("TIE GAME");

# MAIN PROGRAM LOGIC
# NO STUDENT CHANGES BELOW THIS POINT

# randomize random number generator with a known seed for repeatability
seed = int(input("Enter random seed: "))
random.seed(seed)

# initialize 3 hands, each with cards 2 - 10
diamonds = [2,3,4,5,6,7,8,9,10]
p1_spades = [2,3,4,5,6,7,8,9,10]
p2_clubs = [2,3,4,5,6,7,8,9,10]

# initialize empty lists of cards that each player captures or that are in the middle
p1_capture = []
p2_capture = []
middle_cards = []

# shuffle the deck of diamonds
diamonds = shuffle(diamonds)

# game continues while diamonds are left
while len(diamonds) > 0:
play_round(diamonds, p1_spades, p2_clubs, p1_capture, p2_capture, middle_cards)

# all diamonds are gone, so game is over - time to determine winner
determine_winner(p1_capture, p2_capture)

Answer the following questions:

Describe the overall purpose of the program

Lists are one common way to manage complex data within a program. Your GOPS game uses several lists. Select one list and show how that list was initialized with data (copy/paste the code segment here).

For your selected list, copy and paste code from your program that shows that list being used for some purpose.

What is the name of your list, what does the data represent, and how is it used in the sample code you selected?

How does using a list allow your program to easily manage complexity associated with that data? Could the program be written without lists, and if so, how?

Your determine_winner() method contains an algorithm that uses both selection (if statements) and iteration (looping). How is determine_winner() called from within your program? What parameters are provided?

What is the overall purpose of determine_winner()?

Explain the steps in determine_winner() in enough detail that someone else could recreate it from your explanation.

What conditions are being tested inside determine_winner()?

Describe the contents of the determine_winner() parameters that would trigger the PLAYER 1 WINNER message, the PLAYER 2 WINNER message, and the TIE GAME message.

The overall purpose of the program is to simulate a card game called GOPS between two players. Each player has a set of cards and must make bids on the middle card. The player with the higher bid captures the middle card. The game continues until all the diamonds are gone, at which point the winner is determined based on the total value of captured cards.

One list that is initialized with data is the list of diamonds:
```
diamonds = [2,3,4,5,6,7,8,9,10]
```

In the sample code selected, the list of diamonds is shuffled at the beginning of the game:
```
diamonds = shuffle(diamonds)
```

The list named "diamonds" represents the cards that are available for bidding in the game. It is used to keep track of the cards that are left to be played and shuffled to ensure random distribution of cards.

Using a list allows the program to easily keep track of the remaining cards, shuffle them, and manipulate them during the game. Without a list, the program would need individual variables for each card, which would make the code less readable and harder to manage.

The determine_winner() method is called at the end of the game when all the diamonds are gone. It is called with the parameters p1_capture and p2_capture, which are the lists of cards captured by each player.

The overall purpose of determine_winner() is to calculate the total value of cards captured by each player, compare the totals, and determine the winner based on the highest total score.

The determine_winner() function iterates through the lists of captured cards for each player, calculates the total score by summing up the values of the cards, compares the totals of both players, and displays the result of the game (PLAYER 1 WINNER, PLAYER 2 WINNER, TIE GAME) based on the comparison.

In determine_winner(), the conditions being tested are who has the highest total score of captured cards. If p1_score > p2_score, PLAYER 1 WINNER is displayed. If p2_score > p1_score, PLAYER 2 WINNER is displayed. If p1_score == p2_score, TIE GAME is displayed.

Describe the contents of the determine_winner() parameters that would trigger the PLAYER 1 WINNER message, the PLAYER 2 WINNER message, and the TIE GAME message.

To trigger the PLAYER 1 WINNER message in the determine_winner() method, the parameter p1_capture must contain a higher total value of cards than p2_capture. This means that the total sum of the values of the cards in p1_capture is greater than the total sum of the values of the cards in p2_capture.

To trigger the PLAYER 2 WINNER message in the determine_winner() method, the opposite is true. The parameter p2_capture must contain a higher total value of cards than p1_capture. This means that the total sum of the values of the cards in p2_capture is greater than the total sum of the values of the cards in p1_capture.

To trigger the TIE GAME message in the determine_winner() method, both p1_capture and p2_capture must contain the same total value of cards. This means that the total sum of the values of the cards in p1_capture is equal to the total sum of the values of the cards in p2_capture.

Make it shorter.

To trigger the PLAYER 1 WINNER message: p1_capture > p2_capture

To trigger the PLAYER 2 WINNER message: p2_capture > p1_capture

To trigger the TIE GAME message: p1_capture = p2_capture