This commit is contained in:
J-onasJones 2023-12-02 02:42:05 +01:00
parent af017f80ca
commit beaf0855b8
4 changed files with 331 additions and 3 deletions

View file

@ -1,9 +1,175 @@
'''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
@ -14,4 +180,111 @@ import blatt04
if __name__ == '__main__':
pass
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