Für das Python-Lernen ist es in Ordnung, etwas wie "CUI Othello in Python!" Zu kopieren und einzufügen. Das liegt herum, aber rückblickend, was ist los? Selbst wenn Sie versuchen, jeden einzelnen zu verstehen, ist die Menge für Anfänger groß (nicht groß).
Schließlich ist der beste Weg, Wissen zu erwerben, Ihre Hände zu bewegen und es auswendig zu lernen, während Sie sich darüber Sorgen machen! Daher habe ich mich für eine Weile entschieden, CUI Othello als GUI zu verwenden, ohne auf vorhandenen Code angewiesen zu sein. Ich weiß nicht, womit ich anfangen soll ...
Es ist eine übliche Geschichte für Anfänger, etwas Besonderes auszuprobieren und zu frustrieren. Deshalb habe ich vorerst meine Richtung in eine dritte Zeile geändert. Ich habe das Gefühl, dass ich es schaffen kann, indem ich den Pegel ein wenig absenke. Es ist einfach.
Wenn Sie darüber nachdenken, bevor Sie es schaffen, verlieren Sie Ihre Motivation. Deshalb habe ich versucht, eine dritte Zeile mit der Code-Additionsmethode zu erstellen, die nach Bedarf untersucht und implementiert wird.
Der Code, der in der Mitte angezeigt wird, ist aus dem fertigen Produkt ausgeschnitten, daher ist er möglicherweise etwas schwer zu erkennen, aber nicht schlecht. Das große Bild befindet sich am Ende der Seite
Fertiges Bild
Machen Sie zuerst einen Bildschirm. Ausgestattet mit einem Knopf. Ich drücke den Knopf. Ich werde von hier aus beginnen.
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
squares = 3
class TictacApp(ttk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.create_widgets()
self.set_value()
def create_widgets(self):
for i in range(squares):
for j in range(squares):
button = ttk.Button(self, command=self.record(i, j))
button.bind('<Button-1>', self.mark)
button.grid(column=i, row=j, sticky=(N, S, E, W))
for i in range(squares):
self.columnconfigure(i, weight=1)
self.rowconfigure(i, weight=1)
self.master.columnconfigure(0, weight=1)
self.master.rowconfigure(0, weight=1)
self.grid(column=0, row=0, sticky=(N, S, E, W))
def main():
root = Tk()
root.title('Drei Reihen')
TictapApp(root)
root.mainloop()
if __name__ == '__main__':
main()
Wenn Sie etwas namens Tkinter importieren, können Sie anscheinend GUI-Funktionen installieren. Es scheint, dass Sie das Erscheinungsbild auf verschiedene Arten ändern können, indem Sie der Schaltfläche verschiedene Attribute zuweisen. Hier ist jedoch eine 3x3-Anordnung mit weniger Schaltflächen als der Taschenrechner, während Sie den Taschenrechner imitieren. Wenn sich in der Hauptfunktion mainloop () befindet, können Sie es anscheinend bedienen, solange Sie das Fenster nicht schließen. Es war nicht möglich, eine Funktion in den Button einzufügen, aber aufgrund verschiedener Versuche und Irrtümer hat sie sich auf das oben Gesagte niedergelassen.
Selbst, das Sie sehen können, auch wenn Sie Python nicht mögen. Ich habe es noch nicht vollständig verstanden, aber wenn ich die in mehreren Funktionen verwendeten Variablen mit self definiere, kann ich es verwalten. Es geht um Anerkennung.
Wenn Sie fortfahren, während Sie es ausführen, können Sie Ihre Motivation beibehalten, als ob etwas abgeschlossen wäre, und Sie können fühlen, welcher Code welche Rolle spielt. Deshalb habe ich ihn dieses Mal verwendet, als ich etwas anderes machen wollte. Es scheint, dass die Teile als Geschäftsreise-Set angewendet werden können.
def mark(self, event):
if not event.widget['text']:
if self.player == 1:
event.widget['text'] = str('〇')
else:
event.widget['text'] = str('×')
Wenn der Bildschirm erstellt wird, werden wir dieses Mal Funktionen hinzufügen. Wenn Sie die Taste drücken, möchten Sie 〇 oder × dort anzeigen, wo Sie sie drücken. Fügen Sie daher der Tictac-Klasse die Markierungsfunktion hinzu. Wenn Sie die Bindemethode von Button verwenden, können Sie die Funktion anscheinend ausführen, wenn die Taste gedrückt wird. Erstellen Sie daher eine Funktion, die beim Drücken Zeichen auf der Schaltfläche anzeigt. Überschreiben Sie den Text von event.widget mit str ('Zeichenfolge').
def record(self, i, j):
def x():
if not self.field[i][j]:
self.field[i][j] = self.player
self.line_check()
self.change_player()
self.clear()
return x
def set_value(self):
self.player = 1
self.field = []
for i in range(squares):
self.field.append(['' for i in range(squares)])
self.finish = 0
Wenn Sie eine Taste drücken können, müssen Sie anscheinend aufzeichnen, welcher Spieler welche Taste gedrückt hat. Erstellen Sie daher eine Aufnahmefunktion. Ich habe eine set_value-Funktion erstellt, da anscheinend auch der Container verwendet wird, der den Datensatz enthält. Zusätzlich sind die aktuellen Spielerinformationen und die Parameter für die endgültige Entscheidung enthalten. In der Aufnahmefunktion werden die Erfassungsinformationen des Spielers im Container festgelegt, es wird beurteilt, ob die drei Zeilen in einer Reihe stehen, die Spieler werden ersetzt, und wenn sie erledigt sind, wird das Brett in den Ausgangszustand zurückversetzt. Ich war sehr beschäftigt. Es ist ein schlechter Teil der Code-Additionsmethode.
def line_check(self):
cross = 0
for i in range(squares):
horizon = 0
vertical = 0
for j in range(squares):
if self.field[i][j] == self.player:
horizon += 1
if self.field[j][i] == self.player:
vertical += 1
if self.field[i][i] == self.player:
cross += 1
if horizon == 3 or vertical == 3 or cross == 3:
self.game_end()
if self.field[0][2] == self.field[1][1] == self.field[2][0] == self.player:
self.game_end()
Da festgestellt werden musste, ob die dritte Zeile ausgerichtet war, habe ich eine Funktion line_check erstellt. Wenn Sie vertikal, horizontal und diagonal nach innen schauen und es drei Werte gibt, die mit denen des Spielers identisch sind, ist das Spiel beendet. Das letzte diagonale Urteil wurde mit Gewalt gelöst.
def game_end(self):
if self.player == 1:
messagebox.showinfo('Siedlung', 'Der führende Spieler gewinnt!')
else:
messagebox.showinfo('Siedlung', 'Der zweite Spieler gewinnt!')
self.finish = 1
Wenn Sie drei aufstellen, müssen Sie uns den Sieg oder die Niederlage mitteilen. Eine Implementierung der Funktion game_end. Wenn die Funktion game_end aufgerufen wird, wird ein Meldungsfeld angezeigt, das Sie über das Ergebnis informiert und ein Abrechnungsflag setzt.
def change_player(self):
if self.finish == 0:
self.player = -self.player
def clear(self):
if self.finish == 1:
self.create_widgets()
self.set_value()
Wenn es nicht erledigt ist, wird der Spieler ersetzt, und wenn dies der Fall ist, wird das Brett erneut erstellt und initialisiert. So wird die dritte Reihe von Menschen vervollständigt.
Ich habe den Code sofort hinzugefügt, so dass es am Ende extrem schwer zu sehen war. .. .. Es ist fertig, also ist es okay! Wenn Sie versuchen, es schön zu machen, während Sie über das gesamte Bild nachdenken, wird es unangenehm sein, aber wenn Sie während der Erstellung nach Bedarf Funktionen hinzufügen, ist es meiner Meinung nach einfach, es zu Ende zu bringen, während die Motivation so bleibt, wie es ist. Es war leicht zu verdauen, da ich jedes Mal nachprüfte, wenn ich sie einzeln hinzufügte.
Dieses Mal habe ich die Funktion des Drückens einer Taste gelernt, um eine Funktion auszuführen. Als nächstes möchte ich etwas mit mehr Funktionen machen, während ich es einbeziehe.
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
squares = 3
class TictacApp(ttk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.create_widgets()
self.set_value()
def set_value(self):
self.player = 1
self.field = []
for i in range(squares):
self.field.append(['' for i in range(squares)])
self.finish = 0
def create_widgets(self):
for i in range(squares):
for j in range(squares):
button = ttk.Button(self, command=self.record(i, j))
button.bind('<Button-1>', self.mark)
button.grid(column=i, row=j, sticky=(N, S, E, W))
for i in range(squares):
self.columnconfigure(i, weight=1)
self.rowconfigure(i, weight=1)
self.master.columnconfigure(0, weight=1)
self.master.rowconfigure(0, weight=1)
self.grid(column=0, row=0, sticky=(N, S, E, W))
def mark(self, event):
if not event.widget['text']:
if self.player == 1:
event.widget['text'] = str('〇')
else:
event.widget['text'] = str('×')
def record(self, i, j):
def x():
if not self.field[i][j]:
self.field[i][j] = self.player
self.line_check()
self.change_player()
self.clear()
return x
def change_player(self):
if self.finish == 0:
self.player = -self.player
def line_check(self):
cross = 0
for i in range(squares):
horizon = 0
vertical = 0
for j in range(squares):
if self.field[i][j] == self.player:
horizon += 1
if self.field[j][i] == self.player:
vertical += 1
if self.field[i][i] == self.player:
cross += 1
if horizon == 3 or vertical == 3 or cross == 3:
self.game_end()
if self.field[0][2] == self.field[1][1] == self.field[2][0] == self.player:
self.game_end()
def game_end(self):
if self.player == 1:
messagebox.showinfo('Siedlung', 'Der führende Spieler gewinnt!')
else:
messagebox.showinfo('Siedlung', 'Der zweite Spieler gewinnt!')
self.finish = 1
def clear(self):
if self.finish == 1:
self.create_widgets()
self.set_value()
def main():
root = Tk()
root.title('Drei Reihen')
TictacApp(root)
root.mainloop()
if __name__ == '__main__':
main()