Quartett/quartett.py

226 lines
7.5 KiB
Python
Raw Normal View History

"""main module"""
__author__ = ""
__credits__ = ""
__email__ = ""
import random
import clean_input
2021-01-12 18:16:10 +01:00
import itertools
import copy
# Game
def central_function():
'''
does everything, keeps order
'''
active = 0 # contains index of the active player
2021-01-12 18:16:10 +01:00
switch = True
2021-01-11 16:49:05 +01:00
card_stack, players_with_cards, players = initialize()
print("players",players) # debug
print("card stack", card_stack) # debug
for i in range(len(players)): # debug
pretty_print_deck(players_with_cards, i) # debug
print("active", active) # debug
drop_cards(players_with_cards)
while switch:
round(card_stack, players_with_cards, players, active)
2021-01-12 18:16:10 +01:00
for i in range(len(players)): # check if any card deck is empty
switch = bool(players_with_cards[i]['cards_on_hand'])
#for i in itertools.cycle(range(len(players))): # rotate active player
# active = i
2021-01-12 18:16:10 +01:00
# the_winner_is()
2021-01-12 10:41:48 +01:00
def round(card_stack, players_with_cards, players, active):
'''
structures one round in the game
active player chooses another player from whom to steal a card
:return: None
'''
2021-01-12 10:41:48 +01:00
switch = True
2021-01-12 10:41:48 +01:00
while switch:
players_without_active = copy.copy(players)
players_without_active.pop(active)
print('Folgende Spieler stehen zur Verfügung:')
print(players_without_active)
# chosen_player enthält den index in der players liste
chosen_player = players.index(clean_input.io_str(
'Welchen Spieler möchtest du befragen? ', players_without_active))
print("chosen player", chosen_player)
player_request = clean_input.io_card_selection('Welche Karte möchtest du haben? ')
if player_request in players_with_cards[chosen_player]['cards_on_hand']:
2021-01-12 10:41:48 +01:00
steal(active, chosen_player, players_with_cards, player_request)
drop_cards(players_with_cards, active)
else:
print("Diese Karte hat der Spieler nicht, Ende der Runde")
# end of round
# except if stack is not empty, which is not only the case with two players
if card_stack == True:
# last card from the stack gets added to active player's hand
players_with_cards[active]['cards_on_hand'].append(card_stack.pop())
2021-01-12 10:41:48 +01:00
switch = False
def pretty_print_deck(players_with_cards, player):
"""
prints the cards in a players deck in a readable format
"""
pretty_deck = []
for card in players_with_cards[player]['cards_on_hand']:
pretty_deck.append(card['number'] + card['letter'])
print("Dein Deck: ", pretty_deck)
2021-01-12 10:41:48 +01:00
def steal(active, chosen_player, players_with_cards, player_request):
"""
defines how the active players steals cards from chosen player
:return: None
"""
print("player", chosen_player, "hat die Karte, die du haben möchtest und sie wandert in dein Deck.")
card_index = players_with_cards[chosen_player]['cards_on_hand'].index(player_request)
2021-01-12 10:41:48 +01:00
players_with_cards[active]['cards_on_hand'].append(
players_with_cards[chosen_player]['cards_on_hand'].pop(card_index))
pretty_print_deck(players_with_cards, active)
2021-01-12 10:41:48 +01:00
2021-01-12 18:16:10 +01:00
def drop_cards(players_with_cards, active=None):
"""
function that lets players drop cards
if they have a quartet in their deck
:return: None
"""
2021-01-12 18:16:10 +01:00
# default, check all players
if active is None:
2021-01-12 18:16:10 +01:00
for p in players_with_cards:
drop_cards_help(p)
else:
2021-01-12 18:16:10 +01:00
p = players_with_cards[active]
drop_cards_help(p)
def drop_cards_help(p):
"""
eh
"""
2021-01-12 18:16:10 +01:00
reference = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
counter = [0, 0, 0, 0, 0, 0, 0, 0]
2021-01-12 18:16:10 +01:00
for card in p["cards_on_hand"]:
counter[reference.index(card["letter"])] += 1
for i in counter:
if i == 4:
quartet_letter = reference[counter.index(i)]
counter[counter.index(i)] = 0
p["quartet"] += 1
print(f"{p['player']} legt das {quartet_letter}-Quartett ab...")
p["cards_on_hand"] = [c for c in p["cards_on_hand"] if quartet_letter != c["letter"]]
# print(p)
return p
def initialize():
"""
initializes stuff
:return: list, list (of dicts), list
"""
2021-01-11 16:49:05 +01:00
card_stack = []
players = []
players_with_cards = []
# define card stack
x = 0
for i in range(4):
for l in "abcdefgh":
d = {"id": str(x), "number": str(i), "letter": l}
2021-01-11 16:49:05 +01:00
card_stack.append(d)
x += 1
# determine number of players
2021-01-12 10:41:48 +01:00
number_of_players = clean_input.io_int("Gegen wie viele Spieler wollen Sie spielen?")
number_of_players += 1 # Add also human player.
for i in range(number_of_players):
players.append(f"player{i}")
# determine number of cards per player
if len(players) == 2:
cards_per_player = 10
else:
2021-01-11 16:49:05 +01:00
cards_per_player = int(len(card_stack) // len(players))
# distribute hand cards to players
2021-01-12 18:16:10 +01:00
for i in range(number_of_players):
cards_of_player = []
for j in range(cards_per_player):
x = random.randint(0, len(card_stack) - 1)
2021-01-11 16:49:05 +01:00
selected_card = card_stack[x]
2021-01-12 18:16:10 +01:00
del card_stack[x]
cards_of_player.append(selected_card)
# create a list that contains every player, their deck and successes
2021-01-12 18:16:10 +01:00
players_with_cards.append(
{"player": players[i], "cards_on_hand": cards_of_player, "quartet": 0})
2021-01-11 16:49:05 +01:00
return card_stack, players_with_cards, players
2021-01-06 17:12:36 +01:00
2021-01-12 18:16:10 +01:00
def the_winner_is():
"""
counts the number of quartets
a player has made, and chooses the
winner, who made the most
"""
2021-01-12 18:16:10 +01:00
pass
# TODO
2021-01-12 10:41:48 +01:00
# Call central_function() only if quartett.py is the main module
if __name__ == "__main__":
central_function()
"""p = {'player': 'player1', 'cards_on_hand': [{'id': '27', 'number': '3', 'letter': 'd'},
2021-01-12 18:16:10 +01:00
{'id': '3', 'number': '0', 'letter': 'd'},
{'id': '25', 'number': '3', 'letter': 'd'},
{'id': '19', 'number': '2', 'letter': 'd'},
{'id': '0', 'number': '0', 'letter': 'a'},
{'id': '28', 'number': '3', 'letter': 'a'},
{'id': '26', 'number': '3', 'letter': 'a'},
{'id': '5', 'number': '0', 'letter': 'a'},
{'id': '9', 'number': '1', 'letter': 'b'},
{'id': '7', 'number': '0', 'letter': 'h'}],
'quartet': 0}
drop_cards_help(p)"""
2021-01-12 10:41:48 +01:00
2021-01-06 17:12:36 +01:00
'''
players_with_cards = [
{'player': 'player0', 'cards_on_hand': [{'id': 13, 'number': 1, 'letter': 'f'},
{'id': 26, 'number': 3, 'letter': 'c'},
{'id': 22, 'number': 2, 'letter': 'g'},
{'id': 10, 'number': 1, 'letter': 'c'},
{'id': 19, 'number': 2, 'letter': 'd'},
{'id': 31, 'number': 3, 'letter': 'h'},
{'id': 6, 'number': 0, 'letter': 'g'},
{'id': 9, 'number': 1, 'letter': 'b'},
{'id': 5, 'number': 0, 'letter': 'f'},
{'id': 15, 'number': 1, 'letter': 'h'}],
'quartet': 0
2021-01-06 17:12:36 +01:00
},
...]'''