java - 如何修复此单人骰子游戏(4 - 4 面骰子)的循环问题?扫描仪输入无法产生正确输出的问题
问题描述
// 我整天都在做这个,但似乎仍然卡住了。// 我没有收到任何明显的错误,但循环似乎被破坏了。// 我是初学者,所以很可能我错过了一些重要的东西,但只是忽略了它。// 这个作业是在午夜为我的班级交的,哈哈。// 我觉得我很好地构建了基本格式,但是我对使用循环的不熟悉真的让我很吃惊。我在其他地方看过网上,但人们制作的许多“骰子”程序只涉及一个 6 面骰子,不涉及基于回合的用户输入。// 任何有用的提示都会很棒,有没有更有效的方法来构建这个游戏?我知道创建多个类会清理程序的外观,但我现在真的只是在寻找功能。
package prgm06;
import java.util.Scanner;
public class DiceGame
{
public static void main(String []args) //main DiceGame loop.
{
String answer;
Scanner stdIn = new Scanner(System.in);
int userWin = 0, userLose = 0, turnCounter = 0;
System.out.println("\t" + "Welcome to Computer Dice");
System.out.println("-----------------------------------------");
System.out.println("The outcome of your roll will determine" + "\n" + "if you win or lose the round." + "\n");
System.out.println("Any Quad and you win.");
System.out.println("Any Triple and you win.");
System.out.println("Any High Pair and you win.");
System.out.println("Anything else and you lose.");
System.out.println("-----------------------------------------");
System.out.println("Do you wish to play? [y,n]: ");
do { // I always want the dice to roll unless "n" is selected.
answer = stdIn.next();
int d1 = (int)(Math.random() * 4) + 1;
int d2 = (int)(Math.random() * 4) + 1;
int d3 = (int)(Math.random() * 4) + 1;
int d4 = (int)(Math.random() * 4) + 1;
}
while(answer.equalsIgnoreCase("y")); // issues with "y" not printing if/ else statements
{
int d1 = (int)(Math.random() * 4) + 1;
int d2 = (int)(Math.random() * 4) + 1;
int d3 = (int)(Math.random() * 4) + 1;
int d4 = (int)(Math.random() * 4) + 1;
System.out.println(d1 + "\t" + d2 + "\t" + d3 + "\t" + d4);
if ((d1 == d2) && (d1 == d3) && (d1 == d4))
{
userWin++;
System.out.println("\n" + "Round Results: Win");
System.out.println(turnCounter + " Rounds played.");
}
else
{
userLose++;
System.out.println("\n" + "Round Results: Loss");
System.out.println(turnCounter + " Rounds played.");
}
}
// do
{
answer = stdIn.next(); // I'm not sure if i need to keep using this at each segment
}
for(answer.equalsIgnoreCase("n");; // will not print on first user input of "n".
{
// System.out.println();
System.out.println("Game Results:");
System.out.println("User won: " + userWin + " Games.");
System.out.println("User lost: " + userLose + " Games.");
if (userWin > userLose)
{
System.out.println("Your win/loss ratio is: " + (userWin/userLose) + " Good Job!");
System.out.println(turnCounter + " Rounds played.");
}
else if (userWin < userLose)
{
System.out.println("Your win/loss ratio is: " + (userWin/userLose) + " You shouldn't bet money on this game...");
System.out.println(turnCounter + " Rounds played.");
}
else
{
System.out.println("Your win/loss ratio is: 1.0 .");
System.out.println(turnCounter + " Rounds played.");
}
break;
}
}
}
解决方案
我已经编辑了你的代码。有些错误与语法有关,有些可能与逻辑流程有关。这应该可以作为基础,您可以根据需要对其进行修改和改进:
import java.util.Scanner;
public class DiceGame {
public static void main(String []args) //main DiceGame loop.
{
String answer;
Scanner stdIn = new Scanner(System.in);
int userWin = 0, userLose = 0, turnCounter = 0;
System.out.println("\t" + "Welcome to Computer Dice");
System.out.println("-----------------------------------------");
System.out.println("The outcome of your roll will determine" + "\n" + "if you win or lose the round." + "\n");
System.out.println("Any Quad and you win.");
System.out.println("Any Triple and you win.");
System.out.println("Any High Pair and you win.");
System.out.println("Anything else and you lose.");
System.out.println("-----------------------------------------");
do { // I always want the dice to roll unless "n" is selected.
System.out.println();
System.out.println("Do you wish to play? [y,n]: ");
answer = stdIn.next();
if (answer.equalsIgnoreCase("y")) {
turnCounter++;
int d1 = (int)(Math.random() * 4) + 1;
int d2 = (int)(Math.random() * 4) + 1;
int d3 = (int)(Math.random() * 4) + 1;
int d4 = (int)(Math.random() * 4) + 1;
System.out.println(d1 + "\t" + d2 + "\t" + d3 + "\t" + d4);
if ((d1 == d2) || (d1 == d3) || (d1 == d4) || (d2 == d3) || (d2 == d4) || (d3 == d4) {
userWin++;
System.out.println("\n" + "Round Results: Win");
System.out.println(turnCounter + " Rounds played.");
} else {
userLose++;
System.out.println("\n" + "Round Results: Loss");
System.out.println(turnCounter + " Rounds played.");
}
System.out.println("Game Results:");
System.out.println("User won: " + userWin + " Games.");
System.out.println("User lost: " + userLose + " Games.");
System.out.println("Your win/loss ratio is: " + userWin + ":" + userLose);
if (userWin > userLose) {System.out.println("Good Job!");}
if (userWin < userLose) {System.out.println("You shouldn't bet money on this game...");}
System.out.println(turnCounter + " Rounds played.");
}
} while(answer.equalsIgnoreCase("y"));
}
}
需要注意的几点:
只要用户输入“y”,游戏就会继续运行,因为这是您的条件:answer.equalsIgnoreCase("y")。
我更改了获胜条件逻辑以使用逻辑 OR 运算符检查至少一对
我删除了赢/输比率结果的除法运算符,并将其替换为赢:输的显示;如果您希望它计算实际百分比或小数值,这可以更改,但您必须检查 loss == 0 的情况以防止除以零错误
Do-While 循环应该包含从头到尾的所有游戏玩法,因此要求您再次玩的问题应该在此循环的开始或结束时出现(我将其放在开头)
推荐阅读
- java - 如何记录 Java Record 参数?
- android - React Native Expo Android WebView
- r - 通过 tryCatch 中的函数内部的 stop() 捕获故意生成的错误
- swiftui - presentationMode.wrappedValue.dismiss() 无法正常工作
- elasticsearch - 将数据发布到 Elastic Search 变得越来越昂贵
- c# - 使用 Serilog 记录 Elasticsearch 而无需 Microsoft 日志记录
- javascript - 添加新的键值对
- html - 导航栏按钮未出现引导程序 4
- mysql - MySQL - 查询没有返回正确的结果
- angular - Bundle.js 从列表中丢失