Wenn Sie sehen möchten, wie die Dinge, die Sie diesmal machen, funktionieren, lesen Sie bitte hier (Youtube-Video). Ich denke, dass das Video tiefer erklärt als die Erklärung hier.
Dieses Mal habe ich die kostenlosen Sounds und BGM verwendet. Wenn Sie Soundeffekte in Pygame verwenden, muss es sich um eine WAV-Datei handeln. Daher habe ich hier von MP3 zu WAV konvertiert.
Bitte lesen Sie Github, da es lange dauern wird, wenn Sie den gesamten Code eingeben. Hier erklären wir jede Funktion einzeln.
Importieren Sie zunächst die diesmal zu verwendende Bibliothek. Dieses Mal werden wir numpy verwenden, um die Matrix zu manipulieren.
library.py
import pygame
from pygame.locals import *
import numpy as np
import tkinter as tk
import random
Und dies ist, wie der Name schon sagt, eine Funktion, die ein Feld zeichnet. Das Feld hat diesmal die Form eines Gitters. Ich habe hier nicht viel Schwieriges getan. Wenn Sie genauer hinschauen, werden Sie verstehen. Es gibt auch eine Funktion namens p2_field, aber was sie tut, ist dasselbe wie diese Funktion.
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))
Dies ist die letzte, die in der vorherigen Funktion aufgerufen wurde. Es zeichnet Zahlen und Alphabete, aber es ist fast wie Dekoration, mit wenig mit dem Spiel zu tun.
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
Dies ist die Funktion, die aufgerufen wird, wenn Sie sich in der Position des Schiffes befinden. Dieses Mal wird es zuerst aufgerufen. Dies verwendet dasselbe, das ich Qiita zuvor in Wie man nur die Farbe der mit Tkinter gedrückten Taste ändert, vorgestellt habe. Ich habe dir eine einfache Methode beigebracht, aber es hat nicht funktioniert, als ich das Schiff gezeichnet habe, also werde ich es auf Eis legen.
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
Dies ist die nächste aufzurufende Funktion. Dies zeichnet das Feld und ruft eine Funktion namens draw_ships auf.
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()
Das ist draw_ships. Das hier übergebene Array und das an andere Funktionen übergebene Array sind identisch und zweidimensionale Arrays. Zeichnen Sie hier die Position des von Tkinter angegebenen Schiffes auf dem Feld. Die Liste mit den Nummern enthält die Nummern der Tasten, die Sie gedrückt haben.
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)
Und dies ist die nächste Funktion, die aufgerufen wird. Obwohl es als ai geschrieben ist, ist dies einfach eine zufällige Installation von Schiffen. Sie können das andere Schiff nicht sehen, also speichern Sie einfach die Position des Schiffes in einem Array.
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()
Dann beginnt das Spiel und die Schaltfläche wird erneut angezeigt. Es wird ausgeführt, ob es von einer Funktion namens Bombing in Collback getroffen wurde oder nicht.
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
Dies ist die Funktion, die als Bombenangriff bezeichnet wird. Die hier verwendete Liste bomb enthält Werte von 0 bis 99. Befindet sich dann ein Schiff an der angegebenen Stelle, wird die Schaltfläche rot angezeigt und ein roter Kreis mit einem Soundeffekt auf das Feld gezeichnet. Wenn kein Schiff vorhanden ist, wird ein schwarzer Kreis gezeichnet. Und wenn Sie an der Reihe sind, ist ai an der Reihe. Wenn eines der Schiffe ausgelöscht wird, ist das Spiel beendet und der Gewinner ist derjenige, der ausgelöscht hat.
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()
Wie man dieses Schlachtschiffspiel macht, wird auch in Youtube erklärt. Schauen Sie also bitte nach, wenn es Ihnen gefällt. Wenn Sie Fragen haben, verwenden Sie bitte den Kommentarbereich des Videos oder den Kommentarbereich dieses Artikels. Wenn es Ihnen gefällt, abonnieren Sie den Kanal.
Recommended Posts