Проблемы с логикой и синтаксисом двумерного массива TicTacToe в Java - PullRequest
0 голосов
/ 06 февраля 2019

У меня проблемы с созданием программы TicTacToe для моего класса.Это доска 4х4.Мои переменные для моего метода условия выигрыша victoire () выдают мне ошибку.Код должен быть написан на французском языке для моих переменных, методов и т. Д. В соответствии с соглашением, из-за того, где я живу, извините заранее.

Ошибки:

Multiple markers at this line - colonne2 cannot be resolved to a variable - ligne2 cannot be resolved to a variable

Строки 156 и 162 соответственно

и предупреждения:

The value of the local variable colonne2 is not used

The value of the local variable ligne2 is not used

Строки 194 и 195 соответственно

Вот мой код:

package td;

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

public class Main {


    // Initialisation des variables
    public static String ligne, colonne;
    public static Scanner scan;
    public static char[][] tableau = new char[4][4];
    public static char tourJoueur = 'O';
    public static Random rand;
    public static int scoreJ1;
    public static int scoreJ2;
    public static String nomJoueur1;
    public static String nomJoueur2;

    public static void main(String[] args) {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                tableau[i][j] = ' ';
                // Introduction avant les jeux
                menuIntroduction();

                // Toutes les parties
                plusieursParties();

                // Message final
                menuFin();
            }
        }
    }

    private static void menuIntroduction() {
        printIntro();

        scoreJ1 = 0;
        scoreJ2 = 0;

        // Initialisation du Scanner
        scan = new Scanner(System.in);

        // Recuperation des noms des joueurs
        System.out.println("Joueur 1 rentrez votre nom");
        nomJoueur1 = scan.nextLine();

        System.out.println("Joueur 2 rentrez votre nom");
        nomJoueur2 = scan.nextLine();

        // Choix du premier joueur au hasard
        Random rand = new Random();
        if (rand.nextInt() % 2 == 0) {
            tourJoueur = 'O';
        } else {
            tourJoueur = 'X';

        }
    }

    private static void printIntro() {
        System.out.println("BIENVENU AU TIC TAC TOE!\n");
        System.out.println("Chaque joueur se fera assigner 'X' ou 'O'\n");
        System.out.println("Chaque joueur selectionnera une case dans le Tic Tac Toe.\n");
        System.out.println(
                "Il faudra selectionner une ligne (de 0-3) et peser sur ENTER. Il faudra ensuite selectionner une colonne et peser sur ENTER\n");
        System.out.println("Chaque joueur se fera assigner 'X' ou 'O', débutant par le joueur 1\n");
        System.out.println(
                "Pour gagner, il faudra compléter une ligne du tableau avec 'X' ou 'O', soit verticalement, soit horizontalement, soit diagonalement\n");
        System.out.println("Si le tableau est plein et qu'aucun joueur n'a fait de ligne, la partie sera nulle\n");
        System.out.println("Chaque partie gagnée donnera un point au joueur vainqueur\n");
        System.out.println("Bonne partie!");
        System.out.println();
        System.out.println("========================================================\n\n\n");

    }

    private static void menuFin() {
        System.out.println("=========================FIN DU JEU=========================\n\n\n");
        System.out.println("merci à " + nomJoueur1 + " et " + nomJoueur2 + " d'avoir joué ! ");

        // message de fin different selon le joueur gagnant ou s'il y a égalité
        if (scoreJ1 > scoreJ2) {
            System.out.println(nomJoueur1 + " l'emporte à " + scoreJ1 + " contre " + scoreJ2);
        } else if (scoreJ2 > scoreJ1) {
            System.out.println(nomJoueur2 + " l'emporte à " + scoreJ2 + " contre " + scoreJ1);

        } else {
            System.out.println("Égalité! " + scoreJ1 + " point(s) au total!");
        }
        System.out.println("\n\n\n\nÀ bientôt!");

    }

    private static void plusieursParties() {
        do {

            jouerUnePartie(tourJoueur);

        } while (onContinue());
    }

    private static boolean onContinue() {
        boolean inputContinue = false;
        boolean entreeIncorrecte = true;

        // tant que l'utilisateur ecrit n'importe quoi on lui redemande de faire un
        // choix
        do {
            System.out.println("les scores sont : ");
            System.out.println(nomJoueur1 + " : " + scoreJ1 + "  |||  " + nomJoueur2 + " : " + scoreJ2);
            System.out.println("voulez - vous continuer ? [Oui/Non]");

            String reponseUser = scan.nextLine();

            // cas un et deux reponse valide et transmise, cas trois le user dit n'importe
            // quoi
            if (reponseUser.equals("Oui")) {
                inputContinue = true;
                entreeIncorrecte = false;
            } else if (reponseUser.equals("Non")) {
                inputContinue = false;
                entreeIncorrecte = false;
            } else {
                System.out.println("Erreur, entrez 'Oui' ou 'Non'");
                entreeIncorrecte = true;
            }

        } while (entreeIncorrecte);

        // on renvoie la reponse de l'utilisateur lorsqu'elle est valide
        return inputContinue;
    }

    private static void jouerUnePartie(char tourJoueur1) {
        System.out.println("C'est au tour de " + nomJoueur1 + "!" + "Tu joues " + tourJoueur + "!\n");
        System.out.println("Entre une ligne et pèse sur ENTER");
        System.out.println("Entre une colonne et pèse sur ENTER");

        afficherTableau();

        // Verifie si l'utilisateur utilise un chiffre et non quelque chose d'autre pour
        // ligne et pour colonne
        boolean jouant = true;
        do {
            afficherTableau();
            verifierEntree();

        }while (jouant); {
            //Je ne comprends pas pourquoi il rale ici
                tableau[ligne2][colonne2] = tourJoueur;
                if (victoire(scoreJ1, scoreJ1) && !tableauPlein()) {
                    System.out.println("Felicitations! Le joueur " + tourJoueur + " gagne!");
                    jouant = false;
                }
            //Meme chose ici
                if (!victoire(ligne2, colonne2) && tableauPlein()) {
                    System.out.println("Partie nulle!");
                    jouant = false;
                } else {
                    jouant = true;
                }
                if (tourJoueur == 'O') {
                    tourJoueur = 'X';
                } else {
                    tourJoueur = 'O';
                }

        }
    }

    private static void verifierEntree() {
        boolean entreeIncorrecte = true;
        while (entreeIncorrecte) {

            ligne = scan.nextLine();
            colonne = scan.nextLine();

            if (ligne.equals("0") || ligne.equals("1") || ligne.equals("2") || ligne.equals("3")) {
                entreeIncorrecte = false;
            } else if (colonne.equals("0") || colonne.equals("1") || colonne.equals("2") || colonne.equals("3")) {
                entreeIncorrecte = false;
            } else {
                System.out.println("Mauvaise entree! Recommence! ");
                entreeIncorrecte = true;
            }
            if (!entreeIncorrecte) {
                //Comment colonne2 et ligne 2 ne sont pas utilisés?
                int colonne2 = Integer.parseInt(colonne);
                int ligne2 = Integer.parseInt(ligne);
            }
        }
    }

    private static boolean victoire(int ligne2, int colonne2) {

        // Verifie horizontalement la victoire

        if (tableau[0][colonne2] == tableau[1][colonne2] && tableau[0][colonne2] == tableau[2][colonne2]
                && tableau[0][colonne2] == tableau[3][colonne2])
            return true;

        // Verifie verticalement la victoire

        if (tableau[ligne2][0] == tableau[ligne2][1] && tableau[ligne2][0] == tableau[ligne2][2]
                && tableau[ligne2][0] == tableau[ligne2][3])
            return true;

        // Verifie diagonalement vers la droite la victoire

        if (tableau[0][0] == tableau[1][1] && tableau[0][0] == tableau[2][2] && tableau[0][0] == tableau[3][3]
                && tableau[1][1] != ' ')
            return true;

        // Verifie diagonalement vers la gauche la victoire

        if (tableau[0][3] == tableau[1][2] && tableau[0][3] == tableau[2][1] && tableau[0][3] == tableau[3][0]
                && tableau[1][2] != ' ')
            return true;
        if (tableauPlein())
            return true;
        return false;
    }

    private static boolean tableauPlein() {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if (tableau[i][j] == ' ') {
                    // Un tour peut etre fait, tableau non vide
                    return false;
                }
            }
        }
        return true;

    }

    private static void afficherTableau() {
        for (int i = 0; i < 4; i++) {
            System.out.println();
            for (int j = 0; j < 4; j++) {
                if (j == 0) {
                    System.out.print(" |");
                }
                System.out.print(tableau[i][j] + " |");
            }
        }
        System.out.println();
    }
}

1 Ответ

0 голосов
/ 06 февраля 2019

Предупреждения:

Для этого куска кода

if (!entreeIncorrecte) {
    //Comment colonne2 et ligne 2 ne sont pas utilisés?
    int colonne2 = Integer.parseInt(colonne);
    int ligne2 = Integer.parseInt(ligne);
}

Вы объявляете две новые переменные здесь, но не используете их.Это означает, что декларации практически бесполезны.Когда вы объявляете переменную и присваиваете ей значение, она длится до конца блока.В конце блока он разрушен.Вы больше не можете ссылаться на него.

Вот почему вы получаете предупреждение, потому что код не использует эти переменные.

Ошибки компилятора:

Глядя на вставленный вами код, мы имеем:

//Je ne comprends pas pourquoi il rale ici
tableau[ligne2][colonne2] = tourJoueur;

Код здесь вызывает ligne2 и colonne2 как переменные, однако вы никогда не объявляете их где-либо внутри метода jouerUnePartie, поэтому компилятор не может их найти и вывести ошибки.Чтобы исправить эти ошибки, вам необходимо объявить переменную (и назначить ее в случае таких примитивов, как int), прежде чем использовать их.

Исправить это - создать переменные и дать им значения доВы ссылаетесь на них.Делаете ли вы это в самом методе или делаете из них статическую глобальную переменную внутри Main, зависит от вас, но вы, вероятно, не хотите делать статическую глобальную переменную, если у вас нет веских причин (и если выВы сейчас спрашиваете себя: «У меня есть веская причина?»Лучший способ - либо вычислить их в функции, либо передать в метод в качестве аргументов.Это, конечно, зависит от того, что вы пытаетесь сделать.

...