[PYTHON] Faisons un jeu de squash

Qu'est-ce qu'un jeu de squash?

Un jeu de squash est un jeu dans lequel une balle qui frappe le bord de l'écran et rebondit est frappée avec une souris.


Comment faire

Étape 1: créer des fenêtres et un canevas

# coding:utf-8
import tkinter as tk

#Créer une fenêtre
win = tk.Tk()
#Créer une toile
cv = tk.Canvas(win, width=640, height=480 ,bg="white")
#Affichage de la toile
cv.pack()

#Fenêtre d'affichage
win.mainloop()

Étape 2: Dessinez une balle et déplacez-la

Déplacer la balle ➝ Afficher ou masquer la balle

Efface la balle

  1. Affichez une boule de la même couleur que l'arrière-plan
  2. Éteignez tous les écrans après avoir affiché la balle ☜ Cette fois

Étape 1: définir les variables

#Initialisation du jeu
ball_ichi_x = 300 
ball_ichi_y = 150
ball_idou_x = 30
ball_idou_y = -30
ball_size = 10

Étape 2: dessinez un écran

#Dessin d'écran
def draw_screen():
    #Écran propre
    cv.delete('all')← Commande pour éteindre l'écran
    #Campus(écran)Création
    cv.create_rectangle(0, 0, 640, 480, fill="white", width=0)

Étape 3: Dessinez une balle

#Dessine une balle
def draw_ball():
    cv.create_oval(ball_ichi_x - ball_size, ball_ichi_y - ball_size, ball_ichi_x + ball_size, ball_ichi_y + ball_size, fill="red", width=0)

Étape 4: Déplacez la balle

#Mouvement de balle
def move_ball():
    global ball_ichi_x, ball_ichi_y, ball_idou_x, ball_idou_y

    #Jugement d'avoir frappé les murs gauche et droit
    if ball_ichi_x + ball_idou_x < 0 or ball_ichi_x + ball_idou_x > 640:
        ball_idou_x *= -1
               ↓
     ball_idou_x = ball_idou_x * -1

    #Jugement d'avoir heurté le plafond ou le sol
    if ball_ichi_y + ball_idou_y < 0 or ball_ichi_y + ball_idou_y > 480:
        ball_idou_y *= -1
    
    #Déplacer la position de la balle
    if 0 <= ball_ichi_x + ball_idou_x <= 640:
        ball_ichi_x = ball_ichi_x + ball_idou_x
    if 0 <= ball_ichi_y + ball_idou_y <= 480:
        ball_ichi_y = ball_ichi_y + ball_idou_y
    
#Commande pour le traitement itératif du jeu
def game_loop():
    draw_screen()
    draw_ball()
    move_ball()
    win.after(50, game_loop) #Paramètres de la minuterie

#Traitement principal du jeu
game_loop()← Appeler la fonction

Définir "global" lors de l'utilisation de la variable définie à l'intérieur de la fonction en dehors de la fonction L'unité de temps de la minuterie est le millimètre (1/1000) seconde


Résultat d'exécution

tk-2020-07-08-11-44-27.gif


Étape 3: Transformons-nous en un jeu de squash

Étape 1: définir les variables

#Initialisation du jeu
def init_game():
    global is_gameover, ball_ichi_x, ball_ichi_y
    global ball_idou_x, ball_idou_y, ball_size
    global racket_ichi_x, racket_size, point, speed
    is_gameover = False #Confirmation de fin de partie(Faux si ce n'est pas fini/Vrai une fois terminé)
    ball_ichi_x = 0
    ball_ichi_y = 250
    ball_idou_x = 15 
    ball_idou_y = -15 
    ball_size = 10
    racket_ichi_x = 0
    racket_size = 100
    point = 0 #point(Initialement 0 point/Augmenter de 10 points)
    speed = 50 #Minuterie pour régler la vitesse du jeu(L'unité est la milliseconde)
    win.title("Jeu de squash:début!") #Affiché dans la barre de titre

Vous pouvez initialiser le jeu ensemble en regroupant les valeurs initiales des variables avec une fonction nommée "init_game ()".


Étape 2: Dessinez une raquette

#Dessinez une raquette
def draw_racket ():
    cv.create_rectangle(racket_ichi_x, 470, racket_ichi_x + racket_size, 480, fill="yellow")

Étape 3: Déplacez la balle

#Mouvement de balle
def move_ball():
    global is_gameover, point, ball_ichi_x, ball_ichi_y, ball_idou_x, ball_idou_y
    if is_gameover: return
    
    #Jugement d'avoir frappé les murs gauche et droit
    if ball_ichi_x + ball_idou_x < 0 or ball_ichi_x + ball_idou_x > 640:
        ball_idou_x *= -1

    #Jugement d'avoir heurté le plafond ou le sol
    if ball_ichi_y + ball_idou_y < 0:
        ball_idou_y *= -1
    
    #Jugement de frapper la raquette
    if ball_ichi_y + ball_idou_y > 470 and (racket_ichi_x <= (ball_ichi_x + ball_idou_x) <= (racket_ichi_x + racket_size)):
        ball_idou_y *= -1
        if random.randint(0, 1) == 0:
            ball_idou_x *= -1
        point += 10
        win.title("Score =" + str(point)) #Affichage des scores
    
    #Jugement en cas d'erreur
    if ball_ichi_y + ball_idou_y > 480:
        is_gameover = True
        win.title("Score =" + str(point)) #Affichage des scores
    
    #Déplacer la position de la balle
    if 0 <= ball_ichi_x + ball_idou_x <= 640:
        ball_ichi_x = ball_ichi_x + ball_idou_x
    if 0 <= ball_ichi_y + ball_idou_y <= 480:
        ball_ichi_y = ball_ichi_y + ball_idou_y

Étape 4: traitement de la souris

#Gestion des mouvements de la souris
def motion(event): #Vérifiez la position du pointeur de la souris
    global racket_ichi_x 
    racket_ichi_x = event.x
    
def click(event): #Cliquez pour redémarrer
    if event.num == 1:
        init_game()

#Confirmation du mouvement de la souris et clic
win.bind('<Motion>', motion)
win.bind('<Button>', click)

La commande dans "<>" est appelée "événement" et vous pouvez vérifier le mouvement de la souris. ← Nom de l'événement (commençant par une majuscule) "Motion" ← nom de la fonction


Étape 4: facultatif

Faisons un son et un message

    #Jugement d'avoir frappé les murs gauche et droit
    if ball_ichi_x + ball_idou_x < 0 or ball_ichi_x + ball_idou_x > 640:
        ball_idou_x *= -1
        winsound.Beep(1300, 50)
    
    #Jugement d'avoir heurté le plafond ou le sol
    if ball_ichi_y + ball_idou_y < 0:
        ball_idou_y *= -1
        winsound.Beep(1300, 50)

    #Jugement de frapper la raquette
    if ball_ichi_y + ball_idou_y > 470 and (racket_ichi_x <= (ball_ichi_x + ball_idou_x) <= (racket_ichi_x + racket_size)):
        ball_idou_y *= -1
        if random.randint(0, 1) == 0:
            ball_idou_x *= -1
        winsound.Beep(2000, 50)
        mes = random.randint(0, 3)
        if mes == 0:
            message = "bien!"
        if mes == 1:
            message = "bien!"
        if mes == 2:
            message = "agréable!"
        if mes == 3:
            message = "sensationnel!"
        point += 10
        win.title(message + "Score =" + str(point)) #Afficher le score et le message
        
    #Jugement en cas d'erreur
    if ball_ichi_y + ball_idou_y > 480:
        mes = random.randint(0, 3)
        if mes == 0:
            message = "Tu as fait une erreur!"
        if mes == 1:
            message = "Donmai!"
        if mes == 2:
            message = "Heta merde!"
        if mes == 3:
            message = "Ah, je ne peux pas le voir!"
        win.title(message + "Score =" + str(point)) #Afficher le score et le message
        winsound.Beep(240, 800)
        is_gameover = True

Vous pouvez faire un son avec "winsound.Beep (fréquence du son, temps pour faire un son)"


Changeons la vitesse de la balle

ball_idou_x = 15
    ball_idou_y = -15
 speed = 50 #Minuterie pour régler la vitesse du jeu(L'unité est la milliseconde)

Vous pouvez changer la vitesse de la balle en changeant ces valeurs


Code source

# coding:utf-8

#Jeu de squash(Tennis frappant le mur)
#Importation de module
import tkinter as tk
import random
import winsound

#Créer une fenêtre
win = tk.Tk()
#Créer une toile
cv = tk.Canvas(win, width=640, height=480 ,bg="white")
#Affichage de la toile
cv.pack()

#Initialisation du jeu
def init_game():
    global is_gameover, ball_ichi_x, ball_ichi_y
    global ball_idou_x, ball_idou_y, ball_size
    global racket_ichi_x, racket_size, point, speed
    is_gameover = False #Confirmation de fin de partie(Faux si ce n'est pas fini/Vrai une fois terminé)
    ball_ichi_x = 0
    ball_ichi_y = 250
    ball_idou_x = 15
    ball_idou_y = -15
    ball_size = 10
    racket_ichi_x = 0
    racket_size = 100
    point = 0 #point(Initialement 0 point/Augmenter de 10 points)
    speed = 50 #Minuterie pour régler la vitesse du jeu(L'unité est la milliseconde)
    win.title("Jeu de squash:début!") #Affiché dans la barre de titre

#Dessin d'écran
def draw_screen():
    #Écran propre
    cv.delete('all') #Commande pour éteindre l'écran
    #Campus(écran)Création
    cv.create_rectangle(0, 0, 640, 480, fill="white", width=0)

#Dessine une balle
def draw_ball():
    cv.create_oval(ball_ichi_x - ball_size, ball_ichi_y - ball_size, ball_ichi_x + ball_size, ball_ichi_y + ball_size, fill="red", width=0)

#Dessinez une raquette
def draw_racket ():
    cv.create_rectangle(racket_ichi_x, 470, racket_ichi_x + racket_size, 480, fill="yellow")

#Mouvement de balle
def move_ball():
    global is_gameover, point, ball_ichi_x, ball_ichi_y, ball_idou_x, ball_idou_y
    if is_gameover: return
    
    #Jugement d'avoir frappé les murs gauche et droit
    if ball_ichi_x + ball_idou_x < 0 or ball_ichi_x + ball_idou_x > 640:
        ball_idou_x *= -1
        winsound.Beep(1300, 50)
    
    #Jugement d'avoir heurté le plafond ou le sol
    if ball_ichi_y + ball_idou_y < 0:
        ball_idou_y *= -1
        winsound.Beep(1300, 50)

    #Jugement de frapper la raquette
    if ball_ichi_y + ball_idou_y > 470 and (racket_ichi_x <= (ball_ichi_x + ball_idou_x) <= (racket_ichi_x + racket_size)):
        ball_idou_y *= -1
        if random.randint(0, 1) == 0:
            ball_idou_x *= -1
        winsound.Beep(2000, 50)
        mes = random.randint(0, 3)
        if mes == 0:
            message = "bien!"
        if mes == 1:
            message = "bien!"
        if mes == 2:
            message = "agréable!"
        if mes == 3:
            message = "sensationnel!"
        point += 10
        win.title(message + "Score =" + str(point)) #Afficher le score et le message
        
    #Jugement en cas d'erreur
    if ball_ichi_y + ball_idou_y > 480:
        mes = random.randint(0, 3)
        if mes == 0:
            message = "Tu as fait une erreur!"
        if mes == 1:
            message = "Donmai!"
        if mes == 2:
            message = "Heta merde!"
        if mes == 3:
            message = "Ah, je ne peux pas le voir!"
        win.title(message + "Score =" + str(point)) #Afficher le score et le message
        winsound.Beep(240, 800)
        is_gameover = True

    #Déplacer la position de la balle
    if 0 <= ball_ichi_x + ball_idou_x <= 640:
        ball_ichi_x = ball_ichi_x + ball_idou_x
    if 0 <= ball_ichi_y + ball_idou_y <= 480:
        ball_ichi_y = ball_ichi_y + ball_idou_y

#Gestion des mouvements de la souris
def motion(event): #Vérifiez la position du pointeur de la souris
    global racket_ichi_x 
    racket_ichi_x = event.x
    
def click(event): #Cliquez pour redémarrer
    if event.num == 1:
        init_game()

#Confirmation du mouvement de la souris et clic
win.bind('<Motion>', motion)
win.bind('<Button>', click)

#Commande pour le traitement itératif du jeu
def game_loop():
    draw_screen()
    draw_ball()
    draw_racket()
    move_ball()
    win.after(speed, game_loop) #Paramètres de la minuterie

#Traitement principal du jeu
init_game()
game_loop() 
#Fenêtre d'affichage
win.mainloop()


Résultat d'exécution

ミスしたね_得点=10-2020-07-08-17-30-12.gif


スカッシュゲーム (3).PNG


Ce que j'ai remarqué


Question

import tkinter as tk 

Dans la référence [1],

from tkinter import *

Depuis qu'il a été écrit, il peut être exécuté en l'exécutant avec ceci, mais une ligne ondulée jaune est dessinée en dessous de, et le problème est 100. Pourquoi est-ce?

Les références

[1] Mitsuru Sugaya "apprenez la tempête du centre de jeu. Introduction à la programmation de la version de dessin animé de Hello Python" (2020) Nikkei BP [2] Fumitaka Osawa "La classe d'introduction Python la plus simple" (2019) Sotec Co., Ltd.

Recommended Posts

Faisons un jeu de squash
Créez un jeu à la Tetris!
Faisons un jeu de shiritori avec Python
〇✕ J'ai fait un jeu
Je veux faire un jeu avec Python
Faire un décorateur de fonction
Créez un jeu cocos2d avec une fenêtre à double angle de pixels
Faire une matrice de distance
Créez un jeu Janken en une seule ligne (python)
Je vais créer un mot de passe!
Créer un bouton Nyan
J'ai créé un jeu ○ ✕ avec TensorFlow
Créer un décodeur Base64
Comment faire un jeu de tir avec toio (partie 1)
Essayez de créer un jeu simple avec Python 3 et iPhone
Faisons un robot Discord.
Créer un backend Blueqat ~ Partie 1
Créer un backend Blueqat ~ Partie 2
[Django] Créer un menu déroulant
Créer un LINE BOT (chat)
Créer un bookmarklet en Python
Faites une loterie avec Python
Faire de Responder un démon (service)
Faire un feu avec kdeplot
Faire une impression de forage de calcul
Comment créer un jeu d'action multijoueur en ligne avec Slack
Comment faire un simple jeu Flappy Bird avec Pygame
Faisons une rumba distante [Matériel]
Comment faire une traduction japonais-anglais
Créer un identifiant Santa à partir d'une image du Père Noël
Faisons une rumba distante [Logiciel]
Créer une boîte à Tweet pour Pepper
Faisons une interface graphique avec python.
Faites un son avec le notebook Jupyter
Faisons un service de vente au comptant 2
Créer un outil de reconnaissance de visage à l'aide de TensorFlow
Comment créer un bot slack
Faisons une rupture de bloc avec wxPython
Faisons un service de vente au comptant 1
Comment créer un robot - Avancé
Comment créer une fonction récursive
Rendre la compilation C un peu plus facile
python / Créer un dict à partir d'une liste.
[Python] Faire de la fonction une fonction lambda
Créer un système de recommandation avec python
[Blender] Comment créer un plug-in Blender
Créer un filtre avec un modèle django
Zura fait comme un jeu de la vie
Faisons un graphe avec python! !!
Faisons un spacon avec xCAT
Comment créer un robot - Basic
Créer un itérateur de modèle avec PySide
Faire un joli graphique avec plotly
Créez un générateur de rideaux avec Blender