2017-01-03 5 views
0

Ich lerne Flask, indem ich ein Blackjack-Spiel erstelle.Flask - Objektinstanz pflegen

Ich habe ein game.py Modul geschrieben, das die Spiellogik enthält. Darin Ich definiere Schuh des Händlers als solche: (dies ist ein Auszug)

class Blackjack(object): 
    def __init__(self): 
     pass 

    NO_OF_DECKS = 1 

    SUITS = ['clubs', 'spades', 'diamonds', 'hearts'] 

    RANKS = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] 

    VALUES = {'A': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, 
       '9': 9, '10': 10, 'J': 10, 'Q': 10, 'K': 10} 

class Shoe(Blackjack): 
    """ Creates a new shoe object from which cards are dealt 
    to the player and the dealer. 

    Input arguments: 
    decks :: the number of decks the player wishes to play with. 
    """ 
    def __init__(self, decks=1): 
     self.cards_in_shoe = {} 
     self.total_cards = decks * 52 
     for i in Blackjack.SUITS: 
      self.cards_in_shoe[i] = Blackjack.RANKS * decks 

    def get_random_card(self): 

     random_suit = random.choice(self.cards_in_shoe.keys()) 
     cards_in_suit = self.cards_in_shoe[random_suit] 
     random_card = random.choice(cards_in_suit) 

     cards_in_suit.remove(random_card) 

     # deleting suit if cards exhausted. 
     if len(self.cards_in_shoe[random_suit]) == 0: 
      del self.cards_in_shoe[random_suit] 

     return (random_suit, random_card) 

    def remaining_cards_in_shoe(self): 
     """ Returns the total number of cards remaining to be 
     drawn for both player and dealer. 
     """ 
     return sum(len(v) for v in self.cards_in_shoe.itervalues()) 

Nun, meiner ‚trygame.html‘ Vorlage, würde Ich mag, um neue Karten zu befassen, mit der remaining_cards_in_shoe Eigenschaft abnehmend mit jeder neuen ausgeteilten Karte. Leider funktioniert das momentan nicht. Mit einem einzigen Deck bleibt der Zähler bei 51 (nachdem die erste Karte ausgeteilt wurde).

Hier ist meine aktuelle @app.route('/trygame') Ansicht:

@app.route('/trygame', methods=['GET', 'POST']) 
def trygame(): 

    shoe = game.Shoe() 
    card = shoe.get_random_card() 
    remaining_cards = shoe.remaining_cards_in_shoe() 

    return render_template('trygame.html', 
          card=card, 
          remaining_cards=remaining_cards) 

Nun, ich vermute, das Problem kommt mit immer neu initialisiert den Schuh-Objekt. Die Schaltfläche auf der Vorlage ist einfach definiert als:

<p>Here we will insert a card: {{ card }}</p> 
<p>Remaining cards in shoe: {{ remaining_cards }}</p> 

<form action="/trygame" method="post"> 
    <button type="submit" class="btn btn-primary">Deal card</button> 
</form> 

Ich bin nicht sicher, wie an dieser Stelle gehen, da ich nicht 100% sicher bin, wo das Problem liegt. Ich habe versucht, eine Sitzung zu erstellen, aber ich weiß nicht, wie ich eine Klasseninstanz mit den verfügbaren Methoden speichern soll. Außerdem bin ich nicht sicher, ob es eine kluge Idee ist, dies überhaupt zu tun. Ich möchte vermeiden, dass der Benutzer den Inhalt des Kartenwörterbuchs sehen kann.

Ich hatte gehofft, ich etwas tun könnte:

@app.route('/trygame', methods=['GET', 'POST']) 
def trygame(): 
# I believe this is the way to go, but it won't work 
    print session 

    if request.method == 'POST': 
     card = session['shoe'].get_random_card() 
     remaining_cards= session['shoe'].remaining_cards_in_shoe() 
     return render_template('trygame.html', 
           card=card, 
           remaining_cards=remaining_cards) 

    session['shoe'] = game.Shoe() 
    card = session['shoe'].get_random_card() 
    remaining_cards = session['shoe'].remaining_cards_in_shoe() 

    return render_template('trygame.html', 
          card=card, 
          remaining_cards=remaining_cards) 

Aber es funktioniert nicht. Was genau ist das Problem? Was sind meine Optionen? current_app, session, redis? Was ist die beste Vorgehensweise in diesem Szenario, und könnten Sie ein funktionierendes Beispiel bereitstellen?

Antwort

1

Versuchen Sie, diese Dinge zu lesen, SQLAlchemy in Flask und Sessions in Flask. Sie können beide verwenden. Die Datenbank oder SQLAlchemy speichert die Karte unbegrenzt, bis Sie sie löschen. Die Sitzung speichert die Karten auf der Clientseite, bis sie gelöscht werden, entweder der Browser wird geschlossen oder der Client löscht manuell eine Sitzung.

Für das Problem, das Sie versuchen zu lösen, eine Karte, die Spiel behandelt, schlage ich vor, Sitzungen zu verwenden. Hier ist ein Beispielcode.

from flask import session 
import random 

session['user cards'] = [] 
# Default cards = empty list. Do the above to reset. 

def deal_card(): 
    card_drawn = random.choice(CARDS) 
    session['user cards'].append(card_drawn) 
    # The "CARDS" variable is not here but it's just a list of cards. 
    CARDS.pop(CARDS.index(card_drawn)) 

def print_cards(): 
    for card in session['user cards']: 
    print(card) 
+0

Ich glaube nicht, dass dies mein Problem löst. So wie ich es sehe, muss ich das Objekt speichern, einschließlich der Möglichkeit, Methodenaufrufe auszuführen. Mein aktuelles Problem ist, dass 'cards_remaining_in_shoe()' zurückgesetzt wird. – mmenschig

+0

Oder vielleicht tut es und ich verstehe es noch nicht vollständig. Danke für die Ressourcen, ich recherchiere. Vielleicht involvieren serverseitige Sitzungen mit redis. Lesen Sie auch auf HTTP – mmenschig

+0

Hört sich gut an, wenn Sie eine Rücksetzung innerhalb einer Klasse mit Python erhalten, können Sie sich über [Python Garbage Collecting.] (Https://docs.python.org/3/library/gc .html) Python-Müll sammelt sich automatisch, wenn er denkt, dass zu viel Speicher verwendet wird, dies kann das Problem sein oder auch nicht. –