【问题标题】:Input Validation of a String in Java [duplicate]Java中字符串的输入验证[重复]
【发布时间】:2013-11-04 15:08:39
【问题描述】:

我已经尝试修复这个程序有一段时间了。基本上,它是一种石头剪刀布类型的游戏,除了输入验证之外,一切都有效。任何帮助将不胜感激。

这是我的代码:

import java.util.Scanner;
public class RockPaperScissors
{
    public static void main(String[] args)
    {
        Scanner scan = new Scanner (System.in);
        System.out.println("Player 1: Choose rock, paper or scissors:");
        String player1 = scan.next() .toLowerCase();
        //Player 1 Input Validation
        if ((player1 != ("rock"))
        || (player1 != ("paper"))
        || (player1 != ("scissors")))
        {
            System.out.println("Thats not right, choose rock, paper or scissors");
        }
        //Send Back to input
        System.out.println("Player 2: Choose rock, paper or scissors:");
        String player2 = scan.next() .toLowerCase();
        //Player 2 Input Validation
        if ((player2 != ("rock"))
        || (player2 != ("paper"))
        || (player2 != ("scissors")))
        {
            System.out.println("Please choose rock, paper or scissors");
        }
        System.out.println("Player 1 chose " + player1);
        System.out.println("Player 2 chose " + player2);


    //For Player 1 to win
    if((player1.equals("rock"))&&(player2.equals("scissors"))
    ||(player1.equals("scissors"))&&(player2.equals("paper"))
    ||(player1.equals("paper"))&&(player2.equals("rock")))
    {
        System.out.println ("Player 1 Wins!");
    }

    //For a draw
    if (player1.equals(player2))
    {
        System.out.println ("Its a Draw!");
    }

    //For Player 2 to win
    if ((player2.equals("rock"))&&(player1.equals("scissors"))
    ||(player2.equals("scissors"))&&(player1.equals("paper"))
    ||(player2.equals("paper"))&&(player1.equals("rock")))
    {
        System.out.println("Player 2 wins!");
    }

}

这是我得到的输出(Rock and Paper,是用户输入):

Player 1: Choose rock, paper or scissors:  
Rock  
Thats not right, choose rock, paper or scissors  
Player 2: Choose rock, paper or scissors:  
Paper   
Please choose rock, paper or scissors  
Player 1 chose rock  
Player 2 chose paper  
Player 2 wins!  

【问题讨论】:

  • 另外,使用常量而不是到处复制值;它不太容易出现拼写错误。

标签: java validation input


【解决方案1】:

当您想要比较字符串时,不要使用==!=,而是使用equals()equalsIgnoreCase() 方法。

当使用Scanner 时,请使用nextLine() 方法而不是next()

使用常量而不是变量字符串。

当玩家的输入不正确并且您希望玩家再次输入时,最好使用像while这样的循环结构,并且当用户给出有效输入时,然后跳出循环或使用函数内部的循环并返回一个值。

喜欢

编辑:要回答你关于 cmets 的问题,试试这个

class Player {
  String choice;
}

class Game {

static final ROCK = "ROCK";
static final PAPER = "PAPER";
static final SCISSORS = "SCISSORS";

  Scanner scanner = new Scanner();
  Player[] players = new Player[2]; //assuming you only want 2 players Use ArrayList for unspecified number of users and use a separate method to initialize it.

 public Game {
      for(int i =0 ; i<2 ; i++) {
         players[i]= new Player();
      }
 }

 private String getPlayerChoice() {
    System.out.println("Please enter your choice");
    System.out.println("1.Rock\n2.Paper\n3.Scissors")
    return scanner.nextLine();
 }

 void getInputAndValidate(Player p) {
  p.choice = getPlayerChoice();
  while(true) {
    if(p.choice.equalsIgnorecase(ROCK) || 
       p.choice.equalsIgnorecase(PAPER) || 
       p.choice.equalsIgnorecase(SCISSORS) ) {
         break;
    }
    else {
        System.out.println("Please enter a valid input");
        p.choice = getPlayerChoice(); \\ use the scanner as an instance variable.
    }
  }  
 }

 void getInput() {
    for(int i = 0; i<2;i++) {
     System.out.println("Player " + (i+1));
     getInputAndValidate(players[i]);
    }
 }

void compute(){
  // implement your game logic here
}
public static void main(String[] args) {
  Game g = new Game();
  g.getInput();
  g.compute();
}

}

【讨论】:

  • 我用过这个,我跑的时候出现死循环?是因为我只使用了while部分吗?
  • 如果不使用 break 语句,while(true) 始终保持为真,循环将无限执行。当输入的值是有效值时,break 语句将控制流中断出循环。
  • 应该在 while 循环之后...整个 while 循环仅用于验证...正如我告诉您将其放入方法中并通过传递 firstplayer 的输入来调用该方法然后提示第二个玩家输入。使用用户 iunput 再次调用该方法以进行验证。然后实现游戏逻辑。
  • 知道了 :) 谢谢 :D
  • @Kathryn-MayForrest:很高兴我能帮上忙,我已经编辑了帖子,以便为您提供更清晰的答案和实施。
【解决方案2】:
if ((player1 != ("rock"))
    || (player1 != ("paper"))
    || (player1 != ("scissors")))

将所有 != 更改为 equals 或 equalsIgnoreCase() 以避免大小写混淆

if ((!player1.equalsIgnoreCase("rock"))
    || (!player1.equalIgnoreCase("paper"))
    || (!player1.equalsIgnoreCase("scissors")))

【讨论】:

    猜你喜欢
    • 2012-05-23
    • 2014-07-17
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    相关资源
    最近更新 更多