[PYTHON] Tache finale

Janken contre ordinateur

** * Veuillez lire cette page car le microphone ne peut pas être utilisé. Pardon! ** **

Pour la tâche finale, j'ai créé un jeu pour jouer à une poubelle contre un ordinateur en utilisant le code appris dans le jeu de devinettes. À partir de maintenant, je vais vous présenter la version la plus simple de ce jeu et celle qui a l'air bien.

Version simple

Cela ressemble à ceci: basicresult.jpg Lorsque vous démarrez, l'écran affiché sur la photo de gauche apparaît et lorsque vous appuyez sur le bouton, la fenêtre contextuelle affichée sur la photo de droite vous informe du gain ou de la perte (ou du tirage au sort). Appuyer sur Ok ferme la fenêtre contextuelle mais garde la fenêtre de jeu ouverte.

Ensuite, je présenterai le code de ce jeu. Tout d'abord, utilisez le code ci-dessous.

import random
import tkinter as tk
import tkinter.messagebox as tmsg 

** Signification du code: ** ʻImport random Laisser l'ordinateur choisir une valeur aléatoire ʻImporter tkinter comme tk tkinter ʻImporter tkinter.messagebox comme tmsg` Insérer une fenêtre contextuelle tkinter

Créer une fenêtre

Utilisez ensuite le code suivant.

root=tk.Tk()
root.geometry("600x400")
root.title("Rock Paper Scissors")
label=tk.Label(root,text="Pick One",font=("Helvetica",30))
label.place(x=200,y=20)

** Signification du code: ** root = tk.Tk () Nommez la fenêtre en tant que root root.geometry("600x400") root.title ("Rock Paper Scissors") Spécifiez la taille et le titre de la fenêtre label=tk.Label(root,text="Pick One",font=("Helvetica",30)) label.place (x = 200, y = 20) Spécifiez le caractère, la police et la position de la fenêtre

Créer un bouton

Utilisez ensuite le code suivant.

button0=tk.Button(root, text="rock", font=("Helvetica",20), command=ButtonClick0)
button0.place(x=100, y=60)

** Signification du code: ** ** button0 = tk.Button **(root, text = "rock", font = ("Helvetica", 20), command = ButtonClick0)Faites que button0 tk.Button fonctionne comme un bouton button0 = tk.Button (root, text = "rock", font = ("Helvetica", 20), command = ButtonClick0) Créer button0 dans la fenêtre, caractère, taille, commande Spécifiez (ButtonClick0)

Créez le code ci-dessus pour chaque bouton. La forme finale de cette pièce est la suivante.

button0=tk.Button(root, text="rock", font=("Helvetica",20), command=ButtonClick0)
button0.place(x=100, y=60)`

`button1=tk.Button(root, text="paper", font=("Helvetica",20), command=ButtonClick1)
button1.place(x=200, y=60)`

`button2=tk.Button(root, text="scissors", font=("Helvetica",20), command=ButtonClick2)
button2.place(x=300, y=60)

Enfin, créez une commande qui sera exécutée lorsque le bouton est enfoncé. Le code d'une commande est le suivant.

def ButtonClick0():
  player_number = 0
  comp = random.randint(0,2)
  if player_number == comp:
        tmsg.showinfo("Results", "tie")
  elif player_number == 0 and comp == 1:
    tmsg.showinfo("Results", "player chose rock, computer chose paper: computer wins")
  elif player_number == 0 and comp == 2:
        tmsg.showinfo("Results", "player chose rock, computer chose scissors: player wins")

** Signification du code: ** def ButtonClick0 (): Spécifie le comportement de la commande ButtonClick0 player_number = 0 Définit la valeur du joueur sur 0 lorsque ce bouton est enfoncé comp = random.randint (0,2) Quand ce bouton est pressé, l'ordinateur choisit un nombre aléatoire entre 0-2 if player_number == comp: elif player_number == 0 and comp == 1: elif player_number == 0 and comp == 2: Spécifiez la commande pour chaque condition (lorsque le numéro de joueur (0) est le même que celui de l'ordinateur, lorsque la valeur de l'ordinateur est 1 ou 2) tmsg.showinfo("Results", "____") Spécifiez le titre et le texte de la fenêtre contextuelle qui apparaît sous chaque condition Écrivez le code ci-dessus pour toutes les valeurs que le joueur peut sélectionner.

Produit fini

Le code complété est le suivant. Screen Shot 2020-07-05 at 9.12.18 PM.png

Une belle version

Cela ressemble à ceci: fancyresult.jpg

Changements de code

Tout d'abord, insérons une photo avec from PIL import ImageTk, Image. Puisque toutes les images à insérer sont dans le même fichier, créez la chaîne dir =" / Users / satokamimura / Desktop / school / uni / computer practice / newgame / ". Cela vous permettra d'utiliser dir + filename.png lors de l'insertion d'images.

Ensuite, remplacez le code de label par le code suivant pour changer le caractère de la fenêtre.

title = ImageTk.PhotoImage(Image.open(dir+"text.png "))
titletext = tk.Label(root, image= title).place(x=100,y=20)

** Signification du code: ** title = ImageTk.PhotoImage Spécifiez le nom de l'image comme titre titletext = tk.Label Nommez la prochaine étiquette titletext (racine, image = titre) .place (x = 100, y = 20) Afficher dans la fenêtre racine, définir l'image sur le titre spécifié précédemment et spécifier l'emplacement dans la fenêtre.

Ensuite, modifiez le code du bouton comme suit.

img = ImageTk.PhotoImage(Image.open(dir+"rock.png "))
button0=tk.Button(root, command=ButtonClick0, image = img).place(x=150, y=150)

** Signification du code: ** ʻImg = Image.Tk.PhotoImageSpécifiez le nom de l'image comme img button0 = tk.ButtonSpécifiez le nom du bouton comme button0 (root, command = ButtonClick0, image = img) .place (x = 150, y = 150)` Afficher dans la fenêtre racine, spécifiez la commande lorsque vous cliquez sur ButtonClick0, spécifiez l'image comme img précédente, bouton Spécifiez l'emplacement de

Si vous faites de même pour les deux autres boutons, tous les boutons seront des images de leur Janken respectif.

Ensuite, créez une fenêtre pour afficher les résultats. Ici, spécifiez uniquement la partie du format de fenêtre qui ne change avec aucun résultat.

def popup():
  global win
  win=tk.Toplevel()
  win.geometry("500x200")
  win.title('Results')
  tk.Button(win, text='Ok', command=win.destroy).place(x=190,y=172)
  tk.Button(win, text='End Game', command=root.destroy).place(x=250,y=172)

** Signification du code: ** global win Spécifiez une nouvelle fenêtre" win "globalement (en incluant ceci, vous pouvez utiliser" win "dans d'autres parties du code, ce qui est utile dans la partie du code qui décrit le résultat Devenir.) Créez une nouvelle fenêtre nommée win = tk.Toplevel () win win.geometry, win.title Spécifiez la taille et le titre de la fenêtre tk.Button (win, text = 'Ok', command = win.destroy) .place (x = 190, y = 172) Spécifie le bouton Ok et son emplacement pour fermer une nouvelle fenêtre lorsque vous appuyez sur tk.Button (win, text = 'End Game', command = root.destroy) .place (x = 250, y = 172) Lorsqu'il est pressé, la fenêtre de jeu se ferme également Spécifiez le bouton End Game et son emplacement

Modifiez ensuite la commande du bouton. Spécifie le code qui suit if, elif pour toutes les commandes pour afficher la nouvelle fenêtre créée précédemment à partir de tmsg.showinfo et une image montrant les résultats. ex.:

def ButtonClick0():
  player_number = 0
  comp = random.randint(0,2)
  popup()

** Signification du code: ** popup () Quel que soit le résultat, obtenez d'abord un pop-up pour afficher le résultat

Essayez ensuite d'afficher le résultat correct pour chaque motif possible. Le code est le même sauf pour le nom du motif et le nom de l'image, donc un seul exemple est donné ici.

if player_number == comp:
      rocktie= ImageTk.PhotoImage(Image.open(dir+"rocktie.png "))
      tk.Label(win, image=rocktie).place(x=0, y=0)
      popup.pack()

** Signification du code: ** rocktie = ImageTk.PhotoImage Spécifiez le nom de l'image comme rocktie tk.Label (win, image = rocktie) .place (x = 0, y = 0) Affichez l'image dans la fenêtre et spécifiez l'emplacement popup.pack () Code nécessaire pour faire apparaître une fenêtre pop-up avec une image

Créez une image de tous les modèles résultants et spécifiez le code ci-dessus pour tous les modèles. Les images utilisées sont un total de 9 images pour tous les motifs. Screen Shot 2020-07-07 at 3.42.27 AM.png

Le code complété est le suivant.

import random
import tkinter as tk
from PIL import ImageTk, Image

dir = "/Users/satokamimura/Desktop/school/uni/Exercice informatique/newgame/"


root=tk.Tk()
root.geometry("600x400")
root.title("Rock Paper Scissors")

def popup():
  global win
  win=tk.Toplevel()
  win.geometry("500x200")
  win.title('Results')
  tk.Button(win, text='Ok', command=win.destroy).place(x=190,y=172)
  tk.Button(win, text='End Game', command=root.destroy).place(x=250,y=172)
  
def ButtonClick0():
  player_number = 0
  comp = random.randint(0,2)
  popup()
  if player_number == comp:
      rocktie= ImageTk.PhotoImage(Image.open(dir+"rocktie.png "))
      tk.Label(win, image=rocktie).place(x=0, y=0)
      popup.pack()
  elif player_number == 0 and comp == 1:
      rocklose= ImageTk.PhotoImage(Image.open(dir+"rocklose.png "))
      tk.Label(win, image=rocklose).place(x=0, y=0)
      popup.pack()
  elif player_number == 0 and comp == 2:
      rockwin= ImageTk.PhotoImage(Image.open(dir+"rockwin.png "))
      tk.Label(win, image=rockwin).place(x=0, y=0)
      popup.pack()

def ButtonClick1():
  player_number = 1
  comp = random.randint(0,2)
  popup()
  if player_number == comp:
    papertie= ImageTk.PhotoImage(Image.open(dir+"papertie.png "))
    tk.Label(win, image=papertie).place(x=0,y=0)
    popup.pack()
  elif player_number == 1 and comp == 0:
    paperwin= ImageTk.PhotoImage(Image.open(dir+"paperwin.png "))
    tk.Label(win, image=paperwin).place(x=0,y=0)
    popup.pack()
  elif player_number == 1 and comp == 2:
    paperlose= ImageTk.PhotoImage(Image.open(dir+"paperlose.png "))
    tk.Label(win, image=paperlose).place(x=0,y=0)
    popup.pack()

def ButtonClick2():
  player_number = 2
  comp = random.randint(0,2)
  popup()
  if player_number == comp:
    scissorstie= ImageTk.PhotoImage(Image.open(dir+"scissorstie.png "))
    tk.Label(win, image=scissorstie).place(x=0,y=0)
    popup.pack()
  elif player_number == 2 and comp == 0:
    scissorslose= ImageTk.PhotoImage(Image.open(dir+"scissorslose.png "))
    tk.Label(win, image=scissorslose).place(x=0,y=0)
    popup.pack()
  elif player_number == 2 and comp == 1:
    scissorswin= ImageTk.PhotoImage(Image.open(dir+"scissorswin.png "))
    tk.Label(win, image=scissorswin).place(x=0,y=0)
    popup.pack()

title = ImageTk.PhotoImage(Image.open(dir+"text.png "))
tk.Label(root, image= title).place(x=100,y=20)

img = ImageTk.PhotoImage(Image.open(dir+"rock.png "))
button0=tk.Button(root, command=ButtonClick0, image = img).place(x=150, y=150)

img1 = ImageTk.PhotoImage(Image.open(dir+"paper.png "))
button1=tk.Button(root, command=ButtonClick1, image=img1).place(x=270, y=150)

img2 = ImageTk.PhotoImage(Image.open(dir+"scissors.png "))
button2=tk.Button(root, command=ButtonClick2, image=img2).place(x=390, y=150)

root.mainloop()

Partie difficile

Je voulais changer l'apparence du pop-up résultant, mais showinfo de tkinter a des changements très limités, donc j'ai fini par créer une nouvelle fenêtre qui ressemble à un pop-up. À ce moment-là, je ne savais pas comment créer une nouvelle fenêtre, c'était donc la partie la plus difficile. De plus, l'insertion de l'image était un peu difficile au début. Quand j'ai créé ce jeu pour la première fois, j'ai spécifié une nouvelle fenêtre pour tous les modèles résultants, donc c'était un nombre énorme de lignes de code. J'ai résumé le code de base du pop-up pour l'omettre, mais au début c'était difficile car je ne pouvais pas coopérer avec le code d'affichage de l'image comme je m'y attendais.

Points que j'ai été heureux d'utiliser

Les références

https://stackoverflow.com/questions/45228664/tkinter-nameerror-name-toplevel-is-not-defined https://stackoverflow.com/questions/41574168/how-to-i-position-buttons-in-tkinter/41575504 https://stackoverflow.com/questions/10052410/tkinter-button-does-not-appear-on-toplevel https://stackoverflow.com/questions/16242782/change-words-on-tkinter-messagebox-buttons https://stackoverflow.com/questions/32060837/remove-border-of-tkinter-button-created-with-an-image https://www.geeksforgeeks.org/pyqt5-add-image-icon-on-a-push-button/?ref=rp https://stackoverflow.com/questions/25703446/whats-the-main-difference-between-if-and-else-if https://docs.python-guide.org/scenarios/imaging/

Recommended Posts

Tache finale
Produit final
Tâche AHC (2) ajouter