L'histoire de la fabrication d'un Othello ordinaire à Java

introduction

salut! C'est une affaire privée, mais j'ai déménagé à Tokyo à partir d'avril et suis devenu un nouveau membre de la société. Nous sommes actuellement en cours de formation. (La formation dure 3 mois.) Lors de la formation, tous les ingénieurs sont censés apprendre Java. La pensée orientée objet est importante dans tout langage de programmation, Java est un langage conçu avec l'orientation objet à l'esprit, et je pense que c'est un bon langage à apprendre en premier. Il fonctionne également de la même manière sur Mac, Windows et Linux, de sorte qu'il peut être largement utilisé sans dépendre de l'ordinateur. Bien que j'aie étudié les tableaux, pour les boucles, les méthodes et l'orientation des objets, N'est-il pas difficile pour beaucoup de gens de se faire une idée de la manière dont ils fonctionnent réellement ensemble sur les logiciels? Par conséquent, cette fois, je voudrais créer une application Othello qui s'exécute sur CLI et mettre les connaissances acquises en pratique. Je pense que la manière la plus efficace d'étudier la programmation est de «créer et publier une application avec votre propre pouvoir». Maintenant, entrons dans le sujet principal!

Hello, Othello Avez-vous déjà fait Othello? Il y a des cadres blancs et noirs, et lorsque vous prenez en sandwich le cadre de l'adversaire, il change à la couleur de votre propre cadre. En fin de compte, celui avec le plus de pièces de votre propre couleur l'emporte. N'est-il pas approprié de diviser les classes comme suit lors de la création d'une application Othello? Une classe de cadre qui contient l'état du blanc ou du noir, la position du cadre, etc. Classe de terrain qui juge le retournement d'un cadre Classe de jeu qui contrôle l'ensemble du jeu Afin d'avoir une idée de l'ambiance, plaçons d'abord un cadre sur le plateau et affichons-le!

Créer une classe de cadres

Les informations sur chaque image d'Othello sont traitées dans la classe frame. L'état du cadre (blanc, noir, vide) est géré par la variable d'état de type String. Ici, le noir est B, le blanc est W et le ciel est E. Implémentez la méthode setState () pour changer l'état et la méthode getPosition () pour obtenir la position.

Koma.java


public class Koma{
	private String state; //La couleur d'Othello est noir ... B, blanc ... W, ciel ... 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;
	}
}

Créer une classe de champ

Dans la classe de terrain, vous pouvez placer des pièces sur le plateau et les retourner. La méthode prepare () qui initialise toutes les trames de la carte dans l'état E, Implémentez la méthode feature () qui visualise la situation sur la carte et la renvoie sur la ligne de commande.

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");
    }
  }
}

Créer une classe de jeu

Appelez la classe de champ et essayez de mettre un cadre noir à la position x = 2, y = 2.

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

Courir

$ javac Game.java
$ java Game

Compilez et exécutez un programme Java.

La position de x = 2, y = 2 est B et les autres endroits sont E!

Jugement à retourner

Ensuite, nous ajouterons un processus pour retourner le cadre de l'adversaire lors du placement du cadre. Imaginons Othello concrètement. (En supposant une situation simple de 4✕4 pour l'explication)

Dans la situation illustrée sur la figure, que se passe-t-il si vous placez un cadre blanc sur B-1? C'est si facile! Tous les cadres noirs entre les deux sont basculés vers des cadres blancs. Les cadres noirs sur B-2 et B-3 se transforment en cadres blancs.

Mais qu'en est-il de cette affaire? Il y a beaucoup d'endroits à inverser cette fois! Grâce au cadre blanc en D-1, le cadre noir en C-1 est inversé. Grâce au cadre blanc sur D-3, le cadre noir sur C-2 est inversé. Grâce aux cadres blancs en B-4, les cadres noirs en B-2 et B-3 sont inversés.

Maintenant, mettons cela dans l'algorithme. Cela semble un peu compliqué. Comme vous pouvez le voir dans les deux exemples ci-dessus, il existe des règles communes pour retourner des pièces. Autrement dit, dans une certaine direction, le cadre blanc et le cadre blanc prennent en sandwich le cadre noir. Il y a huit directions (nord, nord-est, est, sud-est, sud, sud-ouest, ouest, nord-ouest) sur la carte, donc le traitement du jugement doit être effectué pour toutes les directions. Le fait que le cadre blanc et le cadre blanc prennent en sandwich le cadre noir est un peu bâclé. Si vous mâchez un peu plus pour que cela puisse être décrit dans le déroulement du programme, ce sera comme suit. Si le cadre que vous prévoyez de placer est un cadre blanc

  1. Acquérir des cadres dans l'ordre de près dans une certaine direction.
  2. Obtenez l'index du cadre blanc le plus proche.
  3. Vrai si les cadres noirs continuent jusqu'à cet index sans interruption, faux sinon

Considérons l'exemple précédent. Si vous obtenez la liste de cadres dans 8 directions (nord, nord-est, est, sud-est, sud, sud-ouest, ouest, nord-ouest) à partir de la position de B-1, ce sera comme suit.

direction Liste des cadres
Nord -
Nord-est -
est noir-blanc
Sud-est noir-blanc
Sud noir-noir-blanc
Sud-ouest noir
Ouest blanc
Nord Ouest -

La couleur du cadre à placer ensuite étant le blanc, le retournement se produira dans les trois directions est, sud-est et sud.

Faire un CPU

Ce serait intéressant si nous pouvions faire de la communication réseau et jouer contre des amis, Cela semble être un peu élevé, alors jouons contre le CPU cette fois. Créer un processeur puissant est un peu difficile, mais un processeur faible peut le faire tout de suite. Un processeur faible peut être implémenté comme suit.

  1. Obtenez une liste des endroits où vous pouvez placer des cadres.
  2. Sélectionnez-en un au hasard.

C'est tout.

Othello a une règle selon laquelle il ne doit être placé que là où le retournement se produit (certainement) Par exemple, si le prochain cadre à placer est blanc dans la situation illustrée dans l'image ci-dessous, Il y a quatre endroits qui peuvent être placés en orange (A-3, B-4, C-1, D-2). Sélectionnez au hasard un de ces quatre endroits et placez-y le cadre Disons que "le CPU a placé un cadre".

en conclusion

Jusqu'à présent, j'ai expliqué le programme Othello. Je pense qu'il est important d'écrire un programme tout en ressentant la valeur de l'orientation objet! Cette fois

Le code est facile à lire pour les humains en le divisant en trois parties. Et s'il n'y a pas d'orientation d'objet et que ceux-ci sont procéduraux? Je pense que c'est très, très difficile. L'important est de penser par vous-même, de concevoir et de coder la classe. Bien sûr, ça peut être Othello, ça ne doit pas être Othello, ça peut être Blackjack, ça peut être un serveur Web, donc quand vous apprenez un langage de programmation, vous avez l'expérience de créer quelque chose à partir de zéro. Regardons!

Recommended Posts

L'histoire de la fabrication d'un Othello ordinaire à Java
L'histoire de l'écriture de Java dans Emacs
L'histoire de la comparaison de chaînes de bas niveau en Java
L'histoire de l'apprentissage de Java dans la première programmation
L'histoire de la création de DTO, semblable à Dao avec Java, SQLite
[Édition Java] Histoire de la sérialisation
Obtenez le résultat de POST en Java
L'histoire de la création d'un jeu d'Othello de type communication avec Scala.
[Java] Gestion des Java Beans dans la chaîne de méthodes
À propos de l'idée des classes anonymes en Java
Une histoire sur le JDK à l'ère de Java 11
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
L'histoire de la création d'un lanceur de jeu avec une fonction de chargement automatique [Java]
Une histoire sur la compatibilité d'un Dockerfile existant avec le GPU
Mesurer la taille d'un dossier avec Java
Ressentez le passage du temps même à Java
L'histoire de l'acquisition de Java Silver en deux mois de totalement inexpérimenté.
Importer des fichiers de la même hiérarchie en Java
Obtenez l'URL de la destination de la redirection HTTP en Java
L'histoire de la création d'un proxy inverse avec ProxyServlet
L'histoire d'une exception d'état illégale dans Jetty.
[Java] Récupère le fichier dans le fichier jar quel que soit l'environnement
Modifier la qualité de stockage des images JPEG en Java
L'histoire de la création de Dr.Orchid avec LINE BOT
Récapitulez les éléments supplémentaires de la classe Optional dans Java 9
L'histoire que .java est également construite dans Unity 2018
Implémentation Java de tri-tree
A été effectué dans l'année de base de la semaine calendaire Java
Histoire de créer une application de gestion de tâches avec Swing, Java
Une explication rapide des cinq types de statique Java
20190803_Java & k8s sur Azure L'histoire d'aller au festival
L'histoire du lancement de données BLOB depuis EXCEL dans DBUnit
Comptez le nombre de chiffres après la virgule décimale en Java
Comment dériver le dernier jour du mois en Java
L'histoire de la transmission de Java à Heroku à l'aide du pipeline BitBucket
[Java] Supprimer les éléments de la liste
Devinez le code de caractère en Java
Spécifiez l'emplacement Java dans eclipse.ini
Histoire du passage de Java Gold SE8
Décompressez le fichier zip en Java
L'histoire de @ViewScoped dévore la mémoire
Liste des membres ajoutés dans Java 9
Analyser l'analyse syntaxique de l'API COTOHA en Java
Liste des types ajoutés dans Java 9
Ordre de traitement dans le programme
L'origine des expressions Java lambda
Implémentation d'une fonction similaire en Java
Appelez la super méthode en Java
Examiner les informations système de l'environnement d'exploitation AWS Lambda en Java
[Java] Obtenez les dates des derniers lundi et dimanche dans l'ordre
L'histoire de ne pas connaître le comportement de String en passant par Java
Sortie de la différence entre chaque champ de deux objets en Java
Examiner la liste des polices disponibles dans AWS Lambda + Java
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
Examinez la liste des ID de fuseau horaire disponibles dans la classe Java ZoneId
Obtenez l'URL publique du fichier privé de Flickr en Java
Créons une application TODO en Java 5 Changer l'affichage de TODO
Comment obtenir la longueur d'un fichier audio avec Java