一个猜拳的程序,这个程序是2个人猜拳,现在要修改成多人猜拳。该怎么做啊,请高手指点。具体要改那些地方啊?多人猜拳规则,石头剪刀布,只有2种的时候才能判定胜负。所有人出相同的拳的时候,和局。public class ObjectCaiquan{
    public static void main(String[] args) {
       Judge J = new Judge();  //judge  J
       Player a = new Player("a");//player 1
       Player b = new Player("b");//player 2
       J.startCaiquan(a, b);
       }
   }
       
       
  
  //Judge class
public class Judge{
    public void startCaiquan(Player player1, Player player2){
        System.out.println("Start Caiquan (chapter 3 version)¥n");
       //猜拳3次
for (int cnt = 0; cnt < 3; cnt++){
     System.out.println("Game " + (cnt + 1));
     Player winner = judgeCaiquan(player1, player2);//判断胜负
     if (winner != null){
      System.out.println(winner.getName() + " is winner!¥n");        
      winner.notifyResult(true);
      }  
      else {     
      System.out.println("draw.¥n");
      }
}

System.out.println("Game over.¥n");
//最终判断
        Player finalWinner = judgeFinalWinner(player1, player2);
        //表示结果
System.out.print( player1.getWinCount() + " vs " + player2.getWinCount() + ", ");  
if (finalWinner != null)  {   
            System.out.println(finalWinner.getName() + " is final winner!¥n"); 
}   
else{   
System.out.println("a draw game!¥n");
}
     }
     private Player judgeCaiquan(Player player1, Player player2) {
          Player winner = null;
  int player1hand = player1.showHand(); //player1出拳
  int player2hand = player2.showHand(); //player2出拳
  printHand(player1hand);
  System.out.print(" vs. ");
  printHand(player2hand);
  System.out.print("¥n");
         //player1取胜的条件
  if ((player1hand == Player.STONE && player2hand == Player.SCISSORS)
  || (player1hand == Player.SCISSORS && player2hand == Player.PAPER)
  || (player1hand == Player.PAPER && player2hand == Player.STONE)){
          winner = player1;
  }
          //player2取胜的条件
 else if (  (player1hand == Player.STONE && player2hand == Player.PAPER)
 || (player1hand == Player.SCISSORS && player2hand == Player.STONE)
 || (player1hand == Player.PAPER      
 && player2hand == Player.SCISSORS))  
 {
          winner = player2;
 }
 return winner;
     }
     
      private Player judgeFinalWinner(Player player1, Player player2){ 
              Player winner = null;
      int player1WinCount = player1.getWinCount(); //player1取胜数
      int player2WinCount = player2.getWinCount(); //player2取胜数
      if (player1WinCount > player2WinCount)      {
           winner = player1; //player1取胜
   }
       else if (player1WinCount < player2WinCount) {
          winner = player2; //player2取胜
}
return winner;//平局
}
     private void printHand(int hand){//出拳
         switch (hand)
 {
     case Player.STONE :
          System.out.print("STONE");
          break;
     case Player.SCISSORS :
          System.out.print("SCISSORS");
          break;
     case Player.PAPER :
          System.out.print("PAPER");
          break;
     default :
               break;
          }
     }
 }
 
 //player class
 public class Player{
      public static final int STONE = 0; //石头
      public static final int SCISSORS = 1; //剪刀
      public static final int PAPER = 2;//布
      private String name;
      private int winCount = 0;
      public Player(String name){
      this.name = name;
      }
      public int showHand(){//随机生成石头剪刀布
         int hand = 0;
 double randomNum = Math.random() * 3;
 if (randomNum < 1){
      hand = STONE;
  }
  else if (randomNum < 2){
      hand = SCISSORS;
  }
   else if (randomNum < 3){
      hand = PAPER;
   }
   return hand;
       }
       
      public void notifyResult(boolean result){//输赢结果,累计取胜数
          if (true == result)
           {
              winCount += 1;
           }
       }
       public int getWinCount()
       {
               return winCount; //返回取胜数
       }
       public String getName()//生成人名
       {
         return name;
       }
}

解决方案 »

  1.   

    代码格式乱七八糟的,看得头晕。先标记一下问个问题:多人猜的话,是不是依次要排出 第 1 名、第 2 名 啊?PS:判断谁是赢家可以这样做(假设:石头(0)、剪子(1)、布(2)),你的那个太复杂,不好。private Player judgeCaiquan(Player player1, Player player2) { 
         int player1hand = player1.showHand(); //player1出拳 
          int player2hand = player2.showHand(); //player2出拳 
          printHand(player1hand); 
         System.out.print(" vs. "); 
         printHand(player2hand); 
         System.out.print(" "); 
         if ( player1hand == player2hand ) {
              return null;             // 平局
          } else if( (player1hand + 1) % 3 == player2hand ) {
              return player1;          // player1 赢了
          } else {
              return player2;          // player2 赢了
          }
    }
      

  2.   

    public class ObjectCaiquan
    {
        public static void main(String[] args)
        {
            Judge J = new Judge();//judge J        Player a = new Player("a"); //player 1        Player b = new Player("b"); //player 2        J.startCaiquan(a, b);
        }
    }//Judge class
    public class Judge
    {
        
        public void startCaiquan(Player player1, Player player2)
        {
            System.out.println("Start Caiquan (chapter 3 version)\n");        /*猜拳3回*/
            for (int cnt = 0; cnt < 3; cnt++)
            {
                System.out.println("Game " + (cnt + 1));            Player winner = judgeCaiquan(player1, player2);//判断胜负            if (winner != null)
                {
                    System.out.println(winner.getName() + " is winner!\n");                winner.notifyResult(true);
                }
                else
                {
                    System.out.println("draw.\n");
                }
            }        System.out.println("Game over.\n");        /*最终判定*/
            Player finalWinner = judgeFinalWinner(player1, player2);
            /*显示结果*/
            System.out.print(
                player1.getWinCount() + " vs " + player2.getWinCount() + ", ");        if (finalWinner != null)
            {
                System.out.println(finalWinner.getName() + " is final winner!\n");
            }
            else
            {
                System.out.println("a draw game!\n");
            }
        } 
        private Player judgeCaiquan(Player player1, Player player2)
        {
            Player winner = null;        int player1hand = player1.showHand();//出拳        int player2hand = player2.showHand();        printHand(player1hand);
            System.out.print(" vs. ");
            printHand(player2hand);
            System.out.print("\n");        /*player1取胜的条件*/
            if ((player1hand == Player.STONE && player2hand == Player.SCISSORS)
                || (player1hand == Player.SCISSORS && player2hand == Player.PAPER)
                || (player1hand == Player.PAPER && player2hand == Player.STONE))
            {
                winner = player1;
            }
           /*player2取胜的条件*/
            else if (
                (player1hand == Player.STONE && player2hand == Player.PAPER)
                    || (player1hand == Player.SCISSORS && player2hand == Player.STONE)
                    || (player1hand == Player.PAPER
                        && player2hand == Player.SCISSORS))
            {
                winner = player2;
            }
            return winner;
        }
        private Player judgeFinalWinner(Player player1, Player player2)
        {
            Player winner = null;        int player1WinCount = player1.getWinCount();//player1取胜数
            int player2WinCount = player2.getWinCount();//player2取胜数        if (player1WinCount > player2WinCount)
            {
                winner = player1;//player1取胜
            }
            else if (player1WinCount < player2WinCount)
            {
                winner = player2;//player2取胜
            }
            return winner;//平局
        }/*出拳*/
        private void printHand(int hand)
        {
            switch (hand)
            {
                case Player.STONE :
                    System.out.print("STONE");
                    break;            case Player.SCISSORS :
                    System.out.print("SCISSORS");
                    break;            case Player.PAPER :
                    System.out.print("PAPER");
                    break;            default :
                    break;
            }
        }
    }
    //player class
    public class Player
    {
    public static final int STONE = 0; //石头
    public static final int SCISSORS = 1; //剪刀
    public static final int PAPER = 2; //布
    private String name; private int winCount = 0;
    public Player(String name)
    {
    this.name = name;
    } /*随机生成石头剪刀布*/
    public int showHand()
    {
    int hand = 0; double randomNum = Math.random() * 3;
    if (randomNum < 1)
    {
    hand = STONE;
    }
    else if (randomNum < 2)
    {
    hand = SCISSORS;
    }
    else if (randomNum < 3)
    {
    hand = PAPER;
    } return hand;
    }
    /*输赢结果,累计取胜数*/
    public void notifyResult(boolean result)
    {
    if (true == result)
    {
    winCount += 1;
    }
    } /*自己取胜回数*/
    public int getWinCount()
    {
    return winCount;
    } /*生成名字*/
    public String getName()
    {
    return name;
    }
    }
      

  3.   

    把代码按下图的方法格式化一下:排名?怎么排?A 出 石头
    B 出 石头
    C 出 剪刀
    D 出 剪刀那 C 和 D 排第几名?排第 3 还是第 4?
      

  4.   

    排名也没有说清楚,与其说排名不如说是依次输出比较妥当。比如进行5回猜拳(可能5局都是平局)或者更多,要把5局中,每局获胜的人依次输出第一个贴有点乱来了,第2个贴用的是eclipse。贴上来就那样了
      

  5.   

    代码自己写 设计Q {拳头种类枚举}
    设计A 猜拳者 只有一个方法 获取出的Q
    设计B 管理者 {包含A的集合} 主要方法(获取集合中所有A的出Q,判断胜负)
      

  6.   

    import java.util.HashSet;
    public class ObjectCaiquan
    {
    /**
     * 猜拳者数
     */
    private static final int numOfPlayers=7;

        public static void main(String[] args)
        {
            //裁判
            Judge j = new Judge();
            
            HashSet players=new HashSet();
            
            if(!(numOfPlayers>=3)){
             System.out.println("The number of players should be more than 3.");
             return; .
            }        // Player1, 2, 3 ...
            for(int i=0; i<numOfPlayers; i++){
             Player p=new Player("Player"+(i+1));
             players.add(p);
            }        // 猜拳游戏开始
            j.startCaiquan(players, 5);
        }
    }
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;/**
     * judge class
     */
    public class Judge {

    public void startCaiquan(Collection players, int round) {
    // 开始猜拳
    System.out.println("Start Caiquan (Exercise 3 version)"); //猜拳次数
    for (int cnt = 0; cnt < round; cnt++) {
    // 第几回战
    System.out.println("\nGame " + (cnt + 1)); // 。
    Collection winners = judgeCaiquan(players); if (winners != null) {
    //表示胜者
    for (Iterator i = winners.iterator(); i.hasNext();) {
    Player p = (Player) i.next();
    System.out.println(p.getName() + " is winner!");
    p.notifyResult(true);
    }
    } else {
    // 平局
    System.out.println("draw.");
    }
    } // 猜拳结束
    System.out.println("\nGame over."); // 最终判定胜者
    Collection finalWinners = judgeFinalWinner(players); // 表示结果
    System.out.println("\nwithin "+players.size()+" players, "); if (finalWinners != null) {
    for (Iterator i = finalWinners.iterator(); i.hasNext();) {
    Player p = (Player) i.next();
    System.out.println(p.getName() + " is one of final winners!");
    }
    } else {
    System.out.println("a draw game!");
    }
    } /**
     * 判断出拳者的胜负
     */
    private HashSet judgeCaiquan(Collection players) {
    HashSet winner = null;
    HashSet handkind=new HashSet(); // 判断手的种类. // 全部player的出拳
    for(Iterator i=players.iterator(); i.hasNext(); ){
    Player p=(Player)i.next();
    p.showHand();
    System.out.print(hand(p.getHand())+" ");
    handkind.add(new Integer(p.getHand()));
    }
    System.out.println(".");
    if(handkind.size()!=2) return winner; // 重新猜拳
    winner=new HashSet();
    int winHand=0; // 记录2者之中的胜者
    // 石头胜
    if(handkind.contains(new Integer(Player.STONE)) && handkind.contains(new Integer(Player.SCISSORS))){
    winHand=Player.STONE;
    }
    // 剪刀胜
    else if(handkind.contains(new Integer(Player.PAPER)) && handkind.contains(new Integer(Player.SCISSORS))){
    winHand=Player.SCISSORS;
    }
    // 布胜
    else if(handkind.contains(new Integer(Player.STONE)) && handkind.contains(new Integer(Player.PAPER))){
    winHand=Player.PAPER;
    }
    else{
    System.out.println("False!");
    }

    for(Iterator i=players.iterator(); i.hasNext(); ){
    Player p=(Player)i.next();
    if(p.getHand() == winHand){
    winner.add(p);
    }
    } return winner;
    } /**
     * 判断最终胜者
     * 
     */
    private HashSet judgeFinalWinner(Collection players) {
    int maxwin=0; 
    // 最大胜数
    for(Iterator i=players.iterator(); i.hasNext(); ){
    Player p=(Player)i.next();
    if(p.getWinCount()>maxwin){
    maxwin=p.getWinCount();
    }
    }
    // 胜者的集合
    HashSet wins=new HashSet();
    for(Iterator i=players.iterator(); i.hasNext(); ){
    Player p=(Player)i.next();
    if(p.getWinCount()==maxwin){
    wins.add(p);
    }
    }
    // 最高胜数判断,没有胜者
    if(players.size() == wins.size()){
    wins=null;
    }
    return wins;
    } //表示出拳
    enum Hand{
    STONE,SCISSORS,PAPER
    }
    private String hand(Hand hand){
    switch (hand) {
    case STONE:
    return ("STONE   "); 
    case SCISSORS:
    return ("SCISSORS");
    case PAPER:
    return ("PAPER   ");
    default:
    return null;
    }
    }
    }
    //player class 
    public class Player
    {
            public static final int STONE = 0; 
    public static final int SCISSORS = 1; 
    public static final int PAPER = 2;         private String name;
            private int winCount = 0;
            
            public Player(String name)
    {
    this.name = name;
    }
            public int showHand()
    {
    int hand = 0; // 随机生成0.0~3.0小数
    double randomNum = Math.random() * 3;
    if (randomNum < 1)
    {
    hand = STONE;
    }
    else if (randomNum < 2)
    {
    hand = SCISSORS;
    }
    else if (randomNum < 3)
    {
    hand = PAPER;
    }
    return hand;
    }
    }得不到正确的结果