Tic Tac Toe help

Discussion in 'Homework Help' started by FoxTek, Nov 29, 2010.

Tic Tac Toe help
  1. Unread #1 - Nov 29, 2010 at 9:34 AM
  2. FoxTek
    Joined:
    Mar 1, 2010
    Posts:
    1,637
    Referrals:
    4
    Sythe Gold:
    0

    FoxTek Guru
    Banned

    Tic Tac Toe help

    I need to make this program 'smarter' instead of it just making random moves. Any and all help would be appreciated.

    Code:
    package tictactoe;
    
    import java.util.Random;
    import java.util.Scanner;
    
    public class TicTacToe {
    	private char[] cells = new char[9];
    	public static char CELL_EMPTY = ' ';
    	public static char CELL_CIRCLE = 'O';
    	public static char CELL_CROSS = 'X';
    
    	public TicTacToe() {
    		for (int i = 0; i < cells.length; i++) {
    			cells[i] = CELL_EMPTY;
    		}
    	}
    	
    	private void drawBoard() {
    		System.out.println(cells[0] + " | " + cells[1] + " | " + cells[2]);
    		System.out.println("- - - - -");
    		System.out.println(cells[3] + " | " + cells[4] + " | " + cells[5]);
    		System.out.println("- - - - -");
    		System.out.println(cells[6] + " | " + cells[7] + " | " + cells[8]);
    	}
    
    	private boolean isWinner(char symbol) {
    		boolean answer = false;
    		if (checkRows(symbol) || checkColumns(symbol) || checkDiagnals(symbol)) {
    			answer = true;
    		} else {
    			answer = false;
    		}
    		return answer;
    	}
    	
    	public void computerMove() {
    		System.out.println("======================================");
    		System.out.println("Thinking . . .");
    		try {
    			Thread.sleep(2000);
    		}
    		catch (InterruptedException ie) {
    		}
    		System.out.println("Making move . . .");
    		try {
    			Thread.sleep(2000);
    		}
    		catch (InterruptedException ie) {
    		}
    		int emptyCellCount = 0;
    		for (int i = 0; i < cells.length; i++) {
    			if (cells[i] == CELL_EMPTY) {
    				emptyCellCount++;
    			}
    		}
    		
    		int[] emptyCellIndexes = new int[emptyCellCount];
    		emptyCellCount = 0;
    		for (int i = 0; i < cells.length; i++) {
    			if (cells[i] == CELL_EMPTY) {
    				emptyCellIndexes[emptyCellCount] = i;
    				emptyCellCount++;
    			}
    		}
    		
    		Random r = new Random();
    		int randomNumber = r.nextInt(emptyCellCount);
    
    		cells[emptyCellIndexes[randomNumber]] = CELL_CIRCLE;
    		
    		drawBoard();
    		
    		if (isWinner(CELL_CROSS)) {
    			System.out.println("Congratulations! You won.");
    		} else if (isWinner(CELL_CIRCLE)) {
    			System.out.println("Sorry! You lost.");
    		} else if (isFull()) {
    			System.out.println("It's a tie!");
    		} else {
    			humanMove();
    		}		
    	}
    	
    	public void humanMove() {
    		System.out.println("======================================");
    		drawBoard();
    		Scanner input = new Scanner(System.in);
    		int rowNumber = 0, colNumber = 0, index = 0;
    		try {
    			Thread.sleep(1000);
    		}
    		catch (InterruptedException ie) {
    		}
    		System.out.println("You are 'X'. It's your turn. ");
    		System.out.println("Tell me which cell you would like to occupy.");
    		System.out.println("Which row [1 - 3]? ");
    		rowNumber = input.nextInt();
    		System.out.println("Which column [1 - 3]? ");
    		colNumber = input.nextInt();
    		index = (rowNumber - 1) * 3 + (colNumber - 1);
    		while (!isInputValid(index)) {
    			System.out.println("Invalid move! Tell me which cell you would like to occupy.");
    			System.out.println("Which row [1 - 3]? ");
    			rowNumber = input.nextInt();
    			System.out.println("Which column [1 - 3]? ");
    			colNumber = input.nextInt();
    			index = (rowNumber - 1) * 3 + (colNumber - 1);
    		}
    		cells[index] = CELL_CROSS;
    drawBoard();
    		if (isWinner(CELL_CROSS)) {
    			System.out.println("Congratulations! You won.");
    			drawBoard();
    		} else if (isWinner(CELL_CIRCLE)) {
    			System.out.println("Sorry! You lost.");
    			drawBoard();
    		} else if (isFull()) {
    			System.out.println("It's a tie!");
    			drawBoard();
    		}
    		else {
    			computerMove();
    		}
    	}
    	private boolean isFull() {
    		boolean answer = true;
    		for (int i = 0; i < cells.length; i++) {
    			if (cells[i] == CELL_EMPTY) {
    				answer = false;
    				break;
    			}
    		}
    		return answer;
    	}
    	
    	private boolean isInputValid(int index) {
    		boolean answer = false;
    		if (cells[index] == CELL_CIRCLE || cells[index] == CELL_CROSS) {
    			answer = false;
    		} else {
    			answer = true;
    		}
    		return answer;
    	}
    
    	private boolean checkRows(char symbol) {
    		boolean answer = false;
    		if (cells[0] == symbol && cells[1] == symbol && cells[2] == symbol){
    			answer = true;
    		} else if (cells[3] == symbol && cells[4] == symbol && cells[5] == symbol) {
    			answer = true;
    		} else if (cells[6] == symbol && cells[7] == symbol && cells[8] == symbol) {
    			answer = true;
    		} else {
    			answer = false;
    		}
    		return answer;
    	}
    	
    	private boolean checkColumns(char symbol) {
    		boolean answer = false;
    		if (cells[0] == symbol && cells[3] == symbol && cells[6] == symbol){
    			answer = true;
    		} else if (cells[1] == symbol && cells[4] == symbol && cells[7] == symbol) {
    			answer = true;
    		} else if (cells[2] == symbol && cells[5] == symbol && cells[8] == symbol) {
    			answer = true;
    		} else {
    			answer = false;
    		}
    		return answer;
    	}
    	
    	private boolean checkDiagnals(char symbol) {
    		boolean answer = false;
    		if (cells[0] == symbol && cells[4] == symbol && cells[8] == symbol) {
    			answer = true;
    		} else if (cells[2] == symbol && cells[4] == symbol && cells[6] == symbol) {
    			answer = true;
    		} else {
    			answer = false;
    		}
    		return answer;
    	}
    }
     
  3. Unread #2 - Dec 5, 2010 at 10:46 AM
  4. Blupig
    Joined:
    Nov 23, 2006
    Posts:
    7,145
    Referrals:
    16
    Sythe Gold:
    1,609
    Discord Unique ID:
    178533992981594112
    Valentine's Singing Competition Winner Member of the Month Winner MushyMuncher Gohan has AIDS Extreme Homosex World War 3 I'm LAAAAAAAME
    Off Topic Participant

    Blupig BEEF TOILET
    $5 USD Donor

    Tic Tac Toe help

    I'm not going to write the code for you since that's your job, but it is actually pretty easy to make basic NPC intelligence for games like this.

    Basically, when the NPC makes the move, analyze which spots are empty and which are not. If, say, the human player puts an "X" in the top left corner square, then the NPC could say "Ok, so there are 3 possible ways the player can continue to make 2 in a row." Then, randomly pick which of the 3 ways the NPC chooses to foil. Additionally, if you want to create different types of difficulties, you would add in some nonsensical moves into the random generator. So, let's say you have 2 game modes, easy and hard. For easy, (using the same scenario as above) there are 3 ways the NPC can try and foil the player. While randomly picking which way to go, add in another random square so that there is a chance that the NPC will mess up and leave an opening for the player. If you want to make it really easy, repeat the same chance of the NPC making a bad move twice or even 3 times to make the odds in favor of the NPC fucking up.

    For hard mode, you would only have the 3 possible ways. Naturally, as the game progresses, there will be less options, so depending on the outcome of every move your application will have to be pretty flexible.
     
< [QUICK] Really quick French question. | Algebra 2 Help >

Users viewing this thread
1 guest


 
 
Adblock breaks this site