0

I'm making a Tic Tac Toe program for class. I've constructed the table and everything in my program but I have a couple problems still. Here is my code in it's entirety.

import java.util.Scanner;

public class TicTacToe {

//These two variables are for placing the X's and O's in the TicTacToe table.
static int row;
static int col;

//This array is for the TicTacToe table.
static char[][] table = new char[3][3];

//This is for ending the while statement that controls the game
static boolean continuePlaying = true;
static boolean exitProgram = false;

//This is for returning true when the user inputs a valid combination of numbers
static boolean validMove = true;

//This is for returning false when the user inputs an invalid combination of numbers
static boolean invalidMove = false;

//These will store the names for player 1 and 2
static String p1;
static String p2;

//This variable will change every turn to either p1 or p2 depending on who's turn it is. (This is a bad idea at the moment)
static String activePlayer;

//This variable is to count the number of games played
static int gamesCounter = 0;

//These two variables are to keep track of the wins each player has
static int p1Wins = 0;
static int p2Wins = 0;

static void clearTable(){
    for(int i = 0; i < table.length; i++){
        table[i][i] = ' ';
    }
}

//This is my displayTable() method. This will show the table and the X's or O's each player has played
static void displayTable(){
    System.out.println("  0  1  2");
    System.out.println("0[" + table[0][0] +"][" + table[0][1] +"][" + table[0][2] +"]");
    System.out.println("1[" + table[1][0] +"][" + table[1][1] +"][" + table[1][2] +"]");
    System.out.println("2[" + table[2][0] +"][" + table[2][1] +"][" + table[2][2] +"]");
}

//This is my move(int row,int col) method. This will record the moves each player takes and insert X's or O's depending on which player
static boolean move(int row,int col) {
    //This if statement will return false if the user enters in coordinates outside the 3x3 zone.
    if (row > 2 || row < 0) {
        System.out.println("Invalid move."); return false; 
    }
    //This if statement checks if the array already has an X or O in the chosen space. If the array is already filled it will return false.
    else if (table[row][col] == 'X' || table[row][col] == 'O') {
        System.out.println("Not available."); return false;
    }
    else return true;
}

//This is my checkRow method. It checks for 3 X's or O's in a row. If there are 3 in a row it will return true, if not, it returns false.
static boolean checkRow(int row){
    if((table[row][0] & table[row][1] & table[row][2]) == 'X') return true;     
    if((table[row][0] & table[row][1] & table[row][2]) == 'O') return true;
    else return false;      
}

//This is my checkCol method. It checks for 3 X's or O's in a row. If there are 3 in a row it will return true, if not, it returns false.
static boolean checkCol(int col){
    if((table[0][col] & table[1][col] & table[2][col]) == 'X') return true;
    if((table[0][col] & table[1][col] & table[2][col]) == 'O') return true;
    else return false;
}

//This is my checkDiagonal method. It checks for 3 X's or O's in a row. If there are 3 in a row it will return true, if not, it returns false.
static boolean checkDiagonal(){
    if((table[0][0] & table[1][1] & table[2][2]) == 'X') return true;
    if((table[2][0] & table[1][1] & table[0][2]) == 'X') return true;
    if((table[0][0] & table[1][1] & table[2][2]) == 'O') return true;
    if((table[2][0] & table[1][1] & table[0][2]) == 'O') return true;
    else return false;      
}

//This is my checkWinner method. It runs all the other checks to see if anyone won.
//If there is a winner the method returns true. If there is no winner yet, the method returns false.
static boolean checkWinner(){
    if(checkRow(0) == true) return true;
    if(checkRow(1) == true) return true;
    if(checkRow(2) == true) return true;
    if(checkCol(0) == true) return true;
    if(checkCol(1) == true) return true;
    if(checkCol(2) == true) return true;
    if(checkDiagonal() == true) return true;
    else return false;
}

public static void main(String[] args) {
    //The Scanner for asking each player's names
    Scanner s = new Scanner(System.in);

    //The beginning structure of the TicTacToe program
    System.out.println("TicTextToe");
    System.out.print("Name of player 1: ");
    p1 = s.nextLine();

    //This line of code is just to check if it's taking Player 1's name correctly
    //System.out.println(p1);

    //Asks for Player 2's name
    System.out.print("Name of player 2: ");
    p2 = s.nextLine();

    //This line of code is just to check if it's taking Player 2's name correctly
    //System.out.println(p2);

    //Printing move(row, col) to see why it's printing unusually
    //System.out.print(move(row, col));


    //The TicTacToe table set up, coordinates provided around the squares
    //The displayTable() method will be used to display the table here.  There will be no X's or O's in the table this first time.
    while (continuePlaying == true) {
    displayTable();
    System.out.print("Player " + p1 + ":");
    row = s.nextInt();
    col = s.nextInt();
    move(row, col);

    //This will display the table again and ask for proper coordinates.
    while(move(row, col) == false) {
        displayTable();
        System.out.println("Player " + p1 + ":");
        row = s.nextInt();
        col = s.nextInt();
        move(row,col);
    }

    //This inputs the X into the table if move(row, col) returns true.
    if(move(row, col) == true) {
        table[row][col] = 'X';
    }   
    //This will check if p1 just won the game or if the game needs to continue
    checkRow(0);
    //System.out.println(checkRow(0)); //This prints out if row 0 is true or false
    checkRow(1);
    //System.out.println(checkRow(1)); //This prints out if row 1 is true or false
    checkRow(2);
    //System.out.println(checkRow(2)); //This prints out if row 2 is true or false
    checkCol(0);
    //System.out.println(checkCol(0)); //This prints out if column 0 is true or false
    checkCol(1);
    //System.out.println(checkCol(1)); //This prints out if column 1 is true or false
    checkCol(2);
    //System.out.println(checkCol(2)); //This prints out if column 2 is true or false
    checkDiagonal();    
    //System.out.println(checkDiagonal()); //This prints out true or false depending on the diagonals
    checkWinner();  
    //System.out.println(checkWinner()); //This prints out if checkWinner is true or false. If it's true the while loop should end

    if(checkWinner() == true){
        displayTable();
        System.out.println("Player " + p1 + " wins!");
        gamesCounter++;
        p1Wins++;
        clearTable();
        System.out.println(p1 + " " + p1Wins + "/" + gamesCounter);
        System.out.println(p2 + " " + p2Wins + "/" + gamesCounter);
        System.out.println("Another game? Yes/No :");
        if(s.next() == "Yes") {
            break;
        }
        if(s.next() == "No") {
            continuePlaying = false;
            System.out.println("Statistitcs:");
            System.out.println(p1 + p1Wins + "/" + gamesCounter);
            System.out.println(p2 + p2Wins + "/" + gamesCounter);
            break;
        }
    }

    displayTable();
    System.out.print("Player " + p2 + ":");
    row = s.nextInt();
    col = s.nextInt();
    move(row, col);

    //This will display the table again and ask for proper coordinates.
            while(move(row, col) == false) {
                displayTable();
                System.out.println("Player " + p2 + ":");
                row = s.nextInt();
                col = s.nextInt();
                move(row,col);
            }

    //This inputs the O into the table if move(row, col) returns true.
    if(move(row, col) == true) {
        table[row][col] = 'O';
    }
    //This will check if p2 just won the game or if the game needs to continue
    checkRow(0);
    //System.out.println(checkRow(0)); //This prints out if row 0 is true or false
    checkRow(1);
    //System.out.println(checkRow(1)); //This prints out if row 1 is true or false
    checkRow(2);
    //System.out.println(checkRow(2)); //This prints out if row 2 is true or false
    checkCol(0);
    //System.out.println(checkCol(0)); //This prints out if column 0 is true or false
    checkCol(1);
    //System.out.println(checkCol(1)); //This prints out if column 1 is true or false
    checkCol(2);
    //System.out.println(checkCol(2)); //This prints out if column 2 is true or false
    checkDiagonal();    
    //System.out.println(checkDiagonal()); //This prints out true or false depending on the diagonals
    checkWinner();  
    //System.out.println(checkWinner()); //This prints out if checkWinner is true or false. If it's true the while loop should end

    if(checkWinner() == true){
        displayTable();
        System.out.println("Player " + p2 + " wins!");
        gamesCounter++;
        p2Wins++;
        System.out.println(p1 + " " + p1Wins + "/" + gamesCounter);
        System.out.println(p2 + " " + p2Wins + "/" + gamesCounter);
        System.out.println("Another game? Yes/No :");
        if(s.next() == "Yes") {
            break;
        }
        if(s.next() == "No") {
            continuePlaying = false;
            System.out.println("Statistitcs:");
            System.out.println(p1 + p1Wins + "/" + gamesCounter);
            System.out.println(p2 + p2Wins + "/" + gamesCounter);
            break;
        }

    }

}
    {
    } while (exitProgram == false);
}
}

My question for you all today is. When I finish a game in my program and it asks if I want to play another game. I'll type Yes. And nothing will happen. I have to type Yes twice for it to move on to another game, and then when my "clearTable();" method kicks in, it only replaces the X's in my program and not the O's.

Can someone explain to me why it would not remove the O's from my program and the x's? My method makes perfect sense, to me anyway.

static void clearTable(){
    for(int i = 0; i < table.length; i++){
        table[i][i] = ' ';
    }
}

It will loop until everything has ' ' in it. I'm not sure why it excludes O's right now though.

Another concern I have, is after I finish a game and I type "No" so my program exits. I will have to type "No" twice, and then it just displays my table again, the table won't be cleared either. This shouldn't be what happens. My program should print the statistics of the players and then quit. Any ideas?

Daniel
  • 45
  • 2
  • 9
  • 2
    `== "Yes"` strikes again: http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java – Pshemo Feb 07 '15 at 16:00
  • 1
    Also don't use `if(checkRow(0) == true)` it is error-prone since `if(condition == true)` can be easily incorrect written as `if (condition = true)` which will first *assign* `true` to `condition` variable. Safest and clearest way is `if(condition)` like `if(checkRow(0))`, and for `if(condition == false)` use negation `!` like `if (!condition)`. – Pshemo Feb 07 '15 at 16:06
  • Please, next time you ask: Reduce your program to a minimum and just post that. – usr1234567 Feb 11 '15 at 13:15

1 Answers1

2

As far as I understood, table is a two dimensional array which will not pass through the whole array if you only make one for loop and using table.length();. Your clearTable function goes through table[0][0],table[1][1] and table[2][2] only while it should go through the whole array. You should make another inner for loop and use table[0].length which will return the size of the second dimension in the array.

static void clearTable(){
    for(int i = 0; i < table.length; i++)
        for(int j=0; j< table[0].length; j++)
            table[i][j] = ' ';
}

I hope it works.

As for the double "Yes" and "No", it's caused because you call the function s.next() in a if and after you answer the first one, it will call the s.next() function again. Instead, save the answer in a string and compare it like this:

string ans = s.next();
if(ans.equals("Yes"))
    break;
else if(ans.equals("No")) {
    continuePlaying = false;
    System.out.println("Statistitcs:");
    System.out.println(p1 + p1Wins + "/" + gamesCounter);
    System.out.println(p2 + p2Wins + "/" + gamesCounter);
    break;
}
HelloWorld
  • 1,128
  • 1
  • 7
  • 14