当前位置: 首页 > 知识库问答 >
问题:

带回合和计数器变量的Rockpapergame-java

端木高卓
2023-03-14

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

连续玩石头、布、剪刀,直到其中一个玩家赢得三轮。此时,程序输出获胜者和他们赢得的回合数。如果10轮后没有获胜者,比赛被宣布为平局

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

这是我的尝试:

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”将计算玩家1获胜的可能性,“win2”将计算玩家2获胜的可能性。我不太确定rounds变量,该变量最初将开始计算最大为10的轮数。输入/输出示例:

共有2个答案

赵华彩
2023-03-14

代码问题:

  1. 不为单个玩家使用单独的变量
  2. 不将输入语句放入循环中,因此输入语句只运行一次
  3. 不更改变量的值,round,而是在条件下使用其值,if(round
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!

宇文飞翮
2023-03-14

当前,在循环之前,只读取一次输入:

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. 回合永远不会增加。
  2. 轮之后的其他

还有一件事:Scanner的实例是可关闭的,因此每次使用它读取用户输入时,都要确保在不再需要后关闭该实例,在本例中,是在程序结束时。

更多提示:

  • 将几个具有相同输出的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方法中的代码
 类似资料:
  • 我正在查找与url匹配但返回自定义对象的记录。 我有这个模型。。 我想查询该模型并匹配url,但返回如下响应: 我需要能够通过将记录的ip与过程中的变量进行比较,动态计算反应的ip是否为真。 一次尝试是 但我似乎无法集中IP并查看我的变量IP是否在该数组中。 谢谢你的帮助。我第一次问!

  • 问题内容: 我在Sun的“ Core Servlets and JavaServer Pages vol 2”中看到了带有会话计数器的示例。 计数器仅仅是建立在和递增/递减会话数与/ : 侦听器在上下文中注册自身,因此可以访问它并获取计数器值。 没有同步块。 安全,不是吗? 可以缓存在CPU寄存器中,并且对于使用? 问题答案: Servlet 3.0的规范规定(第11.5节): 侦听器实例和线程

  • 问题内容: 我有一个变量,我想回显一个变量,例如,但是我得到了: bash:意外令牌“ $ x + 1”附近的语法错误 我怎样才能做到这一点? 问题答案: 不需要,POSIX shell允许进行算术评估: 参见 §2.6.4

  • 是否有一种方法来构建侦听器,以检测日期是否仍被传输到变量,如果是,则做一件事,当不做另一件事? 例如 直到“int counter1”增加设置布尔值(true)或打印或更改另一个int值为1 int计数器(不再增加或减少),设置布尔值(false),打印不同的东西,改变另一个int为2。 基本上变量改变加或减,做一件事停止改变,做另一件事重新开始改变,回去做第一件事等。 有办法做到这一点吗?没有明

  • 我想创建一个Docker映像,它充当一个可执行文件,用户将其作为环境变量传递一个令牌。该可执行文件包含用户应该通过dockers CMD传递的子命令(想想通过Env进行身份验证的git)。但是,Docker不会将CMD附加到入口点。我的Dockerfile的相关部分如下所示: 我希望 被处决。但是,如上所述,只有被执行,而CMD被忽略--无论我是在启动期间重写它还是在DockerFile中设置它。

  • 我正在开发一个API,它允许使用URL进行搜索,比如: 这个答案几乎是我想要做的,我只是找不到一种方法来定义括号内的值为“任何字符串”,而不是已知名称的列表。