Java Do While无法正常工作

时间:2017-02-15 09:53:01

标签: java loops do-while freeze continue

对不起,我是这个网站的新手,所以不确定这将如何显示。我正在尝试制作一个简单的摇滚,纸,剪刀游戏。在while语句之后,如果未输入R,P,S,则程序不执行任何操作。我希望它在开头回到问题所以可以输入正确的选择。另外,我如何输入“无效选择请重试”等打印语句?

package rps.gameapp;

import java.util.Scanner;

public class RPSGameApp
{

    public static void main(String[] args)
    {

    Scanner sc = new Scanner(System.in);
    String userChoice;
    String playAgain;
    int randNum = (int) (Math.random() * 3);

    do
        {
        System.out.println("Welcome to Rock, Paper, Scissors Game.");
        System.out.println("Pick R, P, or S.");
        userChoice = sc.nextLine();
        while (!userChoice.equalsIgnoreCase("P")
                && !userChoice.equalsIgnoreCase("R")
                && !userChoice.equalsIgnoreCase("S"));


            String compChoice = "";
        switch (randNum)
            {
            case 0:
                compChoice = "R";
                break;
            case 1:
                compChoice = "P";
                break;
            case 2:
                compChoice = "S";
                break;
            }

        System.out.println("The computer entered \"" + compChoice + "\".");

        if (compChoice.equalsIgnoreCase(userChoice))
            {
            System.out.println("Draw");
            } else if (userChoice.equalsIgnoreCase(userChoice)
                && compChoice.equalsIgnoreCase("S")
                || userChoice.equalsIgnoreCase("P")
                && compChoice.equalsIgnoreCase("R")
                || userChoice.equalsIgnoreCase("S")
                && compChoice.equalsIgnoreCase("P"))
            {
            System.out.println("User Wins");
            } else
            {
            System.out.println("User Loses");
            }

        System.out.print(
                "Do you want to play again? (Y/N)");
        playAgain = sc.nextLine();

        } while (playAgain.equalsIgnoreCase("Y"));

    System.out.println("Thanks for Playing!");

    }
}

2 个答案:

答案 0 :(得分:3)

您的内部do do循环似乎忘了一个while

应该是:

do {
    do {
        System.out.println("Welcome to Rock, Paper, Scissors Game.");
        System.out.println("Pick R, P, or S.");
        userChoice = sc.nextLine();
    } while (!userChoice.equalsIgnoreCase("P") && !userChoice.equalsIgnoreCase("R") && !userChoice.equalsIgnoreCase("S")); 
    ...
} while (playAgain.equalsIgnoreCase("Y"));

如果没有内部do(以及围绕该循环体的花括号),内部循环将成为一个空体的while循环。

答案 1 :(得分:0)

与Eran一样,你需要在另一个循环中包装你的do-while循环,这将继续要求用户输入正确的内容。这是完全有效的代码。可能更好的一件事是用户输入错误信后的消息。

编辑:还要确保为每次迭代绘制随机数。

编辑2:根据用户输入更改消息,您可以引入一个新变量,该变量将跟踪您要求用户输入正确的次数。如果它是0-这意味着第一次询问用户,我们应该打印"欢迎"信息。它不是0-您需要询问用户输入是否正确。在每一轮之后,我们再次将0分配给变量并重复循环。我已在代码中实现了此更改。请注意,此变量也可以是布尔值。

while (odbc_fetch_row($result)) { // while there are rows 
    $overweight = odbc_result($result, "Weight1") - 44000;
    //$total_overweight += $overweight; 
    $date = date("Y-m-d", strtotime(odbc_result($result, "Date1")));
    $companies[] = odbc_result($result, "String3");
    $weight = odbc_result($result, "Weight1");                                     
    $item['nrplaat'] = odbc_result($result, "String1");
    $item['tptcode'] = odbc_result($result, "String3");
    $item['chrononr'] = odbc_result($result, "String15");
    $item['projectcode'] = odbc_result($result, "String4");
    $item['projectnaam'] = odbc_result($result, "String8");
    $item['1eweging'] = $weight;
    $item['overweighted'] = $overweight;
    $item['date'] = $date;
    $item['2eweging'] = odbc_result($result, "Weight2");
    $item['netto'] = odbc_result($result, "Nett");                                                                     
    switch($weight){
        case($weight > '44000' && $weight <= '44500'):
           $item['class'] = 'lichtgroen';
        case($weight > '44500' && $weight <= '45000'):
           $item['class'] = 'groen';
        case($weight > '45000' && $weight <= '46000'):
           $item['class'] = 'donkergroen';
        case($weight > '46000' && $weight <= '47000'):
           $item['class'] = 'bruingroen';
        case($weight > '47000' && $weight <= '48000'):
           $item['class'] = 'lichtbruin';
        case($weight > '48000' && $weight <= '49000'):
           $item['class'] = 'bruin';
        case($weight > '49000' && $weight <= '50000'):
           $item['class'] = 'lichrood';
        case($weight > '50000'):
           $item['class'] = 'rood';                                                                               
    }                                    
    switch($date){
        case($date > $s_year.'-'.$quart1 && $date <= $s_year.'-'.$quart2):
           $item['quarter'] = '1'; //kwartaal 1
        case($date > $s_year.'-'.$quart2 && $date <= $s_year.'-'.$quart3):
           $item['quarter'] = '2'; ////kwartaal 2
        case($date > $s_year.'-'.$quart3 && $date <= $s_year.'-'.$quart4):
           $item['quarter'] = '3'; ////kwartaal 3
        case($date > $s_year.'-'.$quart4 && $date <= $s_year.'-'.$end):
           $item['quarter'] = '4'; ////kwartaal 4                                        
    }
    //$item['quarter'] = 1; WHEN I DO THIS, ALL RESULTS WILL PRINT OUT!!!
    switch($item['quarter']){
        case '1': 
           print "<tr>\n";
           print "  <td>" . $item['nrplaat'] . "\n";
           print "  <td>" . $item['tptcode'] . "\n";
           print "  <td>" . $item['chrononr'] . "\n";
           print "  <td>" . $item['projectcode'] . "\n";
           print "  <td>" . $item['projectnaam'] . "\n";
           print "  <td>" . $item['1eweging'] . "\n";
           print "  <td>" .  "<span class=\"status\">".$item['class']."</span>" ."\n";
           print "  <td>" . $item['overweighted'] . "\n";
           print "  <td>" . $item['date'] . "\n";
           print "  <td>" . $item['2eweging'] . "\n";
           print "  <td>" . $item['netto'] . "\n";
           print "</tr>\n";
           break;
    }                                    
}