关于剪刀摇滚纸游戏的Java代码

时间:2012-03-02 00:11:07

标签: java switch-statement

我已经学习了1个月的Java。我对我的代码有疑问。 有一些问题。如果我按0,结果只有“计算机胜利”和“领带”两种情况。因此,当我按下1和2时,它只出现两个。这里有什么不对?

import java.util.Scanner;
public class Hm3 {
public static void main (String[] args) {
    int Computer=0,Player=0,tie=0,compic=0,pscore=0;tie=0;
    int end = 0;
    Scanner scan = new Scanner(System.in);
    while (end < 3) {
        System.out.print("Enter 0 for Scissors, 1 for Rock, and 2 for Paper : ");
        pscore = scan.nextInt();
        compic = (int)(Math.random()*2);

        switch (pscore){            
        case 0 :
            if (compic == 0){
                System.out.println("Tie");
                tie++;
            }else if (compic == 1){
                System.out.println("Computer Win");
                Computer++;
            }else{
                System.out.println("Player Win");
                Player++;
                end++;
            }
            break;
        case 1 :
            if (compic == 0){
                System.out.println("Player Win");
                Player++;
                end++;
            }else if (compic == 1){
                System.out.println("Tie");
                tie++;
            }else{
                System.out.println("Computer Win");
                Computer++;
            }break;
        case 2 :
            if (compic == 0){
                System.out.println("Computer Win");
                Computer++;
            }else if (compic == 1){
                System.out.println("Player Win");
                Player++;
                end++;
            }else{
                System.out.println("Tie");
                tie++;
            }break;
        default :               
            System.out.println("The wrong value");              
            break;
        }      
  }
    System.out.println("");
    System.out.println("The player wins : " + Player);
    System.out.println("The computer wins : " + Computer);
    System.out.println("Tie : " + tie);
 }
}

3 个答案:

答案 0 :(得分:3)

是的我也相信问题在于您的随机数生成。在处理整数时,我更喜欢使用此方法,因为不涉及舍入或转换:

Random random = new Random(); //create a random object

random.nextInt(3); //will return a random integer from 0 to 2

nextInt()方法的括号中的数字是范围,如果你想从1变为3而只是将其改为

random.nextInt(3) + 1;

答案 1 :(得分:2)

您正在生成0到1之间的随机整数,而不是0到2.要修复,请执行Math.random()*3

答案 2 :(得分:0)

您已获得答案,这不是代码审查,但我无法在评论中符合此建议。而不是交换机的三个非常相似的子交换机(这是你实际拥有的,只需使用if-else),你可以通过将计算机的选择偏移一些位来决定这一点(2只是你需要的)编码三个选项,但是当你必须使用十六进制而不是二进制文字时,4更方便)并将它与玩家的选择进行或运算以产生一个编码两个移动的数字。

// 0:scissors, 1:rock, 2:paper
private String winner(int player, int computer) {
  switch (player | (computer<<4)) {
    case 0:
    case 0x11:
    case 0x22:
      return "Tie";
    case 0x02:  // computer:scissors, player:paper
    case 0x10:
    case 0x21:
      return "Computer wins";
    case 0x01:
    case 0x12:
    case 0x20:
      return "Player wins";
    default:
      return "error";
  }
}