[PYTHON] Ich habe versucht, den FloodFill-Algorithmus mit TRON BATTLE von CodinGame zu implementieren

\ # Dieser Artikel ist eine Fortsetzung von "CodinGame ist möglicherweise der richtige Weg, um gerne mit BOT (AI-Programm) zu kämpfen".

Ich habe das TRON BATTLE-Programm von CodinGame so geändert, dass es die folgende Debug-Ausgabe ausgeben kann.

P=0
Input{X0:2, Y0:2, X1:10, Y1:0}
+ + + + + + + + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

1. Die resultierende Quelle

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;

class Player
{
    static void Main(string[] args) {
        Player control = new Player();
        string[] numbers;
        Input[] inputs;
        // game loop
        while (true) {
            numbers = Console.ReadLine().Split(' ');
            int N = int.Parse(numbers[0]);
            int P = int.Parse(numbers[1]);
            Console.Error.WriteLine("P={0}", P);
            inputs = new Input[N];
            for (int i = 0; i < N; i++) {
                numbers = Console.ReadLine().Split(' ');
                int X0 = int.Parse(numbers[0]);
                int Y0 = int.Parse(numbers[1]);
                int X1 = int.Parse(numbers[2]);
                int Y1 = int.Parse(numbers[3]);
                inputs[i] = new Input(i, X0, Y0, X1, Y1);
            }
            Input me = inputs[P];
            string dir = control.HandleInputs(me, inputs);
            control.DumpMap();
            Console.WriteLine(dir);
        }
    }
    Cell[,] map = new Cell[30, 20];
    Queue<Cell> ffQueue = new Queue<Cell>();
    private Player() {
        for(int y=0; y<20; y++) {
            for(int x=0; x<30; x++) {
                map[x, y] = new Cell(x, y, -1);
            }
        }
    }
    private string HandleInputs(Input me, Input[] inputs) {
        Console.Error.WriteLine(me);
        foreach(var input in inputs) {
            if (input.X1 < 0) DeleteIdsFromMap(input.Id);
            else AddInputToMap(input);
        }
        ExecuteFloodfill(me);
        if (CanMoveTo(me, -1, 0)) return "LEFT";
        if (CanMoveTo(me, 1, 0)) return "RIGHT";
        if (CanMoveTo(me, 0, -1)) return "UP";
        if (CanMoveTo(me, 0, 1)) return "DOWN";
        return "?";
    }
    void AddInputToMap(Input input) {
        this.map[input.X1, input.Y1].V = input.Id;
    }
    void DeleteIdsFromMap(int id) {
        for(int y=0; y<20; y++) {
            for(int x=0; x<30; x++) {
                if (map[x, y].V == id) map[x, y].V = -1;
            }
        }
    }
    bool CanMoveTo(Input me, int xOffset, int yOffset) {
        int x = me.X1+xOffset;
        int y = me.Y1+yOffset;
        if (x < 0) return false;
        if (x > 29) return false;
        if (y < 0) return false;
        if (y > 19) return false;
        return map[x, y].V == -1 || map[x, y].V == 9;
    }
    bool IsEmptyCell(Cell center, int xOffset, int yOffset) {
        int x = center.X+xOffset;
        int y = center.Y+yOffset;
        if (x < 0) return false;
        if (x > 29) return false;
        if (y < 0) return false;
        if (y > 19) return false;
        return map[x, y].V == -1;
    }
    void DumpMap() {
        for(int y=0; y<20; y++) {
            for(int x=0; x<30; x++) {
                if (map[x, y].V == -1) Console.Error.Write("-");
                else if (map[x, y].V == 9) Console.Error.Write("+");
                else Console.Error.Write(map[x, y].V);
                Console.Error.Write(" ");
            }
            Console.Error.WriteLine();
        }
    }
    void ExecuteFloodfill(Input me) {
        for(int y=0; y<20; y++) {
            for(int x=0; x<30; x++) {
                if (map[x, y].V == 9) map[x, y].V = -1;
            }
        }
        Cell c = map[me.X1, me.Y1];
        if (IsEmptyCell(c, -1, 0)) ffQueue.Enqueue(map[c.X-1, c.Y]);
        if (IsEmptyCell(c, 1, 0)) ffQueue.Enqueue(map[c.X+1, c.Y]);
        if (IsEmptyCell(c, 0, -1)) ffQueue.Enqueue(map[c.X, c.Y-1]);
        if (IsEmptyCell(c, 0, 1)) ffQueue.Enqueue(map[c.X, c.Y+1]);
        FloodfillLoop();
    }
    void FloodfillLoop() {
        while(ffQueue.Count > 0) {
            Cell c = ffQueue.Dequeue();
            if(map[c.X, c.Y].V != -1) continue;
            c.V = 9;
            if (IsEmptyCell(c, -1, 0)) ffQueue.Enqueue(map[c.X-1, c.Y]);
            if (IsEmptyCell(c, 1, 0)) ffQueue.Enqueue(map[c.X+1, c.Y]);
            if (IsEmptyCell(c, 0, -1)) ffQueue.Enqueue(map[c.X, c.Y-1]);
            if (IsEmptyCell(c, 0, 1)) ffQueue.Enqueue(map[c.X, c.Y+1]);
        }
    }
}
class Input
{
    public int Id;
    public int X0;
    public int Y0;
    public int X1;
    public int Y1;
    public Input(int id, int x0, int y0, int x1, int y1) {
        this.Id = id;
        this.X0 = x0;
        this.Y0 = y0;
        this.X1 = x1;
        this.Y1 = y1;
    }
    public override string ToString() {
        return String.Format("Input{{X0:{0}, Y0:{1}, X1:{2}, Y1:{3}}}", X0, Y0, X1, Y1);
    }
}
class Cell
{
    public int X;
    public int Y;
    public int V;
    public Cell(int x, int y, int v) {
        this.X = x;
        this.Y = y;
        this.V = v;
    }
    public override string ToString() {
        return String.Format("Cell{{X:{0}, Y:{1}, V:{2}}}", X, Y, V);
    }
}

2. Schließlich

Dies könnte das Ende des Artikels sein, den ich über TRON BATTLE schreibe. Ich habe es in der Hoffnung gepostet, dass es als Referenz für diejenigen dient, die mit C # herausgefordert werden.

\ # Ich möchte aus der Wood 1 League raus ...

Recommended Posts

Ich habe versucht, den FloodFill-Algorithmus mit TRON BATTLE von CodinGame zu implementieren
Visualisieren Sie das Verhalten des Sortieralgorithmus mit matplotlib
Ich habe die Varianten von UKR gelesen und implementiert
Ich habe die Leistung von 1 Million Dokumenten mit mongoDB gemessen
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Heap Sort Edition)
Ich untersuchte den stärkenden Lernalgorithmus des Algorithmushandels
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe die grundlegende Grammatik von Python in Jupyter Lab geschrieben
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Bubble Sort)
Ich habe die Grundoperation von matplotlib in Jupyter Lab geschrieben
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Selective Sort)
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 2)
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Lösen des Labyrinths mit Python-Ergänzung zu Kapitel 6 der Algorithmus-Kurzreferenz-
Ich habe mit Kaggle Start Book basierend auf Kaggle studiert [Teil 1]
Ich habe die Grundoperation von Pandas im Jupyter Lab geschrieben (Teil 1)
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Ich habe versucht, den DNN-Teil von OpenPose mit Chainer-CPU auszuführen
Ich habe das Bild der Science University auf Twitter mit Word2Vec überprüft.
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe die grundlegende Operation von Pandas im Jupyter Lab geschrieben (Teil 2).
Ich habe versucht, Attention Seq2Seq mit PyTorch zu implementieren
Ich mochte den Tweet mit Python. ..
Implementierung der Dyxtra-Methode durch Python
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Battle Edition ~
Ich habe die numerische Berechnung von Python durch Rust ersetzt und die Geschwindigkeit verglichen
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe den Akkord des Songs mit word2vec vektorisiert und mit t-SNE visualisiert
Ich möchte meine Gefühle mit den Texten von Mr. Children ausdrücken
Ich habe versucht, die Bewegungen von Wiire-Playern automatisch mit Software zu extrahieren
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
Ich habe GAN mit Keras gemacht, also habe ich ein Video des Lernprozesses gemacht.
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich möchte das automatische Löschen des tmp-Bereichs in RHEL7 stoppen
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe einen Fehler beim Abrufen der Hierarchie mit MultiIndex von Pandas gemacht
Ich habe die Geschwindigkeit der Listeneinschlussnotation für und während mit Python2.7 gemessen.
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Ich habe den Inhalt des Docker-Volumes überprüft
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Ich habe versucht, Shake-Shake Regularization (ShakeNet) mit PyTorch zu implementieren
Richten Sie die Größe der Farbleiste an der Matplotlib aus
Ich habe die Optionen von copyMakeBorder von OpenCV überprüft
Algorithmus Gymnastik 24 Mitte der verknüpften Liste
Die Ordnerstruktur von Flask ist zusammengefasst
Überprüfen Sie die Existenz der Datei mit Python
[Scikit-learn] Ich habe mit der ROC-Kurve gespielt
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
Ich kannte die Grundlagen von Python nicht
Die dritte Nacht der Runde mit für