The document describes a Java program to play a simplified single-player version of the Connect Four game. The program initializes an empty game board and allows a player to drop red disks into columns while the computer randomly drops yellow disks. It checks after each turn if either player has four disks in a row to win, and determines if it is a draw if the board is full without a win.
On National Teacher Day, meet the 2024-25 Kenan Fellows
NO PAPER ANSWERS. ALL ANSWER SUBMISSIONS SHOULD BE ABLE TO RUN WIT.pdf
1. **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) {
2. 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("");
3. }
}
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
4. 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;
5. 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;
6. }
public static boolean isClear(String s) {
return s.contains("| |") || s.contains(" |");
}
}
Solution
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
7. 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=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;
8. }
private void displayGrid()
{
for(int i=0;i=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;
}
9. 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);
}
10. // 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):