[PYTHON] J'ai créé un jeu appelé Battle Ship en utilisant pygame et tkinter

0. Premier

Si vous souhaitez voir comment les choses que vous faites cette fois-ci fonctionneront, veuillez voir ici (vidéo youtube). Je pense que la vidéo expliquera plus profondément que l'explication ici.

1. Téléchargez des effets sonores et BGM

Cette fois, j'ai utilisé les logiciels gratuits Sounds et BGM. De plus, lorsque vous utilisez des effets sonores dans pygame, il doit s'agir d'un fichier wav, donc ici j'ai converti de mp3 en wav.

2. Écrivez le processus

Veuillez consulter Github car ce sera long si vous mettez tout le code. Ici, nous allons expliquer chaque fonction une par une.

Tout d'abord, importez la bibliothèque à utiliser cette fois. Cette fois, nous utiliserons numpy pour manipuler la matrice.

library.py


import pygame
from pygame.locals import *
import numpy as np
import tkinter as tk
import random

Et c'est, comme son nom l'indique, une fonction qui dessine un champ. Le champ est cette fois en forme de grille. Je n'ai pas fait beaucoup de choses difficiles ici, donc si vous regardez de plus près, vous comprendrez. Il existe également une fonction appelée p2_field, mais ce qu'elle fait est identique à cette fonction.

battle_ship.py


def p1_field(win):
    rows = 10
    x = 55
    y = 55
    sizeBwn = 65

    for i in range(rows):
        x += sizeBwn
        y += sizeBwn
        pygame.draw.line(win,(0,0,0),(x,55),(x,705))
        pygame.draw.line(win,(0,0,0),(55,y),(705,y))

    pygame.draw.line(win,(0,0,0),(55,55),(55,705),5)
    pygame.draw.line(win,(0,0,0),(55,55),(705,55),5)
    pygame.draw.line(win,(0,0,0),(55,705),(705,705),5)
    pygame.draw.line(win,(0,0,0),(705,55),(705,705),5)
    
    drawnumbers(87.5,win)
    drawstring(87.5,win)
    font = pygame.font.SysFont('comicsens',100)
    text = font.render("Your Field",5,(0,0,255))
    win.blit(text,(380-text.get_width()/2,730))

C'est le dernier appelé dans la fonction précédente. Il dessine des chiffres et des alphabets, mais c'est presque comme une décoration, avec peu à voir avec le jeu.

battle_ship.py


def drawnumbers(pos,win):
    for b in num_list:
        font = pygame.font.SysFont('comicsens',25)
        text = font.render(b,1,(0,0,0))
        win.blit(text,(pos - (text.get_width()/2),5))
        pos += 65

def drawstring(pos,win):
    for i in st_list:
        font = pygame.font.SysFont('comicsens',25)
        text = font.render(i,1,(0,0,0))
        win.blit(text,(5,pos - (text.get_width()/2)))
        pos += 65

C'est la fonction qui sera appelée lorsque vous serez à la position du navire. Cette fois, il sera appelé en premier. Cela utilise le même que celui que j'ai présenté à Qiita plus tôt dans Comment changer uniquement la couleur du bouton pressé avec Tkinter. Je vous ai appris une méthode simple, mais cela n'a pas fonctionné lorsque j'ai dessiné le navire, alors je vais le mettre en attente.

battle_ship.py


def setting_ships():
    column = -1
    row = 0
    root = tk.Tk()
    root.title('Set Your Ships')
    root.geometry('470x310')
    for i in range(101):
        if i > 0:
            if i%10 == 1:
                row += 1 
                column = -1
            column += 1
            text=f'{i}'
            btn = tk.Button(root, text=text)
            btn.grid(column=column, row=row)
            btn.config(command=collback(btn,i))  
    root.mainloop()
    main()

def collback(btn,i):
    def nothing():
        btn.config(bg='#008000')
        numbers.append(i)
    return nothing

C'est la prochaine fonction à appeler. Cela dessine le champ et appelle une fonction appelée draw_ships.

battle_ship.py


def main():
    pygame.display.set_caption("battle ship")     
    win.fill((255,255,255)) 
    p1_field(win)
    p2_field(win)
    draw_ships(array_1,numbers)
    bomb_buttons()

    pygame.quit()

C'est draw_ships. Le tableau passé ici et le tableau passé à d'autres fonctions sont identiques et sont des tableaux à deux dimensions. Ici, dessinez la position du navire spécifié par Tkinter sur le terrain. La liste des numéros appelés contient les numéros des boutons sur lesquels vous avez appuyé.

battle_ship.py


array_1 = np.zeros([10,10],dtype=int)
array_2 = np.zeros([10,10],dtype=int)

def draw_ships(array, numbers):
    width = 65
    numbers = np.sort(numbers)
    for i in numbers:
        array.flat[i-1] = 1
    array = array.reshape(-1,1)
    for i in np.where(array == 1)[0]:
        index = i//10
        if i >= 10:
            columns = int(str(i)[1:])
        else:
            columns = i
        pygame.draw.rect(win,(0,0,0),(55+width*columns,55+width*index,width,width),0)
    pygame.display.update()
    ai_ships(array_2)

Et c'est la prochaine fonction à appeler. Bien qu'il soit écrit en tant que ai, il s'agit simplement d'une installation aléatoire de navires. Vous ne pouvez pas voir l'autre vaisseau ai, alors stockez simplement la position du vaisseau dans le tableau.

battle_ship.py


def ai_ships(array):
    num_5 = random.randint(0,5)
    num_4_1 = random.randint(8,9)
    num_4_2 = random.randint(3,6)
    num_3_1 = random.randint(3,6)
    num_3_2 = random.randint(5,7)
    num_2 = random.randint(2,6)
    num_1_1 = random.randint(0,2)
    num_1_2 = random.randint(5,9)
    if num_5 >= 7:
        array[num_5:num_5+5,0] = 1
    if num_5 <= 6:
        array[-5:,0] = 1
    array[num_3_1,num_3_2:num_3_2+3] = 1
    array[num_2,2:4] = 1
    array[num_4_1,num_4_2:num_4_2+4] = 1
    array[num_1_1,num_1_2] = 1
    array = array.reshape(-1,1)
    pygame.display.update()

Ensuite, le jeu démarre et le bouton s'affiche à nouveau. Qu'il ait été touché ou non par une fonction appelée bombardement en collback et le traitement ultérieur est effectué.

battle_ship.py


def bomb_buttons():
    column = -1
    row = 0
    root = tk.Tk()
    root.title('bombing')
    root.geometry('470x310')
    for i in range(101):
        if i > 0:
            if i%10 == 1:
                row += 1 
                column = -1
            column += 1
            text=f'{i}'
            btn = tk.Button(root, text=text)
            btn.grid(column=column, row=row)
            btn.config(command=collback2(btn,i))      
    root.mainloop()

def collback2(btn,i):
    def nothing2():
        btn.config(bg='#008000')
        bombing(i,btn)
    return nothing2

C'est la fonction appelée bombardement. La liste utilisée ici, bombe, contient des valeurs de 0 à 99. Ensuite, s'il y a un navire à l'endroit spécifié, le bouton sera rouge et un cercle rouge sera dessiné sur le terrain avec un effet sonore. S'il n'y a pas de navire, un cercle noir sera dessiné. Et quand votre tour sera terminé, ce sera au tour de ai. Si l'un des vaisseaux est anéanti, le jeu est terminé et le gagnant est celui qui anéantit.

battle_ship.py


bomb = [i for i in range(100)]

def bombing(i,btn):
    global p1_counter,p2_counter
    font = pygame.font.SysFont('comicsens',100)
    i -= 1
    array = array_2.reshape(-1,1) 
    width = 65  
    index=i//10
    if i >= 10:
        columns = int(str(i)[1:])
    else:
        columns = i
    if array[i] == 1:
        pygame.draw.circle(win,(255,0,0),((730+columns*width)+width//2,(55+index*width)+width//2),width//2,0)
        bombed_sound.play()
        p1_counter += 1
        btn.config(bg='#FF0000')
    elif array[i] == 0:
        pygame.draw.circle(win,(0,0,0),((730+columns*width)+width//2,(55+index*width)+width//2),width//2,0)
        failed.play()
    if p1_counter == 15:
        pygame.mixer.music.stop()
        text = font.render('You Win!!',5,(255,0,0))
        win.blit(text,(750-text.get_width()/2,200))
        pygame.display.update()
        victory.play()

    num = random.choice(bomb)
    bomb.pop(bomb.index(num))
    array1 = array_1.reshape(-1,1)
    index=num//10
    if num >= 10:
        columns = int(str(num)[1:])
    else:
        columns = num
    if array1[num] == 1:
        pygame.draw.circle(win,(255,0,0),((55+columns*width)+width//2,(55+index*width)+width//2),width//2,0)
        p2_counter += 1
        bombed_sound.play()
    elif array1[num] == 0:
        pygame.draw.circle(win,(0,0,0),((55+columns*width)+width//2,(55+index*width)+width//2),width//2,0)
    if p2_counter == 15:
        pygame.mixer.music.stop()
        text = font.render('You Lose...',1,(0,0,255))
        win.blit(text,(750-text.get_width()/2,200))
        pygame.display.update()
        lose.play()

    pygame.display.update()

finalement

Comment faire ce jeu de cuirassé est également expliqué dans Youtube, alors jetez un œil si vous l'aimez. Si vous avez des questions, veuillez utiliser la section commentaires de la vidéo ou la section commentaires de cet article. De plus, si vous l'aimez, veuillez vous abonner à la chaîne.

Recommended Posts

J'ai créé un jeu appelé Battle Ship en utilisant pygame et tkinter
〇✕ J'ai fait un jeu
J'ai créé un jeu d'introduction au festival scolaire avec Ren'py
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai fait un jeu de combat Numer0n en Java (j'ai aussi fait de l'IA)
J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python
J'ai fait un Line-bot avec Python!
J'ai créé un chat-holdem de serveur de jeu de poker en utilisant websocket avec python
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python (2) ~ Server ~
J'ai essayé de jouer au jeu ○ ✕ en utilisant TensorFlow
Débutant: j'ai créé un lanceur à l'aide d'un dictionnaire
J'ai fait un jeu de vie avec Numpy
J'ai fait un jeu rogue-like avec Python
J'ai fait un truc fou appelé tuple typé
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai fait un jeu de cueillette avec Python
J'ai créé un site de liste de Kindle Prime Reading en utilisant Scrapy et GitHub Actions
J'ai effectué un processus de connexion / déconnexion en utilisant Python's Bottle.
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
J'ai essayé de faire LINE BOT avec Python et Heroku
J'ai fait un jeu mono tombé avec Sense HAT
J'ai essayé de faire un classement en grattant l'équipe des membres de l'organisation
Je vais créer un jeu pour contrôler le puzzle et les dragons en utilisant pygame
J'ai créé un lecteur de flux rapide en utilisant feedparser en Python
J'ai fait un modèle VGG16 en utilisant TensorFlow (en chemin)
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai créé une application d'estimation de l'entraînement musculaire à l'aide du SDK Qore
J'ai fait un texte Python
J'ai fait un robot discord
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
J'ai créé une caméra réseau simple en combinant ESP32-CAM et RTSP.
Créez un classement de jeu sur le cloud Alibaba en utilisant Python et Redis
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku
J'ai fait apprendre à RNN l'onde de péché et j'ai essayé de prédire: l'ajustement des paramètres hyper
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow - (1) Introduction
J'ai créé un classificateur de visage Dir en gray en utilisant l'extraction de visage TensorFlow-④
[Python] J'ai écrit une API REST en utilisant AWS API Gateway et Lambda.
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
J'ai créé un chat chat bot avec Tensor2Tensor et cette fois cela a fonctionné
[Kaggle] J'ai fait une collection de problèmes en utilisant le didacticiel Titanic
J'ai créé un robot musical en utilisant discord.py et l'API Google Drive (testé avec Docker → déployé sur Heroku)
J'ai créé un site d'apprentissage C ++
J'ai créé un script de traduction basé sur CUI (2)
Créer une interface graphique python à l'aide de tkinter
J'ai fait un wikipedia gacha bot
J'ai fait une loterie avec Python.
J'ai créé un script de traduction basé sur CUI
Zura fait comme un jeu de la vie
J'ai créé un démon avec Python
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow - Test de classification de visage
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑥ Programme d'apprentissage
J'ai essayé de faire un classificateur de visage Dir en gris en utilisant TensorFlow --⑬ Jouer (final)
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑧ Exécution d'apprentissage
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑫ Version Web
J'ai créé un réseau pour convertir des images noir et blanc en images couleur (pix2pix)