Seite 1 von 1

Memory - Der Ansatz ok ?

Verfasst: Donnerstag 18. Oktober 2007, 21:57
von kaytec
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: !

Verfasst: Donnerstag 18. Oktober 2007, 22:31
von kaytec
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

Verfasst: Freitag 19. Oktober 2007, 14:23
von schlangenbeschwörer
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-> ...

Verfasst: Sonntag 21. Oktober 2007, 06:57
von kaytec
Danke schlangenbeschwörer !

Mal probieren und melde mich wieder !

gruß frank

Verfasst: Montag 22. Oktober 2007, 22:48
von kaytec
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

Verfasst: Dienstag 23. Oktober 2007, 13:57
von Y0Gi
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.

Verfasst: Dienstag 23. Oktober 2007, 18:30
von kaytec
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

Verfasst: Dienstag 23. Oktober 2007, 19:53
von kaytec
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

Verfasst: Dienstag 23. Oktober 2007, 21:43
von kaytec
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

Verfasst: Dienstag 23. Oktober 2007, 22:10
von kaytec
So jetzt geht es - nur mit den vielen Indexen ! Geht es auch einfacher ?

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

gruß frank

Verfasst: Mittwoch 24. Oktober 2007, 23:22
von kaytec
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

Verfasst: Donnerstag 25. Oktober 2007, 09:31
von kaytec
Mal eine funktionsfähige Version !

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

gruß frank

Verfasst: Freitag 26. Oktober 2007, 10:01
von kaytec
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

Verfasst: Montag 29. Oktober 2007, 23:49
von kaytec
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