In: Computer Science
**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:
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
Drop a red disk at column (0-6): 0
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| R | | | | | | |
Computer chose column 4
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| R | | | | Y | | |
Drop a red disk at column (0-6): 0
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| R | | | | | | |
| R | | | | Y | | |
Computer chose column 5
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| R | | | | | | |
| R | | | | Y | Y | |
Drop a red disk at column (0-6): 0
| | | | | | | |
| | | | | | | |
| | | | | | | |
| R | | | | | | |
| R | | | | | | |
| R | | | | Y | Y | |
Computer chose column 6
| | | | | | | |
| | | | | | | |
| | | | | | | |
| R | | | | | | |
| R | | | | | | |
| R | | | | Y | Y | Y |
Drop a red disk at column (0-6): 0
| | | | | | | |
| | | | | | | |
| R | | | | | | |
| R | | | | | | |
| R | | | | | | |
| R | | | | Y | Y | Y |
Red wins! Use this code to help:
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(" |");
}
}
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("\n|");
           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("\nDrop 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("\nComputer choose
coloumn:"+column);
           }
          
if(!drop(color,column))
          
    System.out.println("\nColumn 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("\nPlayer 1 (Red) wins the
game!");
           else
          
    System.out.println("\nComputer (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!