[PYTHON] Ich habe ein Spiel namens Battle Ship mit Pygame und Tkinter gemacht

0. Zuerst

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.

1. Laden Sie Soundeffekte und Hintergrundmusik herunter

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.

2. Schreiben Sie den Prozess

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

Schließlich

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

Ich habe ein Spiel namens Battle Ship mit Pygame und Tkinter gemacht
〇✕ Ich habe ein Spiel gemacht
Ich habe mit Ren’py ein Einführungsspiel für das Schulfest gemacht
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe ein Numer0n-Kampfspiel in Java gemacht (ich habe auch KI gemacht)
Ich habe mit Tkinter of Python ein Puzzlespiel (wie) gemacht
Ich habe Chatbot mit LINE Messaging API und Python erstellt
Ich habe einen Line-Bot mit Python gemacht!
Ich habe einen Pokerspielserver Chat-Holdem mit Websocket mit Python erstellt
Ich habe Chatbot mit der LINE Messaging API und Python (2) ~ Server ~ erstellt
Ich habe versucht, ○ ✕ mit TensorFlow zu spielen
Anfänger: Ich habe einen Launcher mit dem Wörterbuch erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe ein verrücktes Ding namens getipptes Tupel gemacht
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Ich habe mit Scrapy- und GitHub-Aktionen eine Listenseite für Kindle Prime Reading erstellt
Ich habe einen Anmelde- / Abmeldevorgang mit Python's Bottle durchgeführt.
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe mit Tkinter ein Fenster für die Protokollausgabe erstellt
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Ich habe mit Sense HAT ein gefallenes Monospiel gemacht
Ich habe versucht, eine Rangliste zu erstellen, indem ich das Mitgliederteam der Organisation abgekratzt habe
Ich werde ein Spiel machen, um das Ablegen von Rätseln und Drachen mithilfe von Pygame zu kontrollieren
Ich habe einen schnellen Feed-Reader mit Feedparser in Python erstellt
Ich habe ein VGG16-Modell mit TensorFlow gemacht (unterwegs)
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe mit dem Qore SDK eine App zum Schätzen des Muskeltrainings erstellt
Ich habe einen Python-Text gemacht
Ich habe einen Zwietrachtbot gemacht
Lebensspiel mit Python [ich habe es geschafft] (auf Terminal & Tkinter)
Ich habe eine einfache Netzwerkkamera hergestellt, indem ich ESP32-CAM und RTSP kombiniert habe.
Erstellen Sie mit Python und Redis eine Rangliste für Spiele in der Alibaba-Cloud
Ich habe mit Python, Flask und Heroku ein Nyanko-Tweet-Formular erstellt
Ich ließ RNN Sin Wave lernen und sagte es voraus: Hyper-Parameter-Anpassung
Ich habe mit TensorFlow - (1) Introduction einen Dir en grey face-Klassifikator erstellt
Ich habe mit der TensorFlow-④-Gesichtsextraktion einen Dir en grey-Gesichtsklassifikator erstellt
[Python] Ich habe eine REST-API mit AWS API Gateway und Lambda geschrieben.
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
Ich habe einen Chat-Chat-Bot mit Tensor2Tensor erstellt und diesmal hat es funktioniert
[Kaggle] Ich habe mit dem Titanic-Tutorial eine Sammlung von Problemen erstellt
Ich habe einen Musik-Bot mit discord.py und der Google Drive-API erstellt (getestet mit Docker → bereitgestellt für Heroku).
Ich habe eine C ++ - Lernseite erstellt
Ich habe ein CUI-basiertes Übersetzungsskript erstellt (2)
Erstellen Sie mit tkinter eine Python-GUI
Ich habe einen Wikipedia Gacha Bot gemacht
Ich habe mit Python eine Lotterie gemacht.
Ich habe ein CUI-basiertes Übersetzungsskript erstellt
Zura machte wie ein Lebensspiel
Ich habe mit Python einen Daemon erstellt
Ich habe mit dem TensorFlow --⑩ Gesichtsklassifizierungstest einen Dir-Grau-Gesichtsklassifikator erstellt
Ich habe mit dem Lernprogramm TensorFlow --⑥ einen Dir en grey face-Klassifikator erstellt
Ich habe mit TensorFlow - Dir Playing (final) einen Dir en grey face-Klassifikator erstellt.
Ich habe mit TensorFlow --⑧ Learning Execution einen Dir en Grey Face Classifier erstellt
Ich habe mit TensorFlow --⑫ Web Release einen Dir en Grey Face Classifier erstellt
Ich habe ein Netzwerk erstellt, um Schwarzweißbilder in Farbbilder umzuwandeln (pix2pix)