Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren

Auslösen

Ich wollte eine Minenräummaschine auf dem Terminal implementieren, also habe ich sie implementiert. Als ich mit dem Programmieren anfing, habe ich es tatsächlich einmal in C implementiert, aber es wurde nicht abgeschlossen, sodass es auch als Überprüfung dient.

Übersicht über Mine Sweeper

Minesweeper ist ein Ein-Personen-Computerspiel, das in den 1980er Jahren erfunden wurde. Der Zweck des Spiels ist es, meine aus dem Minenfeld zu entfernen.

Ich habe auch gespielt, als ich in der Grundschule war. (Ich werde älter) Übrigens, wie viel wissen Sie, dass Sie jetzt Grundschüler sind?

Übrigens können Sie jetzt mit Chrome spielen, also [auf jeden Fall](https://www.google.com/search?q=Minesweeper&oq=min&aqs=chrome.1.69i57j69i59l2j0l2j69i61j69i60l2.2095j0j7&sourceid=chrome&ie

Implementierungsübersicht

Der Umriss entspricht (wahrscheinlich) der folgenden Site. [Mine Sweeper-Implementierung, die auf dem Terminal abgespielt werden kann](https://qiita.com/ta-ka/items/40b56722da43d1ba2e26#open%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89 % E3% 81% AE% E5% 86% 8D% E5% B8% B0])

App Übersicht

  1. Geben Sie die Datei, die Größe der Quadrate und das Verhältnis der Bomben an und führen Sie sie aus.

  2. Geben Sie die Ausgangsposition an. Das Quadrat wird angezeigt. (* Es ist so eingestellt, dass keine Bomben an der Ausgangsposition und auf angrenzenden Feldern platziert werden.)

  3. Geben Sie unten die offene Position an.

  4. Nach dem Löschen werden die Anzahl der offenen Zellen und die verstrichene Zeit angezeigt und der Vorgang endet. image.png

  5. Wenn eine nicht spezifizierte Eingabe empfangen wird, wird sie wie in der folgenden Abbildung gezeigt unendlich wiederholt. image.png

Hamari Punkt

Erzeugung eines zweidimensionalen Arrays

Beachten Sie, dass beim Aktualisieren einer Liste im folgenden Code alle Listen aktualisiert werden, wenn Sie das zum Zeitpunkt der Implementierung erforderliche zweidimensionale Array generieren.

Fehlerbeispiel


    #Eine zweidimensionale Anordnung, die die Position der Bombe und die Anzahl der umgebenden Bomben enthält
    mine_list = [["N"] * args.n]

    #Ein zweidimensionales Array, das angibt, ob eine Zelle geöffnet wurde
    opened_ls = [[False] * args.n]

Wie unten gezeigt, habe ich es mit der Listeneinschlussnotation initialisiert und nichts bekommen.

Erfolgsgeschichte


    #Eine zweidimensionale Anordnung, die die Position der Bombe und die Anzahl der umgebenden Bomben enthält
    mine_list = [["N"] * args.n for i in range(args.n)]

    #Ein zweidimensionales Array, das angibt, ob eine Zelle geöffnet wurde
    opened_ls = [[False] * args.n for i in range(args.n)]

Impressionen

Es ist ein einfaches Spiel, aber es kann nicht implementiert werden, ohne die Grundlagen des Programms zu verstehen. Daher war es eine gute Gelegenheit, die Grundlagen zu überprüfen.

Probleme und Verbesserungspunkte

Code Der vollständige Code ist unten. Es wurde auch auf [Github] veröffentlicht (https://github.com/hirogithu/minsweeper_on_terminal).


import argparse
import random
import copy
import itertools
import time

def main(args):
    def chk():
        if args.n > 99:
            args.n = 99
        if args.bomb_rate >= 1 or args.bomb_rate <= 0:
            args.bomb_rate = 0.5
        return args

    def create_mine_map(init_w, init_h):
        def num_bomb(mine_list, iw, ih):
            num_bomb = 0
            for i in range(-1, 2):
                for j in range(-1, 2):
                    if iw+i < 0 or iw+i >= args.n or ih+j < 0 or ih+j >= args.n:
                        continue
                    elif mine_list[iw+i][ih+j] == "B":
                        num_bomb += 1
            return num_bomb

        mine_list = [["N"] * args.n for i in range(args.n)]
        # add bomb
        n_bomb = int((args.n ** 2) * args.bomb_rate)
        bomb_count = 0
        for bomb_w in range(args.n):
            for bomb_h in range(args.n):
                #Bombeninstallation
                if bomb_count >= n_bomb:
                    break
                if random.randint(0, 100) > 100 * (1 - args.bomb_rate):
                    #Schließt die anfängliche Eingabeposition und Umgebung aus
                    if bomb_w != init_w and bomb_h != init_h and \
                        bomb_w != init_w - 1 and bomb_h != init_h - 1 and \
                            bomb_w != init_w + 1 and bomb_h != init_h + 1:
                                mine_list[bomb_w][bomb_h] = "B"
                                bomb_count += 1

        # increment around bomb
        for i in range(args.n):
            for j in range(args.n):
                if mine_list[i][j] == "N":
                    mine_list[i][j] = num_bomb(mine_list, i, j)
        return mine_list, bomb_count

    def open_map(mine_list, open_w, open_h, opened_ls):
        if mine_list[open_w][open_h] == "B":
            opened_ls = [[True] * args.n for i in range(args.n)]
            return opened_ls

        opened_ls[open_w][open_h] = True

        if mine_list[open_w][open_h] == 0:
            for i in range(-1, 2):
                for j in range(-1, 2):
                    if open_w + i < 0 or open_w + i >= args.n or open_h + j < 0 or open_h + j >= args.n:
                        continue
                    elif not opened_ls[open_w + i][open_h + j]:
                        opened_ls = open_map(mine_list, open_w + i, open_h + j, opened_ls)
        return opened_ls

    def plt_mine(mine_list, opened_ls, play_mode=True):
        h = args.n
        mine_list_cp = copy.deepcopy(mine_list)
        print(*["="]*(args.n+2))
        if play_mode:
            for i in range(h):
                for j in range(h):
                    if not opened_ls[i][j]:
                        mine_list_cp[i][j] = "-"
            print("PLOT MAP")
        else:
            print("PLOT MAP (All Opened)")

        print(" ", " ", *list(range(0, args.n)))
        print(*["="]*(args.n + 2))

        for i in range(h):
            print(i, ":", *mine_list_cp[:][i])

    "chk args"
    args = chk()

    "while wait input(w, h)"
    while True:
        try:
            init_w, init_h = map(int, input("input w h ({} ~ {}) >> ".format(0, args.n - 1)).split())        

            if init_w >= 0 and init_w < args.n and init_h >= 0 and init_h < args.n:
                break
            else:
                print("Over" + str(args.n))

        except ValueError:
            print("input 2 numbers. 0 0")

    "create mine"
    opened_ls = [[False] * args.n for i in range(args.n)]
    mine_list, n_bomb = create_mine_map(init_w, init_h)
    opened_ls = open_map(mine_list, init_w, init_h, opened_ls)

    "plot mine"
    plt_mine(mine_list, opened_ls, play_mode=args.debug)

    "while wait input(w, h)"
    init_time = time.time()
    init_opend_num = sum(list(itertools.chain.from_iterable(opened_ls)))

    while True:

        if all(list(itertools.chain.from_iterable(opened_ls))):
            print("!!!!!!!!BOMBED!!!!!!!!")
            break

        elif sum(list(itertools.chain.from_iterable(opened_ls))) == args.n**2 - n_bomb:
            end_time = time.time()
            print("!!!!!!!!CLEARD!!!!!!!!")
            print("YOUR TIME:{:0=3.2f}".format(end_time - init_time))
            print("OPEND:{}".format(args.n**2 - init_opend_num - n_bomb))
            break

        try:
            open_w, open_h = map(int, input("input w h ({} ~ {}) >> ".format(0, args.n - 1)).split())
    
            if open_w >= 0 and open_w < args.n and open_h >= 0 and open_h < args.n:
                "update mine"
                opened_ls = open_map(mine_list, open_w, open_h, opened_ls)

                "plot mine"
                plt_mine(mine_list, opened_ls, play_mode=args.debug)

            else:
                print("Over " + str(args.n))

        except ValueError:
            print("input 2 numbers. 0 0")

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-n", type=int, default=8, help="create (n, n) size")
    parser.add_argument("-b", "--bomb_rate", type=float, default=0.1, help="how many bomb in the mine.")
    parser.add_argument("-d", "--debug", action="store_false")
    args = parser.parse_args()
    main(args)

Referenz

[Mine Sweeper-Implementierung, die auf dem Terminal abgespielt werden kann](https://qiita.com/ta-ka/items/40b56722da43d1ba2e26#open%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89 % E3% 81% AE% E5% 86% 8D% E5% B8% B0])

Recommended Posts

Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
Ich habe versucht, PLSA in Python 2 zu implementieren
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe versucht, PPO in Python zu implementieren
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, alle Bemerkungen von Slack mit Wordcloud (Python) zusammenzufassen.
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, TOPIC MODEL in Python zu implementieren
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, eine selektive Sortierung in Python zu implementieren
Ich habe fp-Wachstum mit Python versucht
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
Ich habe versucht, PCANet zu implementieren
Ich habe es mit den Top 100 PyPI-Paketen versucht.> Ich habe versucht, die auf Python installierten Pakete grafisch darzustellen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, DCGAN mit PyTorch zu implementieren und zu lernen
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, Drakues Poker in Python zu implementieren
Ich habe versucht, GA (genetischer Algorithmus) in Python zu implementieren
Ich möchte Lambda mit Python auf Mac AWS!
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Ich habe versucht, SSD jetzt mit PyTorch zu implementieren (Dataset)
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich habe versucht, die Zusammenführungssortierung in Python mit möglichst wenigen Zeilen zu implementieren
Ich habe versucht, Deep VQE zu implementieren
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, eine kontroverse Validierung zu implementieren
Ich habe versucht, Realness GAN zu implementieren
Ich möchte mit Python debuggen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, mit Quantx eine Linie mit gleitendem Durchschnitt des Volumens zu implementieren
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe verschiedene Methoden ausprobiert, um japanische Post mit Python zu senden
Ich habe versucht, einen eindimensionalen Zellautomaten in Python zu implementieren
Ich habe versucht, mit Quantx einen Ausbruch (Typ der Täuschungsvermeidung) zu implementieren
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich habe versucht, Harry Potters Gruppierungshut mit CNN umzusetzen