Skip to Main Content

New to Java

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

How do I write an algorithm for winning a MasterMind game?

843789Mar 4 2010 — edited Mar 5 2010
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! :)
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Apr 2 2010
Added on Mar 4 2010
9 comments
854 views