punchkey
punchkey

Reputation: 81

How to see if first character of a string is a certain char, and if it is, perform an action (not working right)

import java.util.Random;
import java.util.Scanner;

public class MineSweeper {

public static void main(String[] args) {
    Scanner scnr = new Scanner(System.in);
    boolean playAgain = true;

    System.out.println("Welcome to Mine Sweeper!");

while (playAgain)   {
    final int MIN_SIZE = 3;
    final int MAX_SIZE = 20;
    final char NO_NEARBY_MINE = ' ';

    String errorWidth = "Expected a number from " + MIN_SIZE + " to " + MAX_SIZE + "\nWhat width of map would you like (" + MIN_SIZE + "-" + MAX_SIZE + "):";
    String errorHeight = "Expected a number from " + MIN_SIZE + " to " + MAX_SIZE + "\nWhat height of map would you like (" + MIN_SIZE + "-" + MAX_SIZE + "):";

    System.out.println("What width of map would you like (" + MIN_SIZE + "-" + MAX_SIZE + "):");
    int userWidth = promptUser(scnr, errorWidth, MIN_SIZE, MAX_SIZE);
    System.out.println("What height of map would you like (" + MIN_SIZE + "-" + MAX_SIZE + "):");
    int userHeight = promptUser(scnr, errorHeight, MIN_SIZE, MAX_SIZE);

    String errorGetRow = "Expected a number from " + 1 + " to " + userWidth + ".";
    String errorGetCol = "Expected a number from " + 1 + " to " + userHeight + ".";
    int minRowCol = 1;

    char[][] mineArray = new char[userHeight][userWidth];
    eraseMap(mineArray);
    simplePrintMap(mineArray);

    System.out.println("row: ");
    int row = promptUser(scnr, errorGetRow, minRowCol, userWidth);
    System.out.println("column: ");
    int column = promptUser(scnr, errorGetCol, minRowCol, userHeight);
    mineArray[row-1][column-1] = NO_NEARBY_MINE;
    simplePrintMap(mineArray);

    System.out.println("Would you like to play again (y/n)?");
    String response = scnr.next();
    if (response.startsWith("Y") || response.startsWith("y")) {
            playAgain = true;
    }
    else {
        playAgain = false;
    }

    }
System.out.println("Thank you for playing Mine Sweeper!");
}

public static int promptUser(Scanner in, String prompt, int min, int max) {
    int userTempVal = 0;

        do {
        userTempVal = in.nextInt();
            if (userTempVal < min || userTempVal > max) {
            System.out.println(prompt);
            }

       }while (userTempVal < min || userTempVal > max);

    return userTempVal; 
    }

public static void eraseMap(char[][] map) {
    final char UNSWEPT = '.';
    for (int row = 0; row < map.length; row++) {
        for (int col = 0; col < map[row].length; col++) {
            map[row][col] = UNSWEPT;
        }
    }
    return;
}    

public static void simplePrintMap(char[][] map) {
    for (int row = 0; row < map.length; row++) {
        for (int col = 0; col < map[row].length; col++) {
            System.out.print(map[row][col] + " ");
        }
        System.out.println("");
    }
    return; //FIXME
}

EDIT: So I changed my code to utilize .equals rather than ==, and my code works successfully when I input a string with only one word, so "Yes". If I input a string of multiple words ("Yes I do"), I get an error still. Typing a string with multiple words yields an error. When I use scnr . next(), it always compiles the else statement, even if the statement is "Yes I do", where the first letter is Y. If I use scnr . nextLine() it compiles the if statement, restarts the loop, prints "What width of map..." and then gives an error before I can input anything.

I'm referring mainly to the main method at the bottom from "Would you like to play again" to the end of the main method. I'm also having an issue in my promptUser method, where I want the method to display the error message and scan again for an int if the user enters anything besides an int.

Upvotes: 0

Views: 7602

Answers (3)

Alex
Alex

Reputation: 803

There are 2 problems with your code.

  1. Comparing String using ==

    It is wrong because it compares the object reference rather than the object content. You need to use String.equals() to compare. In your case, you can even use String.startsWith() to check if your input is starting with something.

  2. Use String.substring() on your input

    Since the user can input empty string by just press [ENTER], you cannot use String.substring(0,1) or otherwise you will get String index out of range.

To fix the above 2 problems, you may change your code like below.

// Read the whole line
String response = scnr.nextLine(); 
// change to upper case first and check the starting character
playAgain = (response.toUpperCase().startsWith("Y")); 

To make sure the next read is ready, I would suggest to add Scanner.nextLine() after finish reading on the current line.

e.g.

userTempVal = in.nextInt();
// add this line to consume the rest of the line
in.nextLine();

Upvotes: 1

Crabigator360
Crabigator360

Reputation: 1032

You are facing this problem because you are using the == operator to compare strings. If you used the statement response.substring(0, 1).equals("Y"), that would fix the problem as this is the actual way to check equality of strings. Or you could use the less verbose method listed below.

public class main{
    public static void main(String[] args){
        String response = "Yello";
        char c = response.charAt(0);
        if(c == 'Y'){
            System.out.println("Do something");
        }
        else if(c == 'y'){
            System.out.println("Do another thing");
        }
    }
}

Simply take the first character of the string and check equality with any other character you want.

Upvotes: 1

miradham
miradham

Reputation: 2355

Use response.equals() instead of ==.

== compares references of objects, while equals() would compare values of the string.

Upvotes: 1

Related Questions