Reset/restart game?

Reset/restart game?

Postby Raj13 » Thu Sep 05, 2013 12:57 pm

Hello,

I've done a little game whose code you can see below. My problem right now is that I do not have a good solution at start of the game / start a new round. I hereby ask for solutions or suggestions for solutions on how I can go about it. When the game restarted the point and rounds and cards on the table cleared.

Thanks in advance :geek: :oops:

Code: Select all
#!/usr/bin/python
# -*- codieren: utf-8 -*-

from Tkinter import *
from PIL import ImageTk, Image
from pygame import mixer


#Skapar fönster och dess inställningar
win = Tk() #Skapar fönster
win.title("Play High or Low Card") #Fönsterrubrik
win.geometry("700x550") #Fönsterstorlek
win.config(bg="#188200")
mixer.init(44100)

turns = int()
score = int(1)

try: #Kontrollerar så att programmet hittar ljudfilerna
    deal = mixer.Sound("Python/projekt/sound/deal.wav")
    shuffle = mixer.Sound("Python/projekt/sound/shuffle.wav")
    winner = mixer.Sound("Python/projekt/sound/win.wav")
    loser = mixer.Sound("Python/projekt/sound/miss.wav")
except: #Felmeddelande skrivs ut om dessa inte hittas
    print ("Kunde inte öppna ljudfilerna")


class Card(object): #Skapar klass innehållande information och metoder för korten

    RANKS = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"] #Lista på kortens värde

    SUIT = ["Python/projekt/bilder/hearts.png", "Python/projekt/bilder/spades.png", "Python/projekt/bilder/diamond.png", "Python/projekt/bilder/clubs.png"] #Lista på kortens valörer samt sökväg till bilder på dessa
   
    def __init__(self, rank, suit): #initierar/gör känt
        self.rank = rank
        self.suit = suit

    def __str__(self):
        rep = self.rank + self.suit
        return rep

    def draw(self): #Metod som ritar upp grafiken/korten

        bg = ImageTk.PhotoImage(Image.open(self.suit).resize((10, 10))) #Öppnar upp bild, bestämmer dess storlek. Tar emot sökväg från SUIT

        cardGraph = Canvas(cardHolder, width=70, height=100, bg="White", bd=1, relief='solid', highlightthickness=2) #Skapar och bestämmer utseende för canvas
        cardGraph.photo=bg #Sätter bilden som öppnas i bg, som bakgrund

        cardGraph.create_image(10,10, image=bg, anchor=CENTER) #left/up
        cardGraph.create_image(53,93, image=bg, anchor=CENTER) #right/down

        cardGraph.create_text(20, 10, text=self.rank, font=("Helvetica", 8, "bold")) #left/up
        cardGraph.create_text(63, 93, text=self.rank, font=("Helvetica", 8, "bold")) #right/down
        cardGraph.create_text(36, 50, text=self.rank, font=("Helvetica", 12, "bold")) #middle

        cardGraph.pack(side=LEFT, anchor=CENTER) #Bestämmer position för canvas
       
        return cardGraph

class Hand(object):
    def __init__(self):
        self.cards = []
       
        self.draw_card_stack = [] #Array för ritade kort

    def __str__ (self):
        if self.cards:
            rep = ""
            for card in self.cards:
                rep += str(card) + " "
        else:
            rep = "<empty>"
        return rep

    def add(self, card):
        self.cards.append(card)

class Deck(Hand):

    global CardValueHist
    CardValueHist = []

    def populate(self): #Bygger upp kortleken
        for suit in Card.SUIT:
            for rank in Card.RANKS:
                self.add(Card(rank, suit))

    def shuffle(self): #Blandar och målar upp kort, samt uppdaterar canvas
        import random
        random.shuffle(self.cards)
        DrawCard = self.cards[0]
        card_graph = DrawCard.draw()
        deal.play()
       
        self.draw_card_stack.append(card_graph)
        if len(self.draw_card_stack) > 3: #Kontrollerar längden på listan. Om listan är större än 3
            self.draw_card_stack[0].destroy() #Tar bort canvas
            del self.draw_card_stack[0] #Snyggar till listan


    def setValue(self): #Sätter värde på korten
        global CardValue
        CardValue = 0
        rank = self.cards[0].rank

        #Kollar upp vilken rank kortet har, sätter därefter värde
        if rank == 'K':
            CardValue += 13
            CardValueHist.append(CardValue)
        elif rank == 'Q':
            CardValue += 12
            CardValueHist.append(CardValue)
        elif rank == 'J':
            CardValue += 11
            CardValueHist.append(CardValue)
        elif rank == 'A':
            CardValue += 1
            CardValueHist.append(CardValue)
        else:
            CardValue += int(rank) #Sätter kortets egna rank som värde (2-10)
            CardValueHist.append(CardValue)

    def reset(self):
        global turns
        global score
        self.cards = []
        self.draw_card_stack=[] #Snyggar till listan
        score = 0 #Återställer värdet i score
        turnEnt.delete(0, END) #Tar bort allt ifrån Entry-widgeten
        turnEnt.insert(0, int(turns)) #Fyller den på nytt, men nu med ett nytt värde
        scoreTot.delete(0, END) #Tar bort allt ifrån Entry-widgeten
        scoreTot.insert(0, int(score)) #Fyller den på nytt, men nu med ett nytt värde
        lower.config(state='active')
        higher.config(state='active')
        reset.config(state='disable')

    def higher(self):
        global turns
        global score
        decket.shuffle()
        decket.setValue()

        turns += 1 #Ökar värde i variabeln med 1, för varje gång användaren klickar på Gissa
        turnEnt.delete(0, END) #Tar bort allt ifrån Entry-widgeten
        turnEnt.insert(0, int(turns)) #Fyller den på nytt, men nu med ett nytt värde

        rank = CardValue
        compare = CardValueHist[-2]

        if (compare <= rank):
            mode.set("Bra jobbat! Fortsätt!")
            infoText.config(bg="Green")
            lower.config(state='active')
            score *= turns #Ökar värde i variabeln med 1, för varje gång användaren klickar på Gissa
            scoreTot.delete(0, END) #Tar bort allt ifrån Entry-widgeten
            scoreTot.insert(0, int(score)) #Fyller den på nytt, men nu med ett nytt värde


        else:
            mode.set("Tyvärr, du gissade fel")
            infoText.config(bg="Red")
            higher.config(state='disable')
            lower.config(state='disable')
            restart.config(state='active')
            loser.play()
           
    def lower(self):
        global turns
        global score
        decket.shuffle()
        decket.setValue()
       
        turns += 1 #Ökar värde i variabeln med 1, för varje gång användaren klickar på Gissa
        turnEnt.delete(0, END) #Tar bort allt ifrån Entry-widgeten
        turnEnt.insert(0, int(turns)) #Fyller den på nytt, men nu med ett nytt värde

        rank = CardValue
        compare = CardValueHist[-2]

        if (compare >= rank):
            mode.set("Bra jobbat! Fortsätt!")
            infoText.config(bg="Green")
            score *= turns #Ökar värde i variabeln med 1, för varje gång användaren klickar på Gissa
            scoreTot.delete(0, END) #Tar bort allt ifrån Entry-widgeten
            scoreTot.insert(0, int(score)) #Fyller den på nytt, men nu med ett nytt värde
        else:
            mode.set("Tyvärr, du gissade fel")
            infoText.config(bg="Red")
            higher.config(state='disable')
            lower.config(state='disable')
            restart.config(state='active')
            turns += 1
            loser.play()
           
#Top-bakgrund
BannerBg = ImageTk.PhotoImage(Image.open("Python/projekt/bilder/card_bg.jpg"))
Banner = Label(win, text="This is a game", image=BannerBg)
Banner.pack(fill=BOTH)

#Textfält för spelstatus och välkomsttext
mode = StringVar()
mode.set("Welcome to High or Low Game")
infoText = Label(win, textvariable=mode, font=("Helvetica", 12, "bold"), bg="Yellow", bd=0.5, relief='solid')
infoText.pack(fill=BOTH)

#objekt
decket = Deck()
decket.populate()
decket.setValue()
decket.higher
decket.lower
decket.reset

#Poäng och rundor
scoreBg = ImageTk.PhotoImage(Image.open("Python/projekt/bilder/score.jpg"))
label = Label(win, bg="#188200", image=scoreBg, height=800)
label.pack(side=RIGHT,fill=BOTH)


#Korthållare
cardHolder = LabelFrame(win)
cardHolder.pack(anchor=N)

#Poäng och rundor
turnText = Label(label, text="Antal gissningar:", bg="#188200", font=("verdana", 10, "bold"))
turnText.pack(fill=BOTH, anchor=E)
turnEnt = Entry(label, bg="#188200", bd=0, font=("verdana", 15, "bold"), width=10, justify=CENTER)
turnEnt.pack(anchor=E)
scoreText = Label(label, text="Poäng:", bg="#188200", font=("verdana", 10, "bold"))
scoreText.pack(fill=BOTH, anchor=E)
scoreTot = Entry(label, bg="#188200", bd=0, font=("verdana", 15, "bold"), width=10, justify=CENTER)
scoreTot.pack(anchor=E)

#Knappar
higher = Button(win, text="+Högre", width=50, highlightthickness=5, anchor=CENTER, command=lambda: decket.higher())
higher.config(state='active')
higher.pack(side=BOTTOM, anchor=CENTER)

lower = Button(win, text="-Lägre", width=50, highlightthickness=5, anchor=CENTER, command=lambda: decket.lower())
lower.config(state='disable')
lower.pack(side=BOTTOM, anchor=CENTER)

restart = Button(win, text="=Börja om", width=50, highlightthickness=5, anchor=CENTER, command=lambda: decket.reset())
restart.config(state='disable')
restart.pack(side=BOTTOM, anchor=CENTER)

win.mainloop()
Raj13
 
Posts: 4
Joined: Tue Sep 03, 2013 9:57 am

Re: Reset/restart game?

Postby Mekire » Thu Sep 05, 2013 1:19 pm

Without your resources we can't test your program. From a skim through I can tell you that there is way too much flying around in the global scope. You need some function that resets all your classes to the state they need to be in to start over. Beyond that I can't really tell you much at this point. Get rid of the star import; get rid of everything in the global scope that isn't truly constant. Create a new class that manages game state and has a method for resetting all the classes on a new-game condition.

If you can put your whole program up on github we would be much more capable of helping you.

-Mek
User avatar
Mekire
 
Posts: 828
Joined: Thu Feb 07, 2013 11:33 pm
Location: Amakusa, Japan


Return to Game Development

Who is online

Users browsing this forum: No registered users and 1 guest