Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

**NO PAPER ANSWERS. ALL ANSWER SUBMISSIONS SHOULD BE ABLE TO RUN WITH NO ERRORS*

ID: 3792317 • Letter: #

Question

**NO PAPER ANSWERS. ALL ANSWER SUBMISSIONS SHOULD BE ABLE TO RUN WITH NO ERRORS**

**TO CREATE THIS JAVA PROGRAM USE ECLIPSE NEON**

The assignment is as follows:

Connect four is a two-player board game in which the players alternately drop colored disks into a seven-column, six-row vertically-suspended grid.

The objective of the game is to connect four same-colored disks in a row, a column, or a diagonal before your opponent can do likewise. The program prompts a player to drop a RED disk onto a column 0-6. Whenever a disk is dropped, the program redisplays the board on the console and determines the status of the game (win, draw, or continue). The computer player will RANDOMLY choose a column to drop a YELLOW disk onto. If a player tries to drop a disk on a column that is full, the turn is lost.

In other words, create a "1 player" version of the game,"Connect four." After the player is prompted to drop a disc (R). The computer will automatically drop the other disc (Y) in a random spot.

Sample output:

import java.util.Scanner;

/**
* Chapter 8 Exercise 20:
*
* (Game: connect four) Connect four is a two-player board game
* in which the players alternately drop colored disks into a seven-column,
* six-row vertically suspended grid, as shown below.
* The objective of the game is to connect four same-colored disks in a row,
* a column, or a diagonal before your opponent can do likewise. The program
* prompts two players to drop a red or yellow disk alternately. In the preceding
* figure, the red disk is shown in a dark color and the yellow in a light color.
* Whenever a disk is dropped, the program re-displays the board on the console
* and determines the status of the game (win, draw, or continue).
*
*/
public class Connect4 {

static boolean isPlayer1Turn = true;
static boolean hasWon = false;

public static void main(String[] args) {

String[][] m = createGrid(6,7);
Scanner input = new Scanner(System.in);
int column;


while (!hasWon) {

String diskColor = (isPlayer1Turn) ? "red" : "yellow";

displayMatrix(m);
boolean isFirstInput = true;
do {
if (!isFirstInput) {
System.out.println("COLUMN IS FULL. Try again...");
}
System.out.print("Drop a " + diskColor + " at column (0–6): ");
column = input.nextInt();
isFirstInput = false;
} while (!dropDisk(m, column));

if (isConsecutiveFour(m)) {
displayMatrix(m);
System.out.print("The "+diskColor+" player won! Do you want to play again? (y/n)");
char s = input.next().charAt(0);
if (s == 'y' || s == 'Y') {
m = createGrid(6, 7);
isPlayer1Turn = false;
} else {
System.exit(0);
}
}

isPlayer1Turn = !isPlayer1Turn;
}

}

public static void displayMatrix(String[][] m) {

for (int i = 0; i < m.length; i++) {
for (int j = 0; j < m[i].length; j++) {
System.out.print(m[i][j]);
}
System.out.println("");
}

}

public static String[][] createGrid(int row, int column) {

String[][] m = new String[row][column];
for (int i = 0; i < m.length; i++) {

for (int j = 0; j < m[i].length; j++) {
if (j == 0)
m[i][j] = "| |";
else
m[i][j] = " |";

}
}
return m;
}

public static boolean isConsecutiveFour(String[][] m) {

String s = (isPlayer1Turn) ? "R" : "Y";

int occurrence = 0;
// (m[0].length - 3) --> reason: only checking occurrences of 4
for (int j = 0; j < m[0].length - 3; j++) {
int y = m.length - 1; // row always starts on last row
int x = j;
while (x < m[0].length && y >= 0) {

if (m[y][x].contains(s)) { // | | | | | |R|R|
occurrence++; // | | | | |R|R|R|
if (occurrence == 4) return true; // | | | |R|R|R|R|
} else { // | | |R|R|R|R| |
occurrence = 0; // | |R|R|R|R| | |
} // |R|R|R|R| | | |
x++;
y--;
}
}

// (m.length - 2) --> reason: only checking occurrences of 4
// and last row has already been checked
for (int i = m.length - 2; i > 2; i--) {
int x = 0; // column always starts on the left side
int y = i;
occurrence = 0;
while (x < m[0].length && y >= 0) { // | | | |R|R| | |
// | | |R|R| | | |
// | |R|R| | | | |
if (m[y][x].contains(s)) { // |R|R| | | | | |
occurrence++; // |R| | | | | | |
if (occurrence == 4) return true; // | | | | | | | |
} else {
occurrence = 0;
}

x++;
y--;
}
}

// j >= 3 --> reason: only checking occurrences of 4
for (int j = m[0].length - 1; j >= 3; j--) {
int y = m.length -1; // row always starts on last row
int x = j;
occurrence = 0;

while (x >= 0 && y >= 0) {
// |L|L| | | | | |
if (m[y][x].contains(s)) { // |L|L|L| | | | |
occurrence++; // |L|L|L|L| | | |
if (occurrence == 4) return true; // | |L|L|L|L| | |
} else { // | | |L|L|L|L| |
occurrence = 0; // | | | |L|L|L|L|
}
x--;
y--;
}

}

// i > 2 --> reason: only checking occurrences of 4
for (int i = m.length - 2; i > 2; i--) {
int x = m[0].length - 1;
int y = i;
occurrence = 0;
while (x >= 0 && y >= 0) { // | | |L|L| | | |
// | | | |L|L| | |
if (m[y][x].contains(s)) { // | | | | |L|L| |
occurrence++; // | | | | | |L|L|
if (occurrence == 4) return true; // | | | | | | |L|
} else { // | | | | | | | |
occurrence = 0;
}
x--;
y--;
}

}

return false;
}

public static boolean dropDisk(String[][] m, int column) {

// figure out which disk to drop
String s;
if (isPlayer1Turn) {
s = (column > 0) ? "R|" : "|R|";
} else {
s = (column > 0) ? "Y|" : "|Y|";
}
boolean didRowUpdate = false;
int row = 0;

// check if there is a disk in column
// if there is get the proper row index
for (int i = 0; i < m.length; i++) {

if (isClear(m[i][column])) {
didRowUpdate = true;
row = i;
}
}

if (!didRowUpdate) return false;

m[row][column] = s;

return true;
}

public static boolean isClear(String s) {

return s.contains("| |") || s.contains(" |");
}


}

Explanation / Answer

Here is the complete code for the game. Comments are inline. Please do rate the answer if you are happy with the program. Thanks. Sample output also attached

========================================================

import java.util.Random;
import java.util.Scanner;
/**
* Chapter 8 Exercise 20:
*
* (Game: connect four) Connect four is a two-player board game
* in which the players alternately drop colored disks into a seven-column,
* six-row vertically suspended grid, as shown below.
* The objective of the game is to connect four same-colored disks in a row,
* a column, or a diagonal before your opponent can do likewise. The program
* prompts two players to drop a red or yellow disk alternately. In the preceding
* figure, the red disk is shown in a dark color and the yellow in a light color.
* Whenever a disk is dropped, the program re-displays the board on the console
* and determines the status of the game (win, draw, or continue).
*
*
*Intially a game is created and its grid is initialized to all '0'. Using only a char array
*because we only need to store the letter 'R' or 'Y'. This makes comparisons easy later. Each time
*depending on the color , that user gets to choose the column. For computer's turn, a random number is generated
*within the range. If the color for any player was successfull, then the status for the game is updated and the
*color is toggled to other color. When the status is updated, we check that color occurs in 4 possible ways, horizontal,
*vertical, diagonally right or diagonally left. If any of this happens, it means that color wins. Also if that didn't occur
*we need to see we there were any empty spots to continue further or its a draw. Each time the grid is displayed and also
*finally before showing the results.
*/
public class Connect4 {
   static final int ROWS=6;
   static final int COLUMNS=7;
  
   //Game status codes
   static final int DRAW=0;
   static final int WIN=1;
   static final int CONTINUE=2;
  
   char grid[][];
   int status;
   char winningColor;
   public Connect4()
   {
       grid=new char[ROWS][COLUMNS];
       //initialize the grid
       for(int i=0;i<ROWS;i++)
           for(int j=0;j<COLUMNS;j++)
               grid[i][j]='0';
      
       //initial game status continue
       status=CONTINUE;
       winningColor=' ';
   }
  
   private boolean drop(char color,int column)
   {
       //check from last row backwards to find the empty row
       for(int i=ROWS-1;i>=0;i--)
       {
           if(grid[i][column]=='0') //found an empty place
           {
               grid[i][column]=color;
               return true; //success in dropping color
           }
          
       }
       //the previous return would have not executed at this point here... so was not able to place
       //color
          
       return false;
   }
   private void displayGrid()
   {
       for(int i=0;i<ROWS;i++)
       {
           System.out.print(" |");
           for(int j=0;j<COLUMNS;j++)
               if(grid[i][j]=='0')
                   System.out.print(" |");
               else
                  
                   System.out.print(grid[i][j]+"|");
       }
   }
   private void updateStatus(char color)
   {
       int occurs;
      
       //keep track of empty spots to know if the game should continue or its a draw
       boolean emptySpots=false;
      
       for(int i=0;i<ROWS;i++)
       {
           for(int j=0;j<COLUMNS;j++)
           {
               occurs=0;
              
               //check horizontal
               for(int k=0;k<4;k++)
               {
                   if(j+k<COLUMNS) //check if column withing matrix range
                   {
                       if(grid[i][j+k]==color)
                           occurs++;
                       else
                       {
                           if(grid[i][j+k]=='0')
                               emptySpots=true;
                          
                       }
                   }
               }
               if(occurs==4) //found 4 occurences horizontally
               {
                   status=WIN;
                   winningColor=color;
               }
               else
               {
                   occurs=0;
                   //check vertically
                   for(int k=0;k<4;k++)
                   {
                       if(i+k<ROWS) //check if row in matrix range
                       {
                           if(grid[i+k][j]==color)
                           occurs++;
                           else{
                              
                               if(grid[i+k][j]=='0')
                                   emptySpots=true;
                                  
                           }
                       }
                   }
                   if(occurs==4) //found 4 occurences vertically
                   {
                       status=WIN;
                       winningColor=color;
                   }
                   else
                   {
                       occurs=0;
                       //check diagonally right
                       for(int k=0;k<4;k++)
                       {
                           if(i+k< ROWS && j+k<COLUMNS) //make sure not to go out of bounds of matrix
                           {
                               if(grid[i+k][j+k]==color)
                                   occurs++;
                               else{
                                  
                                   if(grid[i+k][j+k]=='0')
                                       emptySpots=true;
                                      
                               }
                           }
                       }
                       if(occurs==4) //found 4 occurences diagonally right i.e. column increasing row increasing
                       {
                           status=WIN;
                           winningColor=color;
                       }
                       else
                       {
                           occurs=0;
                           //check diagonally left
                           for(int k=0;k<4;k++)
                           {
                               if(i+k< ROWS && j-k>=0) //make sure not to go out of bounds of matrix
                               {
                                   if(grid[i+k][j-k]==color)
                                       occurs++;
                                   else{
                                      
                                       if(grid[i+k][j-k]=='0')
                                           emptySpots=true;
                                          
                                   }
                               }
                           }
                           if(occurs==4) //found 4 occurences diagonally left i.e row increasing column decreasing
                           {
                               status=WIN;
                               winningColor=color;
                           }  
                       }
                      
                   }
                  
                  
               }
           }
       }
      
       //check if no spots to continue further, then its a draw
       if(status==CONTINUE)
           if(!emptySpots)
               status=DRAW;
   }
  
   public void play()
   {
       Scanner input=new Scanner(System.in);
       int column;
       char color='R';
       Random rand=new Random();
       while(status==CONTINUE)
       {
           //display grid each time
           displayGrid();
          
           //if player's turn
           if(color=='R')
           {  
               System.out.println(" Drop a red disk at column(0-6):");
      
               column=input.nextInt();
           }
           else
           {
              
               //generate a random column for computer
              
               column=rand.nextInt()%COLUMNS;
               if(column<0) //if we got negative random number
                   column=-column;
               System.out.println(" Computer choose coloumn:"+column);
           }
           if(!drop(color,column))
               System.out.println(" Column full! Lost Turn");
           else
           {
              
               updateStatus(color);
              
           }
           // change the color for next turn
           color=color=='R'?'Y':'R';  
          
       }
       input.close();
       displayGrid();
       if(status==WIN)
       {
           if(winningColor=='R')
               System.out.println(" Player 1 (Red) wins the game!");
           else
               System.out.println(" Computer (Yellow) wins the game!");
       }
       else
       {
           System.out.println("Its a DRAW !");
       }
       System.out.println("GAME OVER!");
   }
  
   public static void main(String a[])
   {
       Connect4 game=new Connect4();
       game.play();
   }
}

================================

output:


| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
Drop a red disk at column(0-6):
0

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
|R| | | | | | |
Computer choose coloumn:2

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
|R| |Y| | | | |
Drop a red disk at column(0-6):
2

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R| | | | |
|R| |Y| | | | |
Computer choose coloumn:6

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R| | | | |
|R| |Y| | | |Y|
Drop a red disk at column(0-6):
3

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R| | | | |
|R| |Y|R| | |Y|
Computer choose coloumn:3

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R|Y| | | |
|R| |Y|R| | |Y|
Drop a red disk at column(0-6):
4

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R|Y| | | |
|R| |Y|R|R| |Y|
Computer choose coloumn:1

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R|Y| | | |
|R|Y|Y|R|R| |Y|
Drop a red disk at column(0-6):
4

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R|Y|R| | |
|R|Y|Y|R|R| |Y|
Computer choose coloumn:3

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |Y| | | |
| | |R|Y|R| | |
|R|Y|Y|R|R| |Y|
Drop a red disk at column(0-6):
4

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |Y|R| | |
| | |R|Y|R| | |
|R|Y|Y|R|R| |Y|
Computer choose coloumn:5

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |Y|R| | |
| | |R|Y|R| | |
|R|Y|Y|R|R|Y|Y|
Drop a red disk at column(0-6):
4

| | | | | | | |
| | | | | | | |
| | | | |R| | |
| | | |Y|R| | |
| | |R|Y|R| | |
|R|Y|Y|R|R|Y|Y|
Player 1 (Red) wins the game!
GAME OVER!