[JAVA] Quatre rangées avec gravité pouvant être jouées sur la console

introduction

Cette fois, j'ai joué avec gravité sur la console! Cela fonctionne comme ça. connect.gif

Puisque je l'ai fait pour le plaisir, il peut y avoir des omissions dans la partie du jugement, mais à l'avenir, je vais apporter des améliorations telles que l'ajout de batailles de CPU basées sur cela. À propos de l'arrangement à quatre yeux avec gravité

wiki https://ja.wikipedia.org/wiki/%E5%9B%9B%E7%9B%AE%E4%B8%A6%E3%81%B9

environnement d'utilisation

· Windows 7 · Java 8 · Éclipse

Introduction de la source

Je vais vous présenter la source de cette époque.

ConnectFour.java


package connect.main;

import java.util.Random;
import java.util.Scanner;

public class ConnectFour {

	public static void main(String[] args) {

		System.out.println("Commencez à organiser quatre yeux avec gravité");

		// 0:player1 1:player2
		int player = 0;
		Random random = new Random();
		int turn = 0;
		int[][] bord = new int[6][7];
		int i;

		//Initialisation de la carte(-1)
		for(i = 0; i < 6; i++) {
			for(int j = 0; j < 7; j++) {
				bord[i][j] = -1;
			}
		}

		// 0 || 1
		player = random.nextInt(2);


		Scanner scan = new Scanner(System.in);
		scan.useDelimiter(System.lineSeparator());
		while(true) {
			System.out.println();
			printPlayer(player);

			//Sortie de la carte vers la console
			printBord(bord);

			//Dessiner quand le plateau est plein
			if(turn >= 42) {
				System.out.println("dessiner");
				break;
			}

			//Saisie et validation depuis la console
			System.out.println("nombre(0~6)Entrez s'il vous plait.");
			String line = scan.next();
			if(line.trim().length() == 0 || line.trim().length() > 1) {
				System.out.println("L'entrée n'est pas valide.");
				continue;
			}
			if(!Character.isDigit(line.charAt(0))) {
				System.out.println("L'entrée n'est pas valide.");
				continue;
			}
			int num = Integer.parseInt(line);
			if(num < 0 || num > 6) {
				System.out.println("L'entrée n'est pas valide.");
				continue;
			}
			for(i = 0; i < 6; i++) {
				if(bord[i][num] == -1) {
					bord[i][num] = player;
					break;
				}
			}
			if(i >= 6) {
				System.out.println("[ " + num + "]Je ne peux plus en mettre.");
				continue;
			}
			if(isWin(bord, i , num, player)) {
				System.out.println();
				printBord(bord);
				System.out.println((player == 0 ? "player1[○]":"player2[×]")+"Victoires!!");
				break;
			}
			player = (player * -1) + 1;
			turn++;
		}
		scan.close();

		System.out.println("Fin");

	}

	public static void printPlayer(int player) {
		switch(player){
		case 0:
			System.out.println("player1[○]C'est ton tour.");
			break;
		case 1:
			System.out.println("player2[×]C'est ton tour.");
			break;
		default:
			System.out.println("Erreur");
			return;
		}
	}

	public static void printBord(int[][] bord) {
		for(int j = 0; j < 7; j++) {

			if(j == 6) {
				System.out.println("[ " + j + "]");
			}else {
				System.out.print("[ " + j + "]");
			}
		}
		for(int i = 5; i >= 0; i--) {
			for(int j = 0; j < 7; j++) {
				String a = "";
				a = (bord[i][j] == 0) ? "[○]" : (bord[i][j] == 1) ? "[×]" : "[  ]";
				if(j == 6) {
					System.out.println(a);
				}else {
					System.out.print(a);
				}
			}
		}
	}

	public static boolean isWin(int[][] bord, int i, int j, int player) {
		int yoko = 1;// -
		int tate = 1;// |
		int sura = 1;// /
		int back = 1;// \
		int y = i;
		int x = j;

		//Contrôle latéral(droite)
		while(x < 6) {
			if(bord[i][x+1] == player) {
				yoko++;
			}else {
				break;
			}
			x++;
		}
		x = j;
		//Contrôle latéral(la gauche)
		while(x > 0) {
			if(bord[i][x-1] == player) {
				yoko++;
			}else {
				break;
			}
			x--;
		}
		if(yoko >= 4) {
			return true;
		}

		//Contrôle vertical(Vers le haut)
		while(y < 5) {
			if(bord[y+1][j] == player) {
				tate++;
			}else {
				break;
			}
			y++;
		}
		y = i;
		//Contrôle vertical(en dessous de)
		while(y > 0) {
			if(bord[y-1][j] == player) {
				tate++;
			}else {
				break;
			}
			y--;
		}
		if(tate >= 4) {
			return true;
		}
		y = i;
		x = j;
		// /Vérification de la direction(Vers le haut)
		while(y < 5 && x < 6) {
			if(bord[y+1][x+1] == player) {
				sura++;
			}else {
				break;
			}
			y++;
			x++;
		}
		y = i;
		x = j;
		// /Vérification de la direction(en dessous de)
		while(y > 0 && x > 0) {
			if(bord[y-1][x-1] == player) {
				sura++;
			}else {
				break;
			}
			y--;
			x--;
		}
		if(sura >= 4) {
			return true;
		}
		y = i;
		x = j;
		// \Vérification de la direction(Vers le haut)
		while(y < 5 && x > 0) {
			if(bord[y+1][x-1] == player) {
				back++;
			}else {
				break;
			}
			y++;
			x--;
		}
		y = i;
		x = j;
		// \Vérification de la direction(en dessous de)
		while(y > 0 && x < 6) {
			if(bord[y-1][x+1] == player) {
				back++;
			}else {
				break;
			}
			y--;
			x++;
		}
		if(back >= 4) {
			return true;
		}

		return false;
	}
}

C'est tout pour la source! Pour expliquer brièvement le flux global,

  1. Décidez au hasard le premier joueur avec impair et pair (0 ou 1) pour les joueurs 1 et 2.
  2. Initialisez la carte avec -1.
  3. Affichez l'ordre affiché et affichez le tableau.
  4. Obtenez le numéro de la console où placer le cadre.
  5. Contrôle d'entrée.
  6. S'il y a de l'espace sur le plateau, placez-le sur le plateau.
  7. À partir de la position où la pièce est installée, faites un jugement de victoire par léchage vertical et horizontal, et si les conditions sont remplies, il se termine.
  8. Changez de joueur et augmentez le tour. Boucle à partir de 9,3

À propos du jugement de victoire

Jugez dans le sens haut / bas / gauche / droite, barre oblique et barre oblique arrière à partir de la pièce que vous avez placée.

tate = 1; yoko = 1; sura = 1; back = 1;

Boucle pour chacune des conditions suivantes

① Si la direction est la pièce du joueur vue de la position actuelle tate++; Boucle en décalant la position actuelle dans la direction ↑ S'ils sont différents, ils ne seront pas continus, donc la boucle se termine

② Si la direction est la pièce du joueur vue de la position actuelle tate++; Boucle en décalant la position actuelle dans la direction ↓ S'ils sont différents, ils ne seront pas continus, donc la boucle se termine

Les résultats de ① et ② sont tate = Nombre de pièces continues dans le sens ↑ + Nombre de pièces continues dans le sens ↓ + 1 (valeur initiale); Sera le même que.

Lorsqu'il est appliqué dans la direction ← → ↙↗↖↘ de la même manière que ① et ② yoko = ← + → + 1; sura = ↙ + ↗ + 1; back = ↖ + ↘ + 1; Est obtenu.

Si l'un d'entre eux remplit la condition> = 4, le joueur actuel gagne

Le point à noter est de définir chaque variable sur la valeur initiale 1 et de voir la cellule suivante à partir de la position actuelle sous la condition de boucle. Si vous jugez par la position actuelle, les points de référence se chevaucheront. (Si la valeur initiale est 0 et la valeur finale -1, il n'y a pas de problème avec le point de référence.) Exemple: Regardons [3] [3] comme point de référence (Jugement à la hausse) Incrément parce que la position actuelle [3] [3] est le joueur Déplacer vers le haut et position actuelle [4] [3] ... (Jugement à la baisse) Incrément parce que la position actuelle [3] [3] est le joueur Déplacer vers le bas et position actuelle [2] [3] ...

Il sera couvert à la position actuelle [3] [3].

Résumé

Vous devriez pouvoir jouer immédiatement si vous copiez et collez! Il y a eu une vague de petit boom depuis que j'ai joué avec la ligne à quatre yeux avec gravité quand j'étais étudiant (rires) S'il vous plaît jouer en tuant le temps!

Recommended Posts

Quatre rangées avec gravité pouvant être jouées sur la console
Base de données Firebase-Realtime sur Android pouvant être utilisée avec copie
Définissez la charge d'accès qui peut être modifiée graphiquement avec JMeter (partie 2)
[Rails] "Pry-rails" qui peuvent être utilisés lors de l'enregistrement avec la méthode create
Organiser les méthodes qui peuvent être utilisées avec StringUtils
À propos du problème que hidden_field peut être utilisé de manière insensée
Ruby on Rails 5 guide pratique d'apprentissage rapide qui peut être utilisé sur le terrain Résumé
Créer un contrôle de page qui peut être utilisé avec RecyclerView
Un grattage de la météo passée que l'on peut voir sur le site de l'Agence météorologique
[Java] J'ai essayé de créer un jeu Janken que les débutants peuvent exécuter sur la console
Apprendre Ruby avec la sélection des débutants AtCoder [Quelques sommes] Augmentez les méthodes qui peuvent être utilisées
Outil d'analyse statique pouvant être utilisé avec GitHub [version Java]
Logique pour dessiner un cercle sur la console avec l'art ASCII
SwiftUI View qui peut être utilisé en combinaison avec d'autres frameworks
Résumé des JDK pouvant être installés avec Homebrew (à partir de novembre 2019)
Programmation avec ruby (en route)
Essayez le moteur JavaScript léger «QuickJS» qui peut être intégré dans C / C ++
Outils d'analyse des performances et de diagnostic des pannes utilisables avec OpenJDK
Méthodes de tableau Ruby pouvant être utilisées avec Rails (autres que chacun)
[Affichage message ERREUR] Version simple utilisable à tout moment avec le gabarit partiel des rails
Jusqu'à ce que le rubis puisse être utilisé dans les fenêtres ...
Orienté objet qui peut être compris par les fées
Vérifiez avec Java / Kotlin que les fichiers ne peuvent pas être écrits en UAC sous Windows
Essayez d'enregistrer les données pouvant être lues par JavaFX au format PNG
Représentez graphiquement les informations du capteur de Raspberry Pi et préparez un environnement qui peut être vérifié avec un navigateur Web