Pour l'apprentissage de python, il est normal de copier et coller quelque chose comme "CUI Othello en Python!" Qui traîne, mais avec le recul, qu'est-ce qui ne va pas? Même si vous essayez de comprendre chacun d'eux, le montant est important (pas important) pour les débutants.
Après tout, le meilleur moyen d'acquérir des connaissances est de bouger les mains et de les mémoriser tout en s'en souciant! Alors, pendant un certain temps, j'ai décidé d'utiliser CUI Othello comme interface graphique sans me fier au code existant. Je ne sais pas par quoi commencer ...
C'est une histoire courante pour les débutants d'essayer quelque chose qui reste et d'être frustré, alors pour le moment, j'ai changé ma direction pour une troisième ligne. Je sens que je peux le faire simplement en baissant un peu le niveau. C'est simple.
Si vous y réfléchissez avant de le faire, vous perdrez votre motivation, j'ai donc essayé de créer une troisième ligne par la méthode d'ajout de code, qui est étudiée et mise en œuvre au besoin.
Le code qui apparaît au milieu est découpé dans le produit fini, donc c'est peut-être un peu difficile à voir, mais ce n'est pas mal. La vue d'ensemble est au bas de la page
Image terminée
Commencez par créer un écran. Equipé d'un bouton. J'appuie sur le bouton. Je vais commencer d'ici.
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('Trois rangées')
TictapApp(root)
root.mainloop()
if __name__ == '__main__':
main()
Apparemment, si vous importez quelque chose appelé Tkinter, vous pouvez installer des fonctions GUI. Il semble que vous puissiez changer l'apparence de différentes manières en donnant divers attributs au bouton, mais voici un arrangement 3x3 avec moins de boutons que la calculatrice tout en imitant la calculatrice. S'il y a mainloop () dans la fonction principale, il semble que vous puissiez l'utiliser tant que vous ne fermez pas la fenêtre. Il n'était pas possible de mettre une fonction dans le bouton, et à la suite de divers essais et erreurs, cela s'est résolu à ce qui précède.
Self que vous pouvez voir même si vous n'aimez pas utiliser python. Je ne l'ai pas encore bien compris, mais si je définis les variables utilisées dans plusieurs fonctions avec self, je peux les gérer. C'est une question de reconnaissance.
Si vous continuez en l'exécutant, vous pouvez garder votre motivation comme si quelque chose était terminé, et vous pouvez sentir quel code joue quel rôle, alors je l'ai utilisé cette fois-ci lorsque je voulais faire autre chose. Il semble que les pièces peuvent être appliquées comme un ensemble de voyage d'affaires.
def mark(self, event):
if not event.widget['text']:
if self.player == 1:
event.widget['text'] = str('〇')
else:
event.widget['text'] = str('×')
Si l'écran est créé, nous ajouterons des fonctions cette fois. Lorsque vous appuyez sur le bouton, vous souhaitez afficher 〇 ou × là où vous appuyez dessus, alors ajoutez la fonction de marque à la classe Tictac. Si vous utilisez la méthode de liaison de Button, il semble que vous puissiez exécuter la fonction lorsque vous appuyez sur le bouton, créez donc une fonction qui affiche des caractères sur le bouton lorsque vous appuyez sur. Remplacez le texte de event.widget par str ('chaîne de caractères').
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
Si vous pouvez appuyer sur un bouton, il semble que vous deviez enregistrer quel joueur a appuyé sur quel bouton, alors créez une fonction d'enregistrement. J'ai créé une fonction set_value car il semble que le conteneur qui contient l'enregistrement sera également utilisé. En outre, les informations sur le joueur actuel et les paramètres de la décision finale sont également inclus. Dans la fonction d'enregistrement, les informations d'acquisition du joueur sont placées dans le conteneur, il est jugé si les trois lignes sont alignées, les joueurs sont remplacés et, si elle est réglée, le plateau est remis à l'état initial. J'étais très occupé. C'est une mauvaise partie de la méthode d'ajout de code.
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()
Puisqu'il est devenu nécessaire de déterminer si la troisième ligne était alignée, j'ai créé une fonction line_check. Si vous regardez à l'intérieur verticalement, horizontalement et diagonalement et que trois valeurs sont identiques à celles du joueur, la partie est terminée. Le dernier jugement diagonal a été résolu par la force.
def game_end(self):
if self.player == 1:
messagebox.showinfo('Règlement', 'Le joueur principal gagne!')
else:
messagebox.showinfo('Règlement', 'Le deuxième joueur gagne!')
self.finish = 1
Si vous en alignez trois, vous devez nous faire part de la victoire ou de la défaite. Une implémentation de la fonction game_end. Lorsque la fonction game_end est appelée, une boîte de message apparaît pour vous informer du résultat et définir un indicateur de règlement.
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()
S'il n'est pas réglé, le joueur sera remplacé, et si tel est le cas, le plateau sera de nouveau créé et initialisé. C'est ainsi que la troisième ligne de personnes est complétée.
J'ai ajouté le code sur place, donc à la fin c'est devenu extrêmement difficile à voir. .. .. C'est terminé, donc ça va! Si vous essayez de le faire magnifiquement en pensant à l'image dans son ensemble, ce sera gênant, mais si vous ajoutez des fonctions au besoin tout en le faisant, je pense qu'il est facile de le mener à bien tout en maintenant la motivation telle qu'elle est. C'était facile à digérer car je vérifiais chaque fois que je les ajoutais un par un.
Cette fois, j'ai appris la fonction d'appuyer sur un bouton pour exécuter une fonction, alors je voudrais ensuite créer quelque chose avec plus de fonctions tout en l'incorporant.
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('Règlement', 'Le joueur principal gagne!')
else:
messagebox.showinfo('Règlement', 'Le deuxième joueur gagne!')
self.finish = 1
def clear(self):
if self.finish == 1:
self.create_widgets()
self.set_value()
def main():
root = Tk()
root.title('Trois rangées')
TictacApp(root)
root.mainloop()
if __name__ == '__main__':
main()
Recommended Posts