Need help writing the code for a basic java tic tac toe game // Tic-Tac-Toe: Com
ID: 3933226 • Letter: N
Question
Need help writing the code for a basic java tic tac toe game
// Tic-Tac-Toe: Complete the FIX-ME's to have a working version of Tic-Tac-Toe.
// Note: the basis of the game is a two-dimensional 'board' array, with 3 rows
// and 3 columns. A value of +1 indicates an 'X' on the board; and a value of
// -1 indicates an 'O'
// Group Member names:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.*;
public class TicTacToe implements ActionListener{
// FIX ME #5: set CPU_PAUSE to true when ready to play
final boolean CPU_PAUSE = true; // does the CPU pause to think?
JButton [][] buttons = new JButton[3][3];
int [][] board = new int[3][3];
JLabel status = new JLabel("Player's turn", JLabel.CENTER);
JFrame frame = new JFrame();
JPanel buttonPanel = new JPanel();
JPanel labelPanel = new JPanel();
Timer timer = null;
// draw X or O depending on 'x' values
void refresh(int [][] x) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (x[i][j] == 1) {
buttons[i][j].setForeground(Color.blue);
buttons[i][j].setText("X");
} else if (x[i][j] == -1) {
buttons[i][j].setForeground(Color.pink);
buttons[i][j].setText("O");
} else {
buttons[i][j].setText(" ");
}
}
}
}
boolean have_winner(int checkVal) {
boolean winner = false;
// FIX ME #1: if there are three 'checkVal' values in-a-row across,
// then set 'winner' to true
// FIX ME #2: if there are three 'checkVal' values in-a-row vertically,
// then set 'winner' to true
int checkSum = 0;
if (checkSum == 3 * checkVal){
winner = true;
}
// FIX ME #3: if there are three 'checkVal' values in-a-row diagonally,
// then set 'winner' to true
return winner;
}
boolean playerMove(ActionEvent e) {
JButton btn = (JButton) e.getSource();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (btn.equals(buttons[i][j])) {
if (board[i][j] != 0) {
return false;
}
board[i][j] = 1;
refresh(board);
return true;
}
}
}
return false;
}
boolean board_is_full() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i][j] == 0) return false;
}
}
return true;
}
ActionListener refreshListener = new ActionListener(){
int delayCount = 0;
public void actionPerformed(ActionEvent event){
delayCount++;
if (delayCount > 5) {
delayCount = 0;
timer.stop();
enableButtons(false);
}
if (delayCount % 2 == 0) {
refresh(board);
} else {
int [][] x = new int[3][3];
refresh(x);
}
}
};
void enableButtons(boolean enable) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
buttons[i][j].setEnabled(enable);
}
}
}
ActionListener computerMove = new ActionListener(){
public void actionPerformed(ActionEvent event){
/* FIX ME #4: The computer moves by placing an 'O' on the board
* (i.e.), assigning a -1 to a valid element of the board array
* The computer can play randomly, by randomly selecting a
* row and column to play in, and repeating until a valid (empty)
* spot on the board is found. Optionally, the computer can
* play strategically, though this is more challenging.
*/
System.out.println("The computer's move...");
// refresh board and set up for player's move
// DO NOT CHANGE THESE STATEMENTS!
refresh(board);
status.setText("Player's Move");
enableButtons(true);
if (have_winner(-1)) {
winning_board(-1);
} else {
status.setText("Player's Move");
}
enableButtons(true);
}
};
ActionListener newGame = new ActionListener() {
public void actionPerformed(ActionEvent e)
{
System.out.println("newGame");
// FIX ME #6: set each value of the 'board' to 0
refresh(board);
enableButtons(true);
status.setText("Player's turn");
status.setForeground(Color.black);
}
};
void winning_board(int val) {
if (val == 1) {
status.setText("PLAYER WINS!");
status.setForeground(Color.blue);
} else if (val == -1) {
status.setText("COMPUTER WINS!");
status.setForeground(Color.pink);
}
timer = new Timer(500, refreshListener);
timer.setRepeats(true);
timer.start();
}
ActionListener ActionListener() {
public void actionPerformed(ActionEvent e)
{
if (timer != null && timer.isRunning()) {
timer.stop();
}
int delay = 0;
if (CPU_PAUSE) delay = 1000;
boolean player = playerMove(e);
if (player) {
if (have_winner(1)) {
winning_board(1);
return;
}
else if (board_is_full()) {
status.setText("IT'S A TIE!");
return;
}
status.setText("Computer is thinking...");
enableButtons(false);
Timer timer = new Timer(delay, computerMove);
timer.setRepeats(false);
timer.start();
} else {
System.out.println("No move ");
}
}
};
TicTacToe(){
labelPanel.setLayout(new GridLayout(2,3));
for (int i = 0; i < 6; i++) {
if (i!=1) {
labelPanel.add(new JLabel());
} else {
status.setText("Player's move...");
labelPanel.add(status);
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
buttons[i][j] = new JButton(" ");
buttons[i][j].setFont(new Font("Arial", Font.BOLD, 50));
buttons[i][j].addActionListener(onClick);
buttonPanel.add(buttons[i][j]);
}
}
buttonPanel.setLayout(new GridLayout(3,3));
frame.setSize(700,300);
frame.add(labelPanel, BorderLayout.SOUTH);
frame.add(buttonPanel, BorderLayout.NORTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Creates a menubar for a JFrame
JMenuBar menuBar = new JMenuBar();
// Define and add two drop down menu to the menubar
JMenu fileMenu = new JMenu("File");
JMenuItem newGameItem = new JMenuItem("New Game");
newGameItem.addActionListener(newGame);
fileMenu.add(newGameItem);
menuBar.add(fileMenu);
// Add the menubar to the frame
frame.setJMenuBar(menuBar);
frame.setVisible(true);
refresh(board);
}
public static void main(String[] args) {
new TicTacToe();
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
Explanation / Answer
// Tic-Tac-Toe: Complete the FIX-ME's to have a working version of Tic-Tac-Toe.
// Note: the basis of the game is a two-dimensional 'board' array, with 3 rows
// and 3 columns. A value of +1 indicates an 'X' on the board; and a value of
// -1 indicates an 'O'
// Group Member names:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.*;
public class TicTacToe implements ActionListener{
// FIX ME #5: set CPU_PAUSE to true when ready to play
final boolean CPU_PAUSE = true; // does the CPU pause to think?
JButton [][] buttons = new JButton[3][3];
int [][] board = new int[3][3];
JLabel status = new JLabel("Player's turn", JLabel.CENTER);
JFrame frame = new JFrame();
JPanel buttonPanel = new JPanel();
JPanel labelPanel = new JPanel();
Timer timer = null;
// draw X or O depending on 'x' values
void refresh(int [][] x) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (x[i][j] == 1) {
buttons[i][j].setForeground(Color.blue);
buttons[i][j].setText("X");
} else if (x[i][j] == -1) {
buttons[i][j].setForeground(Color.pink);
buttons[i][j].setText("O");
} else {
buttons[i][j].setText(" ");
}
}
}
}
boolean have_winner(int checkVal) {
boolean winner = false;
// FIX ME #1: if there are three 'checkVal' values in-a-row across,
// then set 'winner' to true
for (int i = 0; i < 3; i++) {
if (board[i][0]==checkVal && board[i][1]==checkVal && board[i][2]==checkVal){
winner=true;
}
}
// FIX ME #2: if there are three 'checkVal' values in-a-row vertically,
// then set 'winner' to true
for (int i = 0; i < 3; i++) {
if (board[0][i]==checkVal && board[1][i]==checkVal && board[2][i]==checkVal){
winner=true;
}
}
// FIX ME #3: if there are three 'checkVal' values in-a-row diagonally,
// then set 'winner' to true
if (board[0][0]==checkVal && board[1][1]==checkVal && board[2][2]==checkVal){
winner=true;
}
if (board[0][2]==checkVal && board[1][1]==checkVal && board[2][0]==checkVal){
winner=true;
}
return winner;
}
boolean playerMove(ActionEvent e) {
JButton btn = (JButton) e.getSource();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (btn.equals(buttons[i][j])) {
if (board[i][j] != 0) {
return false;
}
board[i][j] = 1;
refresh(board);
return true;
}
}
}
return false;
}
boolean board_is_full() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i][j] == 0) return false;
}
}
return true;
}
ActionListener refreshListener = new ActionListener(){
int delayCount = 0;
public void actionPerformed(ActionEvent event){
delayCount++;
if (delayCount > 5) {
delayCount = 0;
timer.stop();
enableButtons(false);
}
if (delayCount % 2 == 0) {
refresh(board);
} else {
int [][] x = new int[3][3];
refresh(x);
}
}
};
void enableButtons(boolean enable) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
buttons[i][j].setEnabled(enable);
}
}
}
ActionListener computerMove = new ActionListener(){
public void actionPerformed(ActionEvent event){
/* FIX ME #4: The computer moves by placing an 'O' on the board
* (i.e.), assigning a -1 to a valid element of the board array
* The computer can play randomly, by randomly selecting a
* row and column to play in, and repeating until a valid (empty)
* spot on the board is found. Optionally, the computer can
* play strategically, though this is more challenging.
*/
mainloop:
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
if(!(board[i][j]==1 || board[i][j]==-1)){
board[i][j] = -1;
buttons[i][j].setForeground(Color.pink);
buttons[i][j].setText("O");
break mainloop;
}
}
}
System.out.println("The computer's move...");
// refresh board and set up for player's move
// DO NOT CHANGE THESE STATEMENTS!
refresh(board);
status.setText("Player's Move");
enableButtons(true);
if (have_winner(-1)) {
winning_board(-1);
} else {
status.setText("Player's Move");
}
enableButtons(true);
}
};
ActionListener newGame = new ActionListener() {
public void actionPerformed(ActionEvent e)
{
System.out.println("newGame");
// FIX ME #6: set each value of the 'board' to 0
refresh(board);
enableButtons(true);
status.setText("Player's turn");
status.setForeground(Color.black);
}
};
void winning_board(int val) {
if (val == 1) {
status.setText("PLAYER WINS!");
status.setForeground(Color.blue);
} else if (val == -1) {
status.setText("COMPUTER WINS!");
status.setForeground(Color.pink);
}
timer = new Timer(500, refreshListener);
timer.setRepeats(true);
timer.start();
}
ActionListener ActionListener() {
public void actionPerformed(ActionEvent e)
{
if (timer != null && timer.isRunning()) {
timer.stop();
}
int delay = 0;
if (CPU_PAUSE) delay = 1000;
boolean player = playerMove(e);
if (player) {
if (have_winner(1)) {
winning_board(1);
return;
}
else if (board_is_full()) {
status.setText("IT'S A TIE!");
return;
}
status.setText("Computer is thinking...");
enableButtons(false);
Timer timer = new Timer(delay, computerMove);
timer.setRepeats(false);
timer.start();
} else {
System.out.println("No move ");
}
}
};
TicTacToe(){
labelPanel.setLayout(new GridLayout(2,3));
for (int i = 0; i < 6; i++) {
if (i!=1) {
labelPanel.add(new JLabel());
} else {
status.setText("Player's move...");
labelPanel.add(status);
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
buttons[i][j] = new JButton(" ");
buttons[i][j].setFont(new Font("Arial", Font.BOLD, 50));
buttons[i][j].addActionListener(onClick);
buttonPanel.add(buttons[i][j]);
}
}
buttonPanel.setLayout(new GridLayout(3,3));
frame.setSize(700,300);
frame.add(labelPanel, BorderLayout.SOUTH);
frame.add(buttonPanel, BorderLayout.NORTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Creates a menubar for a JFrame
JMenuBar menuBar = new JMenuBar();
// Define and add two drop down menu to the menubar
JMenu fileMenu = new JMenu("File");
JMenuItem newGameItem = new JMenuItem("New Game");
newGameItem.addActionListener(newGame);
fileMenu.add(newGameItem);
menuBar.add(fileMenu);
// Add the menubar to the frame
frame.setJMenuBar(menuBar);
frame.setVisible(true);
refresh(board);
}
public static void main(String[] args) {
new TicTacToe();
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.