Java 石头剪刀布游戏-效率?
我为我的CS班(高中四年级)做了一个石头剪子游戏,老师给我的shell文件指出,我必须在跑步者中加入do-while循环,但我不明白为什么?我的代码行得通,但她说最好在runner中编写?为什么?还有,我怎样才能写得更有效?(注意:我是一个完全的初学者,在上这门课之前,我对编码一无所知。我还没有学会递归。) 我的代码:Java 石头剪刀布游戏-效率?,java,Java,我为我的CS班(高中四年级)做了一个石头剪子游戏,老师给我的shell文件指出,我必须在跑步者中加入do-while循环,但我不明白为什么?我的代码行得通,但她说最好在runner中编写?为什么?还有,我怎样才能写得更有效?(注意:我是一个完全的初学者,在上这门课之前,我对编码一无所知。我还没有学会递归。) 我的代码: import java.util.Random; import java.util.Scanner; public class RockPapersScissors { pr
import java.util.Random;
import java.util.Scanner;
public class RockPapersScissors {
private String user;
private int computer;
public RockPapersScissors(){
setPlayers(" ");
}
public RockPapersScissors(String s){
setPlayers(s);
}
public void setPlayers(String s){
user=s;
}
public void play(){
Scanner keyboard = new Scanner(System.in);
Random num = new Random();
int numUser = 0;
String playAgain = "";
do{
System.out.print("Rock-Paper-Scissors - pick your weapon[R,P,S] :: ");
user = keyboard.next();
System.out.println("player has "+ user);
switch(user){
case "R": numUser = 0; break;
case "P": numUser = 1; break;
case "S": numUser = 2; break;
case "r": numUser = 0; break;
case "p": numUser = 1; break;
case "s": numUser = 2; break;
default: System.out.println("Please enter a valid choice. Restart game.\n"); continue;
}
computer = num.nextInt(3);
switch(computer){
case 0: System.out.println("computer has R"); break;
case 1: System.out.println("computer has P"); break;
case 2: System.out.println("computer has S"); break;
}
if(numUser == computer){
System.out.println("!Draw Game!");
}else if(numUser == 0){
if(computer == 1){
System.out.println("!Computer Wins <<Paper Covers Rock>>!");
}if(computer == 2){
System.out.println("!Player Wins <<Rock Breaks Scissors>>!");
}
}else if(numUser == 1){
if(computer == 2){
System.out.println("!Computer Wins <<Scissors cuts paper>>!");
}if(computer == 0){
System.out.println("!Player Wins <<Paper Covers Rock>>!");
}
}else if(numUser == 2){
if(computer == 0){
System.out.println("!Computer Wins <<Rock Breaks Scissors>>!");
}if(computer == 1){
System.out.println("!Player Wins <<Scissors cuts paper>>!");
}
}
System.out.print("\nDo you want to play again? ");
playAgain = keyboard.next();
System.out.println("\n");
}while(playAgain.equals("y") || playAgain.equals("yes") || playAgain.equals("Y"));
System.out.println("Goodbye.");
keyboard.close();
}
}
我想说,每一轮石头/布/剪刀都是独立的。我会编写一个方法,接受玩家1和2的值并返回一个获胜者。让它发挥作用,然后把它放在游戏循环中一遍又一遍地玩 可能存在第二个重载版本的play()方法,该方法带有一个嵌入式计算机播放器,可以随机选择并调用两个播放器版本 也许这也是你老师的意思。为什么不问问他们,而不是让我们了解他/她的想法?用苏格拉底的方法你可以学到很多东西
不要担心效率;对于这样一个微不足道的应用程序来说,这并不重要。让它运行;使其正确运行;让它快速运行。这一切都取决于“游戏”是什么。如果游戏被假定为单轮RPS,没有记分,那么老师指定的解决方案是好的 然而,只要你需要在两轮比赛之间保持某种形式的状态,比如得分,那么你就必须做出一个设计决定:跑步者是否包含保持得分的逻辑,或者游戏是否包含?通常,一个人会让游戏记分,跑步者应该尽可能少地了解游戏的内部逻辑 在另一种情况下,可能会要求您展开跑步者,以便您可以在两种不同的游戏中进行选择。第二个游戏可能是“黑杰克”,在这种情况下,你不仅需要记录分数,还需要记录哪些牌已经玩过。正如你所看到的,跑步者的复杂性会随着你老师的方法而不必要地增加 老师应该给你更好的要求,或者你应该问。
顺便说一句,这种情况在现实世界中经常发生。如果这段代码真的有效,那么这个问题可能更适合。我认为这更多地归结为你的输入(你的扫描器)与游戏模型(你的游戏方法)相关联的事实。如果您想修改此代码以使用输入文件而不是标准输入,则需要修改您的播放方法。如果那是他们想要的,那就不是积极的,但那是我的第一个想法。
public class RPSRunner {
public static void main(String[] args) {
RockPapersScissors test = new RockPapersScissors();
test.play();
}
}