2017-07-20 7 views
1

Die CPU und der Benutzer bekommen wiederholt Karten. Ich habe die shuffle Funktion sowie pop verwendet. Gibt es eine Möglichkeit zu verhindern, dass der Benutzer und die CPU wiederholt Karten bekommen?Wie wiederhole ich Zufallswerte?

Hier ein Beispiel für die Ausführung ist:

hier Ihre Karten sind:
1) Die 10 Clubs
2) Die 4 of Diamonds
3) Die 6 von Diamanten
4) Die 7 von Clubs
5) Die 10 von Clubs

Um Karten zu spielen, geben Sie einfach ihre Nummer eins nach dem anderen. Wenn Sie fertig sind, Eingang leer

Sie gespielt: Das 4 of Diamonds Die 10 Clubs Die 6 of Diamonds Die 7 von Clubs

CPU gespielt: The Jack of Spades Die Pik Jack

Wie Sie sehen können, wurde der Benutzer die 10 Clubs zweimal gegeben.

Mein Code:

import random 
import math 
from collections import Counter 
print("Gui-less poker sucks, but it sure is addicting probably") 
if 1: 
    deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52] 
    random.shuffle(deck) 
    hcardss = [""] 
    hcardsc = [""] 
    hcardsh = [""] 
    ccardss = [""] 
    ccardsc = [""] 
    ccardsh = [""] 
    ingame = "true" 
    while (ingame == "true"): 
     undone = 5 
     while (undone > 0): 
      card = deck.pop() 
      # print(card) 
      temp = card/13 
      temp2 = card/4 
      temp = math.floor(temp) 
      temp2 = math.floor(temp2) 
      temp = temp + 1 
      # temp2 = temp2 + 1 
      #print(temp) 
      #print(temp2) 
      # undone -= 1 
      hcardss.append(temp) 
      hcardsc.append(temp2) 
      if (temp == 1): 
       temp3 = " of Spades" 
      elif (temp == 2): 
       temp3 = " of Diamonds" 
      elif (temp == 3): 
       temp3 = " of Clubs" 
      else: 
       temp3 = " of Hearts" 
      if (temp2 == 10): 
       temp4 = "Jack" 
      elif (temp2 == 11): 
       temp4 = "Queen" 
      elif (temp2 == 12): 
       temp4 = "King" 
      elif (temp2 == 13): 
       temp4 = "Ace" 
      else: 
       temp4 = str(temp2 + 1) 
      # print("Your card was the " + temp4 + temp3) 
      hcardsh.append("The " + temp4 + temp3) 
      undone -= 1 
     undone = 5 
     random.shuffle(deck) 
     while (undone > 0): 
      # THIS ONE IS THE COMPUTER 
      card = deck.pop() 
      # print(card) 
      temp = card/13 
      temp2 = card/4 
      temp = math.floor(temp) 
      temp2 = math.floor(temp2) 
      temp = temp + 1 
      # temp2 = temp2 + 1 
      #print(temp) 
      #print(temp2) 
      # undone -= 1 
      ccardss.append(temp) 
      ccardsc.append(temp2) 
      if (temp == 1): 
       temp3 = " of Spades" 
      elif (temp == 2): 
       temp3 = " of Diamonds" 
      elif (temp == 3): 
       temp3 = " of Clubs" 
      else: 
       temp3 = " of Hearts" 
      if (temp2 == 10): 
       temp4 = "Jack" 
      elif (temp2 == 11): 
       temp4 = "Queen" 
      elif (temp2 == 12): 
       temp4 = "King" 
      elif (temp2 == 13): 
       temp4 = "Ace" 
       temp4 = str(temp2 + 1) 
      # print("Your card was the " + temp4 + temp3) 
      ccardsh.append("The " + temp4 + temp3) 
      undone -= 1 
     print() 
     print() 
     print() 
     print("Here are your cards:") 
     print("1) " + hcardsh[1]) 
     print("2) " + hcardsh[2]) 
     print("3) " + hcardsh[3]) 
     print("4) " + hcardsh[4]) 
     print("5) " + hcardsh[5]) 
     print("To play cards, simply type their number one at a time. When done, input blank") 
     instant = "true" 
     doneinput = "false" 
     hplay = [""] 
     while (doneinput == "false"): 
      latestinput = input("> ") 
      if (latestinput == ""): 
       if (instant == "true"): 
        print("Okay, you fold") 
        ingame = "false" 
        exit() 
       doneinput = "true" 
      else: 
       if (int(latestinput) in hplay): 
        print("You already picked that one!") 
       else: 
        hplay.append(int(latestinput)) 
     # print("The cards you played are " + str(hplay)) 
     doneinput = "false" 
     cplay = [""] 
     while (doneinput == "false"): 
      latestinput = random.randint(1,5) 
      if (latestinput == ""): 
       doneinput = "true" 
      else: 
       if (int(latestinput) in cplay): 
        doneinput = "true" 
       else: 
        cplay.append(int(latestinput)) 
     #print("So you played " + str(hplay)) 
     #print("And the cpu played " + str(cplay)) 
     #print("So you played the " + hcardsh[hplay[1]] + hcardsh[hplay[2]] 
     times = len(hplay) 
     # times = times - 1 
     hplayh = [""] 
     cplayh = [""] 
     sub = 1 
     print() 
     print() 
     print("You played:") 
     while (sub < times): 
      hplayh.append(hcardsh[hplay[sub]]) 
      print(hcardsh[hplay[sub]]) 
      sub += 1 
     sub = 1 
     times = len(cplay) 
     print() 
     print() 
     print("CPU played:") 
     while (sub < times): 
      cplayh.append(ccardsh[cplay[sub]]) 
      print(ccardsh[cplay[sub]]) 
      sub += 1 
     #print(str(hplay) 
     #print(str(cplayh)) 
     hscore = 0 
     cscore = 0 
     #checker = 1 
     #highnumber = 0 
     #quantity = [""] 
     #quancheck = 0 
     htrans = [""] 
     temp5 = 1 
     while (len(hplay) > temp5): 
      htrans.append(int(hcardsc[hplay])) 
      temp5 += 1 
     ctrans = [""] 
     temp5 = 1 
     while (len(cplay) > temp5): 
      ctrans.append(int(ccardsc[cplay])) 
      temp5 += 1 

     hoccur = Counter(htrans).most_common() 
     coccur = Counter(ctrans).most_common() 
     print(hoccur) 
     #while (len(hplay) > checker): 
     # if (hcardsc[hplay[checker]] > highnumber): 
      #  quancheck += 1 
      # quantity.append(quancheck) 
      #checker += 1 


     ingame = "false" 
+3

Du einen 'Set' erstellen (oder' list' wenn Sie wirklich wollen) von Karten, ein zufälliges Element auswählen und entfernen. Dann können Sie nicht die gleiche Karte als nächstes bekommen. – byxor

+0

Ich denke, du solltest die Deklaration von "deck" in die äußere While-Schleife verschieben. –

+0

Ich bin mir auch ziemlich sicher, dass dies passieren könnte, wenn es zwei Zahlen wie "14" und "15" bekommt, da die Division dieser Zahlen durch "4" und "13" die gleichen Werte ergibt. –

Antwort

1

Die Art und Weise Sie eine Kartennummer zwischen 1 und 52, die durch die Liste schlurfenden generieren und Werte aus popping es korrekt ist.

Das Problem liegt in der Art und Weise, wie Sie die Farbe und den Wert der Karte anhand ihrer Nummer generieren.

Zum Beispiel

  • Boden (26/4) = 7, floor (27/4) = 7
  • Boden (26/13) = 2, floor (27/13) = 2

so werden 26 und 27 als die gleiche Karte interpretiert.

Halten Sie Ihre ursprüngliche Idee, könnte man eher verwenden Sie den Quotienten und den Rest der Division von 13:

q = card_num // 13 # integer division 
r = card_num % 13 # modulo operator 

oder beide auf einmal, mit divmod:

q, r = divmod(26, 13) 
print(q,r) 
# (2, 0) 
q, r = divmod(27, 13) 
print(q,r) 
# (2, 1) 

Sie 0 haben < = q < = 3 und 0 < = r < = 13

Als eine Randnotiz:
Sie könnten ein paar Dinge im Code verbessern. Eine einfache Änderung:

deck = list(range(1, 53)) 

wird kürzer sein!;)

+0

Vielen Dank! Das hat geholfen! – Killermarsh

0

dies scheint wie eine große Chance, zu lernen, mit Klassen zu arbeiten ... Ich denke, Kartenspiele ausgezeichnete Testgelände für die Klassen

zuerst eine Karte Klasse definieren

class Card(object): 
    def __init__(self,value,suite): 
     self.value = value 
     self.suite = suite 
    def __str__(self): 
     # override behaviour of printing a card object 
     card_names = ["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"] 
     return card_names[self.value] 

    def __repr__(self): 
     #override the repr of a card to print the card name and suite 
     suites = "Clubs Spades Diamonds Hearts" 
     return "%s of %s"%(self,suites[self.suite]) 

    def __cmp__(self,other_card): 
     return cmp(self.value,other_card.value) 

dann immer machen Deck-Klasse, die alle unsere Karten enthält

class Deck(object): 
    def __init__(self): 
     self.cards = [] 
     for suite in range(4): 
      for value in range(13): 
       self.cards.append(Card(value,suite)) 
    def shuffle(self): 
     self.cards.shuffle() 
    def deal(self): 
     if self.cards: 
      return self.cards.pop() 
     raise StopIteration("Out Of Cards...") 
    def __len__(self): 
     return len(self.cards) 

jetzt können Sie ein Spiel Methode erstellen

def play_game(): 
    deck = Deck() 
    player_1 = [deck.deal() for _ in range(5) ] # deal 5 cards to player1 
    player_2 = [deck.deal() for _ in range(5) ] # deal 5 cards to player2(cpu) 
    game_over = False 
    while not game_over: 
    for i,card in enumerate(player_1): 
     #play a turn 
     print("%d. %r"%(i,card)) 
     player_1.append(deck.deal() 
     player_2.append(deck.deal() 
    print("Winner is Player 1") 

dann einfach Ihre Hauptprogrammschleife ist

while still_playing: 
    play_game() 
    still_playing = check_with_player() 
+0

Kleiner Nitpick: Sie haben 'Suite' statt 'Anzug' geschrieben und ein paar andere Tippfehler im Text haben. – byxor