We recommend using at least three classes:
An application class - this will contain your main method and will run the program as well as updating the gui
A board class - this will represent the backend and store the state of the game such as what disks are in what squares
A square/cell/tile class - this represents a single square of the reversi board and can be empty, or have a black or white disk in it
A window opens :
The program will use a GUI as well as console input. To display the GUI, your program must call the update(int grid, boolean gameOver, int gameWinner, boolean moveMade) method on a properly constructed ReversiGUI object. The gui will display a game grid based on the 2D int array you pass it - all values in this array should be one of the class constants defined in ReversiGUI. When the program starts, display an 8x8 grid with the starting initial configuration as defined in the program description above. Nothing really happens yet when you run the program, but at least the user interface shows up.
User Interaction (5 of 45 for design and code correctness):
Allow the user to interact with the game and place disks on squares. To handle GUI input, your program should repeatedly call the getMouseInput() method on a properly constructed ReversiGUI object. This method returns a ReversiAction object that indicates what action the mouse click corresponds to via the ACTION_TYPE instance constant which will correspond to one of the class constants defined in ReversiAction. For now, we are only concerned with ReversiAction.LEFT_CLICK - if it is a left click, we can also get the row and column index of the clicked square from the ROW and COLUMN instance constants. For this part, allow the user to click on any square and simply place a disk there.
Basic game (15 of 45 for design and code correctness):
Get a basic game going by expanding your work from the first two steps. Now only allow users to place disks in squares that correspond to valid moves and flip any disks that this move captured. Note that a player might capture disks on a horizontal, vertical, or diagonal line (or any combination of the three) between the newly placed piece and any of the player's old pieces. Also make sure to check if the game is over after each move. If the game is over, calculate who wins and pass all this information to the gui through the update method.
Basic Buttons :
Get the "New Match" and "Quit Game" buttons working. As before, you can figure out what the user clicked on via the getMouseInput() method. The "New Match" button should initialize a new game with the default starting configuration. The "Quit Game" button should exit your program (make sure to exit the gui as well).
Save Game :
Allow the user to save the game state when the "Save Game" button is pressed. When the save game button is pressed, a dialog will automatically open that prompts the user to save the file.