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!