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.
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.
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()
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