Die Geschichte eines gewöhnlichen Othello in Java

Einführung

Hallo! Es ist eine Privatsache, aber ich bin ab April nach Tokio gezogen und ein neues Mitglied der Gesellschaft geworden. Wir sind gerade mitten im Training. (Das Training dauert 3 Monate.) In der Schulung sollen alle Ingenieure Java lernen. Objektorientiertes Denken ist in jeder Programmiersprache wichtig. Java ist eine Sprache, die mit Blick auf die Objektorientierung entwickelt wurde, und ich denke, es ist eine gute Sprache, die man zuerst lernen muss. Auf die gleiche Weise funktioniert es auch unter Mac, Windows und Linux, sodass es ohne Abhängigkeit vom Computer weit verbreitet verwendet werden kann. Obwohl ich Arrays für Schleifen, Methoden und Objektorientierung studiert habe, Ist es für viele Menschen nicht schwierig, eine Vorstellung davon zu bekommen, wie diese tatsächlich bei Software zusammenarbeiten? Daher möchte ich dieses Mal eine Othello-Anwendung erstellen, die auf CLI ausgeführt wird, und das erlernte Wissen in die Praxis umsetzen. Ich denke, der effizienteste Weg, Programmieren zu studieren, besteht darin, "eine Anwendung mit Ihrer eigenen Kraft zu erstellen und zu veröffentlichen". Kommen wir nun zum Hauptthema!

Hello, Othello Hast du jemals Othello gemacht? Es gibt weiße und schwarze Rahmen, und wenn Sie den Rahmen des Gegners einklemmen, ändert sich die Farbe Ihres eigenen Rahmens. Letztendlich gewinnt derjenige mit den meisten Stücken Ihrer eigenen Farbe. Ist es nicht angebracht, die Klassen beim Erstellen einer Othello-Anwendung wie folgt zu unterteilen? Eine Rahmenklasse, die den Status Weiß oder Schwarz, die Position des Rahmens usw. enthält. Feldklasse, die das Umdrehen eines Rahmens beurteilt Spielklasse, die das gesamte Spiel steuert Um ein Gefühl für die Atmosphäre zu bekommen, platzieren wir zuerst einen Rahmen auf der Tafel und zeigen ihn an!

Erstellen Sie eine Rahmenklasse

Informationen zu jedem Frame von Othello werden in der Frame-Klasse verarbeitet. Der Status des Frames (weiß, schwarz, leer) wird von der Statusvariablen vom Typ String verwaltet. Hier ist Schwarz B, Weiß ist W und Himmel ist E. Implementieren Sie die setState () -Methode, um den Status zu ändern, und die getPosition () -Methode, um die Position abzurufen.

Koma.java


public class Koma{
	private String state; //Die Farbe von Othello ist schwarz ... B, weiß ... W, Himmel ... E.
	private int x;
	private int y;

	public Koma(int x,int y){
		this.state = "E";
		this.x = x;
		this.y = y;
	}

	public String getState(){
		return this.state;
	}

	public void setState(String state){
		this.state = state;
	}

	public int[] getPosition(){
		int[]pos = {this.x, this.y};
		return pos;
	}
}

Feldklasse erstellen

In der Feldklasse können Sie Teile auf das Brett legen und umdrehen. Die prepare () -Methode, die alle Frames auf der Karte im Status E initialisiert, Implementieren Sie die feature () -Methode, die die Situation auf der Karte visualisiert und an die Befehlszeile ausgibt.

Field.java


import java.util.ArrayList;
import java.util.List;

public class Field{
  private List<Koma> komalist;
  private int ynum = 0;
  private int xnum = 0;

  public Field(int xnum, int ynum){
    this.xnum = xnum;
    this.ynum = ynum;
  }
  public void prepare(){
    this.komalist = new ArrayList<>();
    for(int y=0;y<this.ynum;y++){
      for(int x=0;x<this.xnum;x++){
        Koma koma = new Koma(x,y);
        this.komalist.add(koma);
      }
    }
  }

  public Koma getKoma(int y, int x){
    for(Koma koma : this.komalist){
      int[]pos = koma.getPosition();
      if(pos[0]==y && pos[1]==x){
        return koma;
      }
    }
    return null;
  }

  public void putKoma(int x, int y, String state){
    Koma koma = this.getKoma(x,y);
    koma.setState(state);
  }

  public void feature(){
    String [][] board = new String[ynum][xnum];
    for(Koma koma : this.komalist){
      int[] pos = koma.getPosition();
      String state = koma.getState();
      board[pos[1]][pos[0]] = state;
    }
    System.out.println("\n\t0\t1\t2\t3\t4\t5\n");
    for(int y=0;y<board.length;y++){
      System.out.print(y+"\t");
      for(int x=0;x<board[0].length;x++){
        String b = board[y][x];
        System.out.print(b+"\t");
      }
      System.out.println("\n");
    }
  }
}

Erstellen Sie eine Spielklasse

Rufen Sie die Feldklasse auf und versuchen Sie, einen schwarzen Rahmen an die Position von x = 2, y = 2 zu setzen.

Game.java



public class Game{
  public static void main(String[] args){
    Field field = new Field(6,6);
    field.prepare();
    field.putKoma(2,2,"B");
    field.feature();
  }
}

Lauf

$ javac Game.java
$ java Game

Kompilieren Sie ein Java-Programm und führen Sie es aus.

Die Position von x = 2, y = 2 ist B und die anderen Stellen sind E!

Urteil umzudrehen

Als nächstes fügen wir einen Prozess hinzu, um den Rahmen des Gegners beim Platzieren des Rahmens umzudrehen. Stellen wir uns Othello konkret vor. (Zur Erklärung wird eine einfache Situation von 4✕4 angenommen)

Was passiert in der in der Abbildung gezeigten Situation, wenn Sie B-1 mit einem weißen Rahmen versehen? So einfach ist das! Alle dazwischen liegenden schwarzen Rahmen werden in weiße Rahmen umgewandelt. Die schwarzen Rahmen auf B-2 und B-3 ändern sich in weiße Rahmen.

Aber was ist mit diesem Fall? Diesmal gibt es viele Orte, an denen man umkehren kann! Dank des weißen Rahmens in D-1 ist der schwarze Rahmen in C-1 invertiert. Dank des weißen Rahmens bei D-3 wird der schwarze Rahmen bei C-2 umgedreht. Dank der weißen Rahmen in B-4 sind die schwarzen Rahmen in B-2 und B-3 umgekehrt.

Lassen Sie uns dies nun in den Algorithmus einfügen. Es scheint ein wenig kompliziert. Wie Sie den beiden obigen Beispielen entnehmen können, gibt es allgemeine Regeln für das Umdrehen von Teilen. Das heißt, in einer bestimmten Richtung schließen der weiße Rahmen und der weiße Rahmen den schwarzen Rahmen ein. Es gibt acht Richtungen (Nord, Nordost, Ost, Südost, Süd, Südwest, West, Nordwest) auf der Tafel, daher muss die Beurteilungsverarbeitung für alle Richtungen durchgeführt werden. Die Tatsache, dass der weiße Rahmen und der weiße Rahmen den schwarzen Rahmen einschließen, ist etwas schlampig. Wenn Sie etwas mehr kauen, damit es im Programmablauf beschrieben werden kann, ist dies wie folgt. Wenn der Rahmen, den Sie platzieren möchten, ein weißer Rahmen ist

  1. Erfassen Sie Frames in der Reihenfolge von nah in eine bestimmte Richtung.
  2. Ermitteln Sie den Index des nächsten weißen Rahmens.
  3. True, wenn schwarze Frames ohne Unterbrechung zu diesem Index fortfahren, andernfalls false

Betrachten wir das vorherige Beispiel. Wenn Sie die Rahmenliste in 8 Richtungen (Nord, Nordost, Ost, Südost, Süd, Südwest, West, Nordwest) von der Position von B-1 erhalten, ist sie wie folgt.

Richtung Rahmenliste
Norden -
Nordost -
Osten schwarz-Weiß
Süd-Ost schwarz-Weiß
Süden schwarz-schwarz-Weiß
Südwesten schwarz
Westen Weiß
Nordwest -

Da die als nächstes zu platzierende Rahmenfarbe Weiß ist, erfolgt das Umdrehen in den drei Richtungen Ost, Südost und Süd.

Machen Sie eine CPU

Es wäre interessant, wenn wir Netzwerkkommunikation herstellen und gegen Freunde spielen könnten. Es scheint ein wenig hoch zu sein, also lasst uns diesmal gegen die CPU spielen. Das Erstellen einer starken CPU ist etwas schwierig, aber eine schwache CPU kann dies sofort tun. Eine schwache CPU kann wie folgt implementiert werden.

  1. Holen Sie sich eine Liste der Stellen, an denen Sie Frames platzieren können.
  2. Wählen Sie zufällig eine aus.

Das ist es.

Othello hat die Regel, dass es nur dort platziert werden sollte, wo es sich umdreht (sicherlich) Wenn beispielsweise der nächste zu platzierende Frame in der im Bild unten gezeigten Situation weiß ist, Es gibt vier Stellen, die in Orange platziert werden können (A-3, B-4, C-1, D-2). Wählen Sie zufällig eine dieser vier Stellen aus und platzieren Sie den Rahmen dort Angenommen, die CPU hat einen Frame platziert.

abschließend

Bisher habe ich das Othello-Programm erklärt. Ich denke, es ist wichtig, ein Programm zu schreiben und dabei den Wert der Objektorientierung zu spüren! Diesmal

Der Code ist für Menschen leicht zu lesen, indem er in drei Teile unterteilt wird. Was ist, wenn es keine Objektorientierung gibt und diese prozedural sind? Ich finde es sehr, sehr schwierig. Das Wichtigste ist, selbst zu denken, die Klasse zu entwerfen und zu codieren. Auf jeden Fall kann es Othello sein, es muss nicht Othello sein, es kann Blackjack sein, es kann ein Webserver sein. Wenn Sie also eine Programmiersprache lernen, haben Sie die Erfahrung, etwas von Grund auf neu zu erstellen. Schauen wir uns das an!

Recommended Posts

Die Geschichte eines gewöhnlichen Othello in Java
Die Geschichte des Schreibens von Java in Emacs
Die Geschichte des einfachen String-Vergleichs in Java
Die Geschichte des Lernens von Java in der ersten Programmierung
Die Geschichte von dto, dao-like mit Java, SQLite
[Java Edition] Geschichte der Serialisierung
Holen Sie sich das Ergebnis von POST in Java
Die Geschichte eines Othello-Spiels vom Kommunikationstyp mit Scala.
[Java] Behandlung von Java Beans in der Methodenkette
Über die Idee anonymer Klassen in Java
Eine Geschichte über das JDK in der Java 11-Ära
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Die Geschichte eines Game Launcher mit automatischer Ladefunktion [Java]
Eine Geschichte darüber, wie eine vorhandene Docker-Datei mit der GPU kompatibel gemacht werden kann
Messen Sie die Größe eines Ordners mit Java
Spüren Sie den Lauf der Zeit auch in Java
Die Geschichte des Erwerbs von Java Silver in zwei Monaten von völlig unerfahrenen.
Importieren Sie Dateien derselben Hierarchie in Java
Rufen Sie die URL des HTTP-Umleitungsziels in Java ab
Die Geschichte, einen Reverse-Proxy mit ProxyServlet zu erstellen
Die Geschichte einer illegalen staatlichen Ausnahme in Jetty.
[Java] Holen Sie sich die Datei unabhängig von der Umgebung in das JAR
Ändern Sie die Speicherqualität von JPEG-Bildern in Java
Die Geschichte, Dr. Orchid mit LINE BOT zu machen
Fassen Sie die zusätzlichen Elemente der optionalen Klasse in Java 9 zusammen
Die Geschichte, dass .java auch in Unity 2018 erstellt wurde
Java-Implementierung von Tri-Tree
Wurde im Basisjahr der Java-Kalenderwoche durchgeführt
Die Geschichte der Erstellung einer Task-Management-Anwendung mit Swing, Java
Eine kurze Erklärung der fünf Arten von Java Static
20190803_Java & k8s on Azure Die Geschichte vom Festivalbesuch
Die Geschichte des Werfens von BLOB-Daten von EXCEL in DBUnit
Zählen Sie die Anzahl der Stellen nach dem Dezimalpunkt in Java
So leiten Sie den letzten Tag des Monats in Java ab
Die Geschichte, Java mithilfe der BitBucket-Pipeline nach Heroku zu bringen
[Java] Löschen Sie die Elemente von List
Errate den Zeichencode in Java
Geben Sie den Java-Speicherort in eclipse.ini an
Die Geschichte von Java Gold SE8
Entpacken Sie die Zip-Datei in Java
Die Geschichte von @ViewScoped, die Speicher verschlingt
Liste der in Java 9 hinzugefügten Mitglieder
Analysieren der COTOHA-API-Syntaxanalyse in Java
Liste der in Java 9 hinzugefügten Typen
Reihenfolge der Verarbeitung im Programm
Der Ursprung von Java-Lambda-Ausdrücken
Implementierung einer ähnlichen Funktion in Java
Rufen Sie die Super-Methode in Java auf
Untersuchen Sie die Systeminformationen der AWS Lambda-Betriebsumgebung in Java
[Java] Ordnen Sie die Daten des vergangenen Montags und Sonntags der Reihe nach an
Die Geschichte, das Verhalten von String durch Passieren von Java nicht zu kennen
Geben Sie die Differenz zwischen jedem Feld zweier Objekte in Java aus
Untersuchen Sie die Liste der in AWS Lambda + Java verfügbaren Schriftarten
Eine Geschichte über das Erreichen der League Of Legends-API mit JAVA
Die in /lib/calendars.properties von Java jre festgelegte Millisekunde ist UTC
Untersuchen Sie die Liste der Zeitzonen-IDs, die in der Java ZoneId-Klasse verfügbar sind
Rufen Sie die öffentliche URL der privaten Datei von Flickr in Java ab
Lassen Sie uns eine TODO-App in Java 5 erstellen. Schalten Sie die Anzeige von TODO um
So ermitteln Sie die Länge einer Audiodatei mit Java