Carnegie Mellon University Website Home Page
 
Fall 2012

15-121 Homework 2: TicTacToe - Due 9/25 (revised) at midnight

Download and unzip hw2-code.zip, which contains a modified version of the TicTacToe.java file that we developed in class on Tuesday. All the code you write for this assignment should be added to this file.

Note: You will be graded in part on your coding style. Your code should be easy to read, well organized, and concise. You should avoid duplicate code.


Background: The Game

In this lab, you'll be implementing TicTacToe, allowing for two human players to play against each other (play against your friends and family for valuable prizes!) as well as allowing for a human to play against the computer (albeit a pretty stupid computer!).

We all know how to play TicTacToe (or noughts and crosses - bloody British). Two players, designated by X and O respectively, alternately place their symbol on an open cell in a 3 by 3 square matrix until either one player has 3 marks in a row (the winner) or no more vacant cells are available (a draw).

Make sure that you can have two humans play against each other before you attempt the machine vs. human part!


The Methods

You will write additional methods in the TicTacToe class to implement the game. I will provide a rough outline below, but feel free to add additional methods as you require. I have provided return types and parameter lists but these are "serving suggestions" in that you can feel free to change them if you choose to approach the method differently than I did. Remember, there are LOTS of ways to do things correctly!

Oh, and your code should be substantively different from everyone else's in the class. And please do not Google for "Java TicTacToe code". Really.

With all that said, here's an outline of the solution I wrote:

void playGame()
This method is the only method called by main. You may not call any other methods from main! This method asks the user if it is to be a two-player game or a man-vs-machine game and then loops until either one player wins or the players draw (no more moves). It should announce the result as soon as a player wins or there is a draw.

void humanMove(boolean player1)
Prompts the player for a row and column in which to place their mark (X or O). Must call validMove to ensure that the input provided is 1) on the board and 2) not already occupied. Must loop until the player provides a valid move! Once a valid location is provided, calls addMark to add the X or O in the specified location.

boolean validMove(int row, int col)
Verifies that the row and col are within bounds and, if so, that the cell at that location is blank. Returns true if the location is in bounds and blank, false otherwise.

boolean noMoves()
Returns true if there are no valid moves left to be made; false otherwise.

boolean winningBoard(boolean player1)
Returns true if the player has three in a row, either across, up and down, or diagonally; false otherwise.


Letting the computer play and BONUS POINTS

Once you have the two-human player game working, you should modify your code to allow a person to play against the machine. Only work on this part once you have the two-human version working!

void machineMove()
I assumed that when it was human vs. machine that the human would always go first, so the machine is always player 2 (O). This method must generate a legal move for the machine. There are a number of ways to do this. The easiest way (and a decent baseline) is to search for the first empty space on the board and use that as the machine's move. You must at least get the baseline method to work! Once you have the baseline working, you can improve things for bonus, listed below.

5 points bonus - the machine picks a random legal position. There are a couple ways to do this, so think before you code.

10 points bonus - the machine implements a reasonable winning strategy. What's a winning strategy? Your first goal would be to play a winning move if one exists; next, you should block a position that would cause a win for the human player on his/her next play. If there is no need to block, a (potentially) winning strategy would be to make a move that gives the machine (O) two cells in a row, column, or diagonal.


The Haroun-negotiated bonus points follow. Attempt at your own risk!

15 points bonus - the machine implements a (legal) strategy that always results in a draw when played by a human.

20 points bonus - you implement a graphical user interface that allows the human player(s) to click on a cell and have it display the ongoing progress of the game.

Note: you should only attempt the bonus once you have all the other methods working correctly!


Submitting Your Work

When you have completed this assignment and tested your code thoroughly, create a .zip file with your work (including TicTacToe.java). Name the zip file "your-last-name".zip and email it to me mjs@cmu.edu.

Make sure to keep a copy of your work just in case something goes wrong!