mirror of
https://github.com/JonasunderscoreJones/EPI-2324.git
synced 2025-10-23 08:29:19 +02:00
290 lines
8.7 KiB
Python
290 lines
8.7 KiB
Python
'''EPR Übungsblatt 05'''
|
|
__author__="7987847, Werner"
|
|
|
|
import random
|
|
import blatt04
|
|
|
|
|
|
def load_players() -> [str]:
|
|
'''Erstellt die Spieler des Spiels'''
|
|
while True:
|
|
try:
|
|
player_count = int(input("Anzahl der Spieler (3-4): "))
|
|
if player_count in [3, 4]:
|
|
break
|
|
except ValueError:
|
|
pass
|
|
|
|
player_names = []
|
|
|
|
for i in range(player_count):
|
|
print("Spieler", i+1, "Name: ", end='')
|
|
name = input()
|
|
if name == "":
|
|
name = "Spieler " + str(i+1)
|
|
player_names.append(name)
|
|
|
|
return player_names
|
|
|
|
|
|
def initialize_variables(players:[str]) -> ({str: int}, {str: list}):
|
|
'''Initialisiert die Variablen für das Spiel'''
|
|
|
|
score_dict = {}
|
|
hand_dict = {}
|
|
|
|
# Erstelle und mische das Kratenblatt
|
|
deck = blatt04.create_card_list(12)
|
|
deck = blatt04.shuffle_card_list(deck)
|
|
|
|
for i in players:
|
|
score_dict[i] = 0
|
|
hand_dict[i] = []
|
|
|
|
hand_dict = blatt04.hand_out_cards_modified(deck, hand_dict, 3)
|
|
|
|
return score_dict, hand_dict
|
|
|
|
|
|
def play_game(players: list, scores: {str: int}, all_hands: {str: list}) -> {str: int}:
|
|
'''Spielt das Spiel'''
|
|
|
|
game_over = False
|
|
|
|
while not game_over:
|
|
# Ermittlung einer zufälligen Reihenfolge der Spieler
|
|
random.shuffle(players)
|
|
|
|
trumpf = "any"
|
|
played_cards = []
|
|
for player in players:
|
|
# Karte spielen
|
|
# player hand von dict all_hands holen
|
|
player_hand = all_hands.get(player)
|
|
|
|
print("-------------------")
|
|
print("Spieler", player, "ist an der Reihe")
|
|
played_card, player_cards = play_card(player_hand, trumpf)
|
|
all_hands[player] = player_cards
|
|
|
|
# Wenn der Spieler an der Reihe ist
|
|
if player == players[0]:
|
|
trumpf = played_card[1]
|
|
print("~~~~~~~~~~~~~~~~~~~")
|
|
print("Trumpf ist", trumpf)
|
|
print("~~~~~~~~~~~~~~~~~~~")
|
|
played_cards.append(played_card)
|
|
|
|
# Ermittlung des Gewinners
|
|
winner = get_winner(played_cards, trumpf)
|
|
|
|
# Punktevergabe
|
|
if winner != -1:
|
|
scores[players[winner]] += 1
|
|
|
|
# Gewinner bekommt die Karten
|
|
for card in played_cards:
|
|
all_hands[players[winner]].append(card)
|
|
|
|
print("Punktestand: ", scores)
|
|
|
|
# Überprüfung ob das Spiel zu Ende ist
|
|
for player in players:
|
|
if len(all_hands[player]) == 0:
|
|
game_over = True
|
|
|
|
print("Das Spiel ist zu Ende.")
|
|
# sortiere die spieler scores nach der höhe
|
|
sorted_scores = sorted(scores.items(), key=lambda x: x[1])
|
|
|
|
players_won = []
|
|
players_won.append(sorted_scores[0][0])
|
|
|
|
for i in range(len(sorted_scores)):
|
|
if i == len(sorted_scores) - 1:
|
|
break
|
|
if sorted_scores[i][1] == sorted_scores[i+1][1]:
|
|
players_won.append(sorted_scores[i+1][0])
|
|
|
|
print("Die Spieler", players_won, "haben gewonnen.")
|
|
|
|
|
|
|
|
|
|
|
|
def check_card(card: (int, str), player_hand: list, trump: str) -> bool:
|
|
'''Überprüft ob eine Karte gespielt werden darf'''
|
|
|
|
if card[1] == trump:
|
|
return True
|
|
|
|
for i in player_hand:
|
|
if i[1] == trump:
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
def play_card(player_hand: list, trump: str) -> ((int, str), list):
|
|
'''Spielt eine Karte aus der Hand'''
|
|
for i in player_hand:
|
|
print(i + 1, player_hand[i])
|
|
|
|
card_valid = False
|
|
|
|
while not card_valid:
|
|
played_card_index = input(
|
|
"Karte wählen. Bei illegalem Zug wird dies wiederholt.\
|
|
(Nummer von 1 - " +
|
|
str(len(player_hand)) + "): ")
|
|
|
|
try:
|
|
played_card_index = int(played_card_index)
|
|
player_hand[played_card_index - 1]
|
|
except ValueError:
|
|
print("Keine gültige Zahl")
|
|
continue
|
|
|
|
card_valid = check_card(player_hand[played_card_index - 1], player_hand, trump)
|
|
|
|
print("Karte gespielt: ", player_hand[i-1])
|
|
|
|
return player_hand.pop(i-1), player_hand
|
|
|
|
|
|
def get_winner(current_trick: list, trump: str) -> int:
|
|
'''Ermittelt den Gewinner eines Stiches'''
|
|
|
|
# Ermittelt die Trumpfkarten der liste current_trick.
|
|
trump_cards = list(filter(lambda x: x[1] == trump, current_trick))
|
|
|
|
if len(trump_cards) > 0:
|
|
# Ermittelt die höchste Trumpfkarte
|
|
highest_trump = max(trump_cards, key=lambda x: x[0])
|
|
return current_trick.index(highest_trump)
|
|
|
|
# Wenn es keine Trumpkarten gibt, gewinnt niemand
|
|
return -1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
players = load_players()
|
|
scores, hands = initialize_variables(players)
|
|
play_game(players, scores, hands)
|
|
|
|
# Testfälle
|
|
|
|
# a)
|
|
# load_players()
|
|
# Ausgabe: Anzahl der Spieler (3-4): 3
|
|
# Spieler 1 Name: Spieler 1
|
|
# Spieler 2 Name: Spieler 2
|
|
# Spieler 3 Name: Spieler 3
|
|
# Rückgabe: ['Spieler 1', 'Spieler 2', 'Spieler 3']
|
|
|
|
# load_players()
|
|
# Ausgabe: Anzahl der Spieler (3-4): 4
|
|
# Spieler 1 Name: Spieler 1
|
|
# Spieler 2 Name: Spieler 2
|
|
# Spieler 3 Name: Spieler 3
|
|
# Spieler 4 Name: Spieler 4
|
|
# Rückgabe: ['Spieler 1', 'Spieler 2', 'Spieler 3', 'Spieler 4']
|
|
|
|
# load_players()
|
|
# Ausgabe: Anzahl der Spieler (3-4): 2
|
|
# Anzahl der Spieler (3-4): 5
|
|
# Anzahl der Spieler (3-4): 3
|
|
# Spieler 1 Name: Spieler 1
|
|
# Spieler 2 Name: Spieler 2
|
|
# Spieler 3 Name: Spieler 3
|
|
# Rückgabe: ['Spieler 1', 'Spieler 2', 'Spieler 3']
|
|
|
|
# b)
|
|
# initialize_variables(['Spieler 1', 'Spieler 2', 'Spieler 3'])
|
|
# Rückgabe: ({'Spieler 1': 0, 'Spieler 2': 0, 'Spieler 3': 0},
|
|
# {'Spieler 1': [(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')], 'Spieler 2':
|
|
# [(1, 'Karo'), (2, 'Kreuz'), (2, 'Pik')], 'Spieler 3': [(2, 'Herz'),
|
|
# (2, 'Karo'), (3, 'Kreuz')]})
|
|
|
|
# initialize_variables(['Spieler 1', 'Spieler 2', 'Spieler 3', 'Spieler 4'])
|
|
# Rückgabe: ({'Spieler 1': 0, 'Spieler 2': 0, 'Spieler 3': 0,
|
|
# 'Spieler 4': 0}, {'Spieler 1': [(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')],
|
|
# 'Spieler 2': [(1, 'Karo'), (2, 'Kreuz'), (2, 'Pik')], 'Spieler 3':
|
|
# [(2, 'Herz'), (2, 'Karo'), (3, 'Kreuz')], 'Spieler 4': [(3, 'Pik'),
|
|
# (3, 'Herz'), (3, 'Karo')]})
|
|
|
|
# initialize_variables(['Spieler 1', 'Spieler 2'])
|
|
# Rückgabe: ({'Spieler 1': 0, 'Spieler 2': 0}, {'Spieler 1': [(1, 'Kreuz'),
|
|
# (1, 'Pik'), (1, 'Herz')], 'Spieler 2': [(1, 'Karo'), (2, 'Kreuz'),
|
|
# (2, 'Pik')]})
|
|
|
|
# c)
|
|
# play_game(['Spieler 1', 'Spieler 2', 'Spieler 3'], {'Spieler 1': 0,
|
|
# 'Spieler 2': 0, 'Spieler 3': 0}, {'Spieler 1': [(1, 'Kreuz'), (1, 'Pik'),
|
|
# (1, 'Herz')], 'Spieler 2': [(1, 'Karo'), (2, 'Kreuz'), (2, 'Pik')],
|
|
# 'Spieler 3': [(2, 'Herz'), (2, 'Karo'), (3, 'Kreuz')]})
|
|
# Spiel wird gespielt
|
|
|
|
# play_game(['Spieler 1', 'Spieler 2', 'Spieler 3', 'Spieler 4'],
|
|
# {'Spieler 1': 0, 'Spieler 2': 0, 'Spieler 3': 0, 'Spieler 4': 0},
|
|
# {'Spieler 1': [(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')], 'Spieler 2':
|
|
# [(1, 'Karo'), (2, 'Kreuz'), (2, 'Pik')], 'Spieler 3': [(2, 'Herz'),
|
|
# (2, 'Karo'), (3, 'Kreuz')], 'Spieler 4': [(3, 'Pik'), (3, 'Herz'),
|
|
# (3, 'Karo')]})
|
|
# Spiel wird gespielt
|
|
|
|
# play_game(['Spieler 1', 'Spieler 2'], {'Spieler 1': 0, 'Spieler 2': 0},
|
|
# {'Spieler 1': [(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')], 'Spieler 2':
|
|
# [(1, 'Karo'), (2, 'Kreuz'), (2, 'Pik')]})
|
|
# Spiel wird gespielt
|
|
|
|
# d)
|
|
# check_card((1, 'Kreuz'), [(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')], 'Karo')
|
|
# Rückgabe: True
|
|
|
|
# check_card((1, 'Kreuz'), [(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')], 'Pik')
|
|
# Rückgabe: False
|
|
|
|
# check_card((1, 'Kreuz'), [(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')], 'Herz')
|
|
# Rückgabe: True
|
|
|
|
# e)
|
|
# play_card([(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')], 'Karo')
|
|
# Ausgabe: 1 (Karte wählen. Bei illegalem Zug wird dies wiederholt. (Nummer von 1 - 3): 1
|
|
# Karte gespielt: (1, 'Kreuz')
|
|
# Rückgabe: ((1, 'Kreuz'), [(1, 'Pik'), (1, 'Herz')])
|
|
# (Kann auch anders aussehen)
|
|
|
|
# play_card([(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')], 'Pik')
|
|
# Ausgabe: 1 (Karte wählen. Bei illegalem Zug wird dies wiederholt. (Nummer von 1 - 3): 1
|
|
# Karte gespielt: (1, 'Kreuz')
|
|
# Rückgabe: ((1, 'Kreuz'), [(1, 'Pik'), (1, 'Herz')])
|
|
# (Kann auch anders aussehen)
|
|
|
|
# play_card([(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')], 'Herz')
|
|
# Ausgabe: 1 (Karte wählen. Bei illegalem Zug wird dies wiederholt. (Nummer von 1 - 3): 1
|
|
# Karte gespielt: (1, 'Kreuz')
|
|
# Rückgabe: ((1, 'Kreuz'), [(1, 'Pik'), (1, 'Herz')])
|
|
# (Kann auch anders aussehen)
|
|
|
|
# f)
|
|
# get_winner([(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')], 'Karo')
|
|
# Rückgabe: 0
|
|
|
|
# get_winner([(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')], 'Pik')
|
|
# Rückgabe: 0
|
|
|
|
# get_winner([(1, 'Kreuz'), (1, 'Pik'), (1, 'Herz')], 'Herz')
|
|
# Rückgabe: 0
|