Memory - Der Ansatz ok ?

Du hast eine Idee für ein Projekt?
Antworten
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo !

Habe mal versucht ein Memory zu machen. Die Karten werden noch nicht gemischt - ist aber nicht das Probleme. Wollte nur wissen, ob der Ansatz soweit ok ist und wie ich das Fenster kurz (evt. time.sleep()) halten kann, damit der Nutzer die falsch aufgedeckte Karten sieht.

Code: Alles auswählen

#! /usr/bin/env python
# -*- coding: utf-8

import Tkinter as tk

class Memory(object):
    spiel_feld = [[[0, 'A', tk.NORMAL], [0, 'B', tk.NORMAL ],
                   [0, 'C', tk.NORMAL], [0, 'D', tk.NORMAL]],
                  [[0, 'E', tk.NORMAL], [0, 'F', tk.NORMAL],
                   [0, 'G', tk.NORMAL], [0, 'H', tk.NORMAL]],
                  [[0, 'A', tk.NORMAL], [0, 'B', tk.NORMAL],
                   [0, 'C', tk.NORMAL], [0, 'D', tk.NORMAL]],
                  [[0, 'E', tk.NORMAL], [0, 'F', tk.NORMAL],
                   [0, 'G', tk.NORMAL], [0, 'H', tk.NORMAL]]]

    def __init__(self):
        self.vergleich = list()
        self.gui()

    def gui(self):
        self.memory_gui=tk.Tk()
        self.spiel_feld_rahmen=tk.Frame(self.memory_gui)
        label=tk.Label(self.spiel_feld_rahmen, text='MEMORY', font=('Arial', 34))
        label.grid(row=0)
        self.spiel_feld_rahmen.grid(row=0)
        button_frame=tk.Frame(self.memory_gui)
        button=tk.Button(button_frame, text='START', command=self.anzeigen)
        button.grid(row=0)
        button_frame.grid(row=1)
        self.memory_gui.title('Memory')
        self.memory_gui.tk.mainloop()


    def anzeigen(self):
        self.spiel_feld_rahmen = tk.Frame(self.memory_gui)
        for row, karten in enumerate(self.spiel_feld):
            for column, karte in enumerate(karten):
                if karte[0] == 0:
                    text = '?'
                else:
                    text = karte[1]
                button=tk.Button(self.spiel_feld_rahmen, text=text, width = 2,
                    state = karte[2], command=lambda karte=karte:
                        self.auswerten(karte))
                button.grid(row=row, column=column)
        self.spiel_feld_rahmen.grid(row=0)


    def auswerten(self, karte):
        karte[0] = 1
        self.vergleich.append(karte)
        if len (self.vergleich) == 2:
            if self.vergleich[0][1] == self.vergleich[1][1]:
                for karte in self.vergleich:
                   karte[2] = tk.DISABLED
                self.vergleich = list()  
            else:
                for karte in self.vergleich:
                    karte[0] = 0
                self.vergleich = list()
        self.anzeigen()
        
Memory()
gruß frank

edit: Wenn man einen Button zweimal drückt, dann ist der auch gesperrt :oops: !
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Das Problem habe ich mal so gelöst:

Code: Alles auswählen

if karte[0] == 0:
            karte[0] = 1
            self.vergleich.append(karte)
gruß frank
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Tkinter + time.sleep möglichst nicht nutzen, denn dann kann man garnix mehr machen (fensterverschieben, etc.)
Besser ist after:

methode buttongeklickt -> zeigen, after(500, verdecken)

methode verdeken-> ...
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke schlangenbeschwörer !

Mal probieren und melde mich wieder !

gruß frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo !!

Habe mal eine Klasse zum Laden und Mischen der Karten gemacht ! Die Datenstruktur habe ich verändert, damit ich auch verschiedene Bilder laden kann, die aber einen Zusammenhang haben ( z.B.: Farbe: ROT und Text: ROT)

http://paste.pocoo.org/show/7137/

gruß frank
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Für Memory-Karten habe ich eine entsprechende (togglebare) Button-Klasse abgeleitet, die je nach Status das jeweilige Spielkartenbild oder die einheitliche Rückseite der Spielkarten anzeigt.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke YOGI !!

Was ist togglebar ?

Habe noch ein anderes Problem - Was ist an dem zweiten Kartensatz falsch ?

Code: Alles auswählen

>>> a=MemoryKarten('test')
>>> a.laden()
[(0, 'A1'), (0, 'A2'), (1, 'B1'), (1, 'B2'), (2, 'C1'), (2, 'C2'), (3, 'D1'), (3, 'D2'), (4, 'E1'), (4, 'E2'), (5, 'F1'), (5, 'F2'), (6, 'G1'), (6, 'G2'), (7, 'H1'), (7, 'H2')]
>>> a.mischen()
[[[0, (3, 'D1'), 'normal'], [0, (5, 'F1'), 'normal'], [0, (5, 'F2'), 'normal'], [0, (0, 'A2'), 'normal']], [[0, (3, 'D2'), 'normal'], [0, (7, 'H1'), 'normal'], [0, (6, 'G2'),
 'normal'], [0, (2, 'C1'), 'normal']], [[0, (1, 'B2'), 'normal'], [0, (0, 'A1'), 'normal'], [0, (7, 'H2'), 'normal'], [0, (2, 'C2'), 'normal']], [[0, (1, 'B1'), 
'normal'], [0, (4, 'E1'), 'normal'], [0, (6, 'G1'), 'normal'], [0, (4, 'E2'), 'normal']]]

Code: Alles auswählen

>>> a=MemoryKarten('farben.dmp')
>>> a.laden()
[(0, 'gruen1.gif'), (0, 'gruen2.gif'), (2, 'gelb1.gif'), (2, 'geld2.gif'), (3, 'schwarz1.gif'), (3, 'schwarz2.gif'), (4, 'blau1.gif'), (4, 'blau2.gif'), (5, 'orange1.gif'), (5, 'orange2.gif'), (6, 'weiss1.gif'), (6, 'weiss2.gif'), (7, 'lila1.gif'), (7, 'lila2.gif')]
>>> a.mischen()
[]
edit: Habe den Fehler gefunden - In der zweiten Liste fehlt eine Karte !
unnützer Post - entschuldiung :oops:

gruß frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo !

Warum geht das nicht - hat dies etwas mit der Klasse PhotoImage zu tun ?

Code: Alles auswählen

def anzeigen(self):
        self.spiel_feld_rahmen = tk.Frame(self.memory_gui)
        for row, karten in enumerate(self.spiel_feld):
            for column, karte in enumerate(karten):
                if karte[0] == 0:
                    self.image_file = tk.PhotoImage(file='rueckseite.gif')
                else:
                    self.image_file = tk.PhotoImage(file=karte[1][1])
                button=tk.Button(self.spiel_feld_rahmen, image=self.image_file,
                    state = karte[2], command=lambda karte=karte:
                        self.auswerten(karte))
                button.grid(row=row, column=column)
        self.spiel_feld_rahmen.grid(row=0)
gruß frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Habe mal an der Klasse MemoryKarten rumgebastelt:

Code: Alles auswählen

def mischen(self):
        self.karten_satz_gemischt = list()
        reihe = list()
        feld = list()
        random.shuffle(self.karten_satz)
        for index, karte in enumerate(self.karten_satz):
            feld.append(0)
            feld.append(tuple((karte[0], tk.PhotoImage(file = karte[1]))))
            feld.append(tk.NORMAL)
            if len(feld) == 3:
                reihe.append(feld)
                feld = list()
            if len(reihe) == math.sqrt(len(self.karten_satz)):
                self.karten_satz_gemischt.append(reihe)
                reihe = list()
Habe die die Klasse MemoryGui dementsprechend umgebaut - nur das mit der Rückseite klappt noch nicht ! Werde beim mischen, diese auch als einzelne Pfadangaben hinzufügen.

Code: Alles auswählen

def anzeigen(self):
        self.spiel_feld_rahmen = tk.Frame(self.memory_gui)
        for row, karten in enumerate(self.spiel_feld):
            for column, karte in enumerate(karten):
                #if karte[0] == 0:
                    #image_file = tk.PhotoImage(file='rueckseite.gif')
                #else:
                image_file = karte[1][1]
                button=tk.Button(self.spiel_feld_rahmen, image=image_file,
                    state = karte[2], command=lambda karte=karte:
                        self.auswerten(karte))
                button.grid(row=row, column=column)
        self.spiel_feld_rahmen.grid(row=0)
gruß frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

So jetzt geht es - nur mit den vielen Indexen ! Geht es auch einfacher ?

http://paste.pocoo.org/show/7273/

gruß frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Habe mal versucht, die Anzeige der aufgedeckten Karten zu halten, doch jetzt kann man mit 'rumklicken' auch andere öffnen. WIe kann ich dies verhindern ?
Die Button speeren geht nicht da ich sie mit 'def anzeige(self)' wieder entsperre ?!

http://paste.pocoo.org/show/7442/

gruß frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Mal eine funktionsfähige Version !

http://paste.pocoo.org/show/7506/

gruß frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Die Anzeige der Buttons verändert, damit sie auch bei zwei falsch aufgedeckten Karten sichtbar bleiben.

Code: Alles auswählen

def vergleichen(self, karte, button):
        if len(self.vergleich) < 2:
            if karte[0] == 0:
                karte[0] = 1
                self.vergleich.append(karte)
            if len(self.vergleich) == 2:
                for karten in self.spiel_feld:
                    for karte in karten:
                        karte[2] = tk.DISABLED
                for karte in self.vergleich:
                    karte[2] = tk.NORMAL
                self.anzeigen()
                for karten in self.spiel_feld:
                    for karte in karten:
                        karte[2] = tk.NORMAL
                button.after(1000, self.auswerten)
            else:
                self.anzeigen()
gruß frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo !!

Jetz kann man selbst Memorys erstellen - ist noch nicht ganz fertig, da sich die selbst erstellten Kartesätze noch anzeigen und bearbeiten lassen sollten.
self.test -> ist der Kartensatz, der zum Speichern übergeben wird - brauche zwei Kartensätze - einer zum Anzeigen und einer zum Speichern, denn für Tkinter und PhotoImage muß der Pfad schon vor dem Anzeigen übergeben werden. Könnte man diesen pfad wieder herauslesen und dann speichern ?

http://paste.pocoo.org/show/8124/

gruß frank
Antworten