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?
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
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
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. –