【问题标题】:Rockpapergame with rounds and counter variables - java带有轮数和计数器变量的 Rockpapergame - java
【发布时间】:2020-08-25 08:17:51
【问题描述】:

我正在创建一个具有以下要求的摇滚纸项目:


连续玩石头、纸、剪刀,直到其中一名玩家赢得三轮。此时,程序会输出获胜者以及他们获胜所用的回合数。如果10轮后没有获胜者,则比赛为平局


似乎缺少一些我不太能够理解或注意到的东西。我如何让我的游戏在回合结束后停止并宣布获胜?

注意:不允许使用数组、扫描仪以外的外部库或任何 java 内置方法

这是我的尝试:

import java.util.Scanner;
public class Rockpaper{
public static void main(String[]args){
    Scanner keyboard = new Scanner(System.in);
    String player1 = keyboard.next();
    String player2 = keyboard.next();
    String player = "Player1";
    int round = 1;
    boolean go = true;
    boolean win = false;
    while(go){
    if (player1.equals("r") && player2.equals("p")){
        win = true;
    }
    else if (player1.equals("p") && player2.equals("r")){
        win = true;
    }
    else if (player1.equals("p") && player2.equals("s")){
        win = true;
    }
    else if (player1.equals("s") && player2.equals("p")){
        win = true;
    }
    else if (player1.equals("s") && player2.equals("r")){
        win = true;
    }
    else if (player1.equals("r") && player2.equals("s")){
        win = true;
    }
    else if (player1.equals("r") && player2.equals("r")){
        win = false;
    }
    else if (player1.equals("p") && player2.equals("p")){
        win = false;
    }
    else if (player1.equals("s") && player2.equals("s")){
        win = false;
    }
    if (round < 5){
        System.out.println(win+" after "+round+" rounds!");
        go = false;
        }else{
            System.out.println("Tie - No winner after "+round+" rounds!");
        }
    if (player.equals("Player1"){
        Player = "Player2";
    }else{
        Player = "Player1";
        }
      }
   }
}

我看到的问题是需要有一个单独的变量来计算每个获胜可能性,例如,“win1”将计算 player1 获胜的可能性,而“win2”将计算 player2 获胜的可能性。我不太确定轮数变量最初会开始计算轮数,最多 10 轮,这是最大值。 示例输入/输出:

【问题讨论】:

  • 我没有看到你在任何地方使用 keyboard 变量
  • 你在哪里声明和更新player1?另外,当有人获胜退出 while 循环时,您能否不只是中断或将 go 变量设置为 false?
  • 我没有看到它的需要
  • @user 是的,你可以这样做
  • 那么玩家是谁,只是使用随机值的计算机?

标签: java loops if-statement while-loop


【解决方案1】:

目前您在循环之前只读取一次输入:

String player1 = keyboard.next();
String player2 = keyboard.next();

每场比赛结束后,您应该询问球员是否应该继续比赛。如果是这样,那么您必须再次征求他们的意见。也就是说,只需在循环内移动“playerX”变量声明和初始化:

//comment/remove these
//String player1 = keyboard.next();
//String player2 = keyboard.next();

//inside the loop
while(go){
    String player1 = keyboard.next();
    String player2 = keyboard.next();

    if (player1.equals("r") && player2.equals("p")){
        /* rest of your code */

}

另外,本节:

if (round < 5){
    System.out.println(win+" after "+round+" rounds!");
    go = false;
    }else{
        System.out.println("Tie - No winner after "+round+" rounds!");
    }
if (player.equals("Player1"){
    Player = "Player2";
}else{
    Player = "Player1";
    }
  }

有两件事看起来很奇怪:

  1. round 永远不会增加。
  2. round &lt; 5 之后的 else 将始终被执行,错误地指出有平局。
  3. 无需重新分配Player 变量以询问用户输入。相反,您可以使用 2 个变量来存储在游戏开始之前初始化的玩家名称。

还有一点:Scanner 的实例是Closeable,所以每次使用它来读取用户输入时,请确保实例在不再需要后关闭,在这种情况下,在结束时程序。

更多提示:

  • 将具有相同输出的多个 if/else 减少为单个 if 评估
  • 您可以使用一些方法来缓解游戏结果。

考虑到所有这些,您的代码可能如下所示:

import java.util.Scanner;

public class RockPaperScizzorGame {

    public static int getGameResult(String player1Move, String player2Move) {
        int result = 0; //assume the game will be a tie
        //player 2 wins
        if (player1Move.equals("r") && player2Move.equals("p")
            || player1.equals("p") && player2.equals("s")
            || player1.equals("s") && player2.equals("r")
                ) {
            result = 2;
        }
        //player 1 wins
        if (player1.equals("p") && player2.equals("r")
            || player1.equals("s") && player2.equals("p")
            || player1.equals("r") && player2.equals("s")) {
            result = 1;
        }
        //return the result: 0, 1 or 2
        return result;
    }

    public static void main (String[] args) {
        try (Scanner keyboard = new Scanner(System.in)) {
            String player1Name = "Player 1";
            String player2Name = "Player 2";

            int round = 0;
            boolean go = true;

            int winsPlayer1 = 0;
            int winsPlayer2 = 0;

            while (go) {
                System.out.println("Make your move " + player1Name + ": ");
                String player1Move = keyboard.next();
                System.out.println("Make your move " + player2Name + ": ");
                String player2Move = keyboard.next();
                int gameResult = getGameResult(player1Move, player2Move);
                switch(gameResult) {
                    case 1:
                        winsPlayer1++;
                        break;
                    case 2:
                        winsPlayer2++;
                        break;
                }
                round++;
                if (winsPlayer1 == 3) {
                    System.out.println(player1Name + " won after " + round + " rounds!");
                    go = false;
                } else if (winsPlayer2 == 3) {
                    System.out.println(player2Name + " won after " + round + " rounds!");
                    go = false;
                } else {
                    if (round == 5 && winsPlayer1 < 3 && winsPlayer2 < 3) {
                        System.out.println("Tie - No winner after "+round+" rounds!");
                    go = false;
                }
            }
        } catch (IOException e) {
            System.out.println("Issues when trying to accept user input.");
            e.printStacktrace();
        }
    }
}

您可以进一步改进代码:

  • 使用更多的方法来简化main方法中的代码。
  • 由于您的主循环更多地依赖于计数器而不是布尔标志,因此您可以使用for 循环而不是while
  • 您可以要求用户输入球员的姓名。
  • 您可以创建一个类来封装玩家的数据:姓名、currentMove、获胜次数。

【讨论】:

  • 感谢您的帮助,但如果我不允许 switch 并且您使用的“案例”我会用什么替换它?
  • 改用普通的if/else
【解决方案2】:

您的代码有问题:

  1. 不对单个玩家使用单独的变量。
  2. 不将输入语句放入循环中,因此输入语句只运行一次。
  3. 不更改变量round 的值,而是在条件if (round &lt; 5) 中使用它的值,如果round 的值没有增加,它将始终评估true

解决方案

import java.util.Scanner;

public class Rockpaper {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);

        int round = 1;
        boolean go = true;
        int player1Score = 0;
        int player2Score = 0;

        while (go && round <= 10) {
            String player1 = keyboard.next();
            String player2 = keyboard.next();
            if (player1.equals("r") && player2.equals("p")) {
                player2Score++;
            } else if (player1.equals("p") && player2.equals("r")) {
                player1Score++;
            } else if (player1.equals("p") && player2.equals("s")) {
                player2Score++;
            } else if (player1.equals("s") && player2.equals("p")) {
                player1Score++;
            } else if (player1.equals("s") && player2.equals("r")) {
                player2Score++;
            } else if (player1.equals("r") && player2.equals("s")) {
                player1Score++;
            }
            if (player1Score >= 3) {
                System.out.println("Player1 wins " + " after " + round + " rounds!");
                go = false;
            }
            if (player2Score >= 3) {
                System.out.println("Player2 wins " + " after " + round + " rounds!");
                go = false;
            }
            round++;
        }

        if (round > 10) {
            System.out.println("Tie - No winner after " + (round - 1) + " rounds!");
        }
    }
}

第一次运行示例:

p
r
r
s
s
s
r
r
p
r
Player1 wins  after 5 rounds!

第二次样品运行:

p
p
p
r
r
r
s
s
p
p
s
s
s
s
p
p
r
p
s
p
Tie - No winner after 10 rounds!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-01-23
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多