Hi all
I am a student who is new to java and this is my first attempt at creating a non-graphics game. As instructed, I am first creating a non object-oriented version of the game.
I've been stuck at the section where the program 'counts' the number of pegs of the right color, but at the wrong position [as seen in incorrectPosition(int row)]. The count seems to either always under-count or overlap with the "number of pegs of the right color and at the correct position".
Sorry if the code seems long and redundant at parts, I'm a novice at this.
import java.util.Scanner;
public class MastermindNonOO {
public static final int codebreaker = 1;
public static int attempt = 0;
public static final int PLAYING = 0;
public static final int CODEMAKER_WON = 1;
public static final int CODEBREAKER_WON = 2;
public static final int TRIES = 10;
public static final int SIZE = 4;
public static String[][] board = new String[TRIES][SIZE];
public static final int CODEMAKER = 0;
public static final int CODEBREAKER = 1;
public static String[][] secretCode = new String[1][SIZE];
public static int currentState;
// MAIN PROGRAM
public static void main(String[] args) {
genSecretCode();
initGame();
do {
playerGuess(CODEBREAKER);
updateState(CODEBREAKER);
printBoard();
if (currentState == CODEBREAKER_WON) {
System.out.println();
System.out.println("Congratulations! You have broken the Secret Code.");
} else if (currentState == CODEMAKER_WON) {
System.out.println();
System.out.println("You are left with 0 tries.");
System.out.println("GAME OVER");
}
} while (currentState == PLAYING);
}
public static void genSecretCode() {
String[] colours = { "RED", "ORANGE", "YELLOW", "GREEN", "BLUE",
"PURPLE" };
for (int index = 0; index < SIZE; index++) {
secretCode[0][index] = pickRand.get(colours);
System.out.print(secretCode[0][index] + " ");
}
System.out.println();
}
public static void initGame() {
currentState = PLAYING;
}
public static void playerGuess(int player) {
attempt++;
System.out.println("Please input your guess: ");
Scanner in = new Scanner (System.in);
for (int index = 0; index < SIZE; index++) {
String colour = in.next();
if (colour.equalsIgnoreCase("RED")
|| colour.equalsIgnoreCase("ORANGE")
|| colour.equalsIgnoreCase("YELLOW")
|| colour.equalsIgnoreCase("GREEN")
|| colour.equalsIgnoreCase("BLUE")
|| colour.equalsIgnoreCase("PURPLE")) {
board[attempt - 1][index] = colour;
} else {
System.out.println("Colour at slot #" + (index + 1)
+ " is invalid. Please try again.");
}
}
System.out.println();
}
public static void updateState(int player) {
// check if "player" has won after the last move
if (hasWon(player)) {
currentState = CODEBREAKER_WON;
} else if (gameOver()) {
currentState = CODEMAKER_WON;
} else {
currentState = PLAYING;
}
}
public static boolean hasWon(int player) {
if (board[attempt - 1][0].equalsIgnoreCase(secretCode[0][0])
&& board[attempt - 1][1].equalsIgnoreCase(secretCode[0][1])
&& board[attempt - 1][2].equalsIgnoreCase(secretCode[0][2])
&& board[attempt - 1][3].equalsIgnoreCase(secretCode[0][3])) {
return true;
}
return false;
}
public static boolean gameOver() {
boolean over = false;
if (attempt > TRIES) {
over = true;
}
return over;
}
public static void printBoard() {
System.out.println(" Your Guess Correct Position Incorrect Position");
System.out.println("---------------------------------------------------------------------------");
for (int row = 0; row < attempt; row ++) {
for (int col = 0; col < SIZE; col++) {
System.out.print(board[row][col] + " ");
}
// for formatting purposes
int totalChar = board[row][0].length() + board[row][1].length() + board[row][2].length() + board[row][3].length();
for (int space = 1; space <= 25 - totalChar; space++) {
System.out.print(" ");
}
System.out.print(" " + correctPosition(row));
System.out.println(" " + incorrectPosition(row));
}
System.out.println();
System.out.println();
}
public static int correctPosition(int row) {
int correctCount = 0;
if (board[row][0].equalsIgnoreCase(secretCode[0][0])) {
correctCount++;
}
if (board[row][1].equalsIgnoreCase(secretCode[0][1])) {
correctCount++;
}
if (board[row][2].equalsIgnoreCase(secretCode[0][2])) {
correctCount++;
}
if (board[row][3].equalsIgnoreCase(secretCode[0][3])) {
correctCount++;
}
return correctCount;
}
public static int incorrectPosition(int row) {
int incorrectCount = 0;
if (!(board[row][0].equalsIgnoreCase(secretCode[0][0]))) {
if (board[row][0].equalsIgnoreCase(secretCode[0][1])
|| board[row][0].equalsIgnoreCase(secretCode[0][2])
|| board[row][0].equalsIgnoreCase(secretCode[0][3])) {
incorrectCount++;
}
}
if (!(board[row][0].equalsIgnoreCase(secretCode[0][0])
|| board[row][1].equalsIgnoreCase(secretCode[0][1]) || board[row][1]
.equalsIgnoreCase(board[row][0]))) {
if (board[row][1].equalsIgnoreCase(secretCode[0][0])
|| board[row][1].equalsIgnoreCase(secretCode[0][2])
|| board[row][1].equalsIgnoreCase(secretCode[0][3])) {
incorrectCount++;
}
}
if (!(board[row][0].equalsIgnoreCase(secretCode[0][0])
&& board[row][1].equalsIgnoreCase(secretCode[0][1])
|| board[row][2].equalsIgnoreCase(secretCode[0][2]) || (board[row][2]
.equalsIgnoreCase(board[row][1]) || board[row][2]
.equalsIgnoreCase(board[row][0])))) {
if (board[row][2].equalsIgnoreCase(secretCode[0][0])
|| board[row][2].equalsIgnoreCase(secretCode[0][1])
|| board[row][2].equalsIgnoreCase(secretCode[0][3])) {
incorrectCount++;
}
}
if (!((board[row][0].equalsIgnoreCase(secretCode[0][0])
&& board[row][1].equalsIgnoreCase(secretCode[0][1])
&& board[row][2].equalsIgnoreCase(secretCode[0][2]))
|| board[row][3].equalsIgnoreCase(secretCode[0][3]) || (board[row][3]
.equalsIgnoreCase(board[row][2])
|| board[row][3].equalsIgnoreCase(board[row][1]) || board[row][3]
.equalsIgnoreCase(board[row][0])))) {
if (board[row][3].equalsIgnoreCase(secretCode[0][0])
|| board[row][3].equalsIgnoreCase(secretCode[0][1])
|| board[row][3].equalsIgnoreCase(secretCode[0][2])) {
incorrectCount++;
}
}
return incorrectCount;
}
}
an example of a wrongful result was when the computer generated:
ORANGE YELLOW ORANGE PURPLE
When I input: purple purple purple purple as my guess, the result produced was "1 correct position, 1 incorrect position" instead of "1 correct position, 0 incorrect position".
I've been working on this for 14 hours and getting quite confused. Would really appreciate if someone could help.
Thank you! :)