brauche Hilfe bei Spielprogrammierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Hier mein Vorschlag, 31 Karten (repräsentiert durch Buchstaben-Strings) auf sechs Spieler (repräsentiert durch Zahlen-Strings) zu verteilen. Man kann's auch mit einer dict-comprehension machen, habe ich mir aber verkniffen, damit es bei Grundfunktionen bleibt.

Code: Alles auswählen

# ich mag's ja lieber funktional...
def shuffled(l): import random; l = list(l); random.shuffle(l); return l

cards = shuffled(list("ABCDEFGHIJKLMNO") * 2 + ["?"])
players = list("123456")
i, n = 0, len(cards) // len(players)
hands = {}
for player in players:
    hands[player] = cards[i:i + n]
    i += n
print(hands)
Stefan
BlackJack

@sma: Da werden aber nicht alle Karten verteilt. Insbesondere kann der Schwarze Peter übrig bleiben und dann müsste man sich bei der Implementierung des Spiels auch mit dem Fall herumschlagen, dass keiner verlieren könnte. Das Spiel heisst ja aber so weil am Ende auf jeden Fall einer mit der "Arschkarte" sitzen bleibt. :-)

Meine Kartenerstellung sieht übrigens fast genau so aus:

Code: Alles auswählen

JOKER = '*'


def create_card_deck(number_of_pairs=15):
    return [JOKER] + list(string.ascii_uppercase[:number_of_pairs] * 2)
Für's Verteilen habe ich dann auf `izip()` und `cycle()` aus den `itertools` zurückgegriffen. :-)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Das Karten über bleiben ist mir klar, aber ich kann nun mal nicht 31 Karten gleichmäßig auf mehr als einen Spieler verteilen, weil das eine Primzahl ist. Ich hatte eine Gleichverteilung unter den Spielern angenommen. Vollständiges Verteilen, ohne irgendwelche iter-Funktionen, die laut Aufgabenstellung ja nicht benutzt werden sollen, aber ohne Extra-Schleife, bittesehr:

Code: Alles auswählen

for i, player in enumerate(players):
    hands[player] = cards[i::len(players)]
Stefan
BlackJack

@sma: Letztendlich gibt's ja keine Gleichverteilung, selbst wenn es aufgehen würde, weil bevor das Spiel beginnt, alle ihre Paare, die sie auf der Hand haben, abwerfen. Spätestens dann haben alle sehr wahrscheinlich nicht mehr die gleiche Anzahl von Karten auf der Hand. Letztendlich ist das sowieso ein Glücksspiel, solange die Leute nicht allzu offensichtlich reagieren wenn man eine verdeckte Karte von ihnen zieht, oder wenn man sich überlegt wie die Chancen stehen, ob und wie derjenige von dem man zieht, sein Blatt wohl sortiert haben mag.

Mit jeder zusätzlich zugeteilten Karte besteht ja auch eine Chance das man damit ein Paar bilden kann und so eine Karte los wird, statt eine zu bekommen. Wer Spass an Mathematik hat, kann ja mal ausrechnen ob das Risiko einer zusätzlichen Karte unter bestimmten Bedingungen die Chance ein Paar zu vervollständigen, aufwiegt.
Antworten