【问题标题】:Arrays, algorithms and elements数组、算法和元素
【发布时间】:2013-10-07 02:38:06
【问题描述】:

我正在尝试通过 java 制作扑克游戏。 我想做的第一件事是使用数组分发 5 张卡。我已经完成了分发部分,但是如何防止相同的卡被分发两次。换句话说,我如何检查一个数组是否已经包含一个元素。我希望它能够检测元素是否已经存在于数组中,如果存在,我希望能够只更改已发出两次的卡片,非常感谢您的帮助。 我的代码在下面,

      import java.util.Random;
      import java.util.Scanner;
      import java.util.Arrays;


    public class Poker
    {
        public final static String[] numbers = {"❤","♠","♦","♣"};  
        public final static String[] sign = {"1","2","3","4","5","6","7","8","10","J","Q","K","A"};
        private String[] hand = {"","","","",""};
        private boolean found;
        private Random random;

       public Poker()

        {

           found = false;
           String hand[] = {"","","","",""};
           int tokens = 10;

           Scanner in = new Scanner(System.in);
           random = new Random();
        }

       public void handOut()
        {

           for (int i = 0; i < 5; i++)
           {
               int numberRandom = random.nextInt(numbers.length);
               int signRandom = random.nextInt(sign.length);
               String pickedNumber = numbers[numberRandom];
               String pickedSign = sign[signRandom];
               String combinedSigns = pickedSign + pickedNumber;
               hand[i] = combinedSigns;
           System.out.print(hand[i] + " ");

       }
        System.out.println("\n");

   }
   }

【问题讨论】:

    标签: java arrays element


    【解决方案1】:

    您选择的术语是...错误...有趣:-)

    卡面值是“面值”,不是符号。而且无论是红心还是钻石等等,都是它的“花色”而不是它的数量。

    但是,关于这个问题。我相信最好的方法是用你的面值和花色数组构建一整套 52 张牌的牌组,然后使用 Fisher Yates 洗牌来分配牌。

    这是一种从数组中随机选择元素而不重复的绝妙方法。美妙之处在于,数组中的项目实际上不需要预先洗牌。可以在here找到有关其工作原理的详细信息。

    【讨论】:

      【解决方案2】:

      如果您可以使用集合框架而不是数组,请创建一个 Stack 并用所有 52 张卡片填充它。然后拨打Collections.shuffle()就可以了。 最后设置hand[i]=(deck name).pop()

      一旦卡片从堆叠中弹出,它将从牌堆中移除,因此无法再次发牌。

      【讨论】:

        【解决方案3】:

        您要做的是将代码分解为不同的方法。你应该有一个生成一张牌的方法,一个检查手中是否有牌的方法,以及一个分配牌到手牌的方法。

        public String generateCard() {
            int numberRandom = random.nextInt(numbers.length);
            int signRandom = random.nextInt(sign.length);
            String pickedNumber = numbers[numberRandom];
            String pickedSign = sign[signRandom];
            return pickedSign + pickedNumber;
        }
        
        public static boolean cardIsInHand(String card) {
            for(int i = 0; i < 5; i++) {
                if(hand[i] != null && hand[i].contains(card)) {
                    return true;
                }
            }
        
            return false;
        }
        
        public static void handout() {
            for (int i = 0; i < 5; i++) {
                String card = generateCard();
        
                while(cardIsInHand(card)) {
                    card = generateCard();
                }
        
                hand[i] = card;
            }
        }
        

        【讨论】:

        • 对于public static void handout(),如果你下去,为什么用while(cardIsInHand(card))而不是if(cardIsInHand(card))?
        • while 循环可确保继续生成新卡片,直到生成尚未在手中的卡片。 if 语句只会检查第一张牌是否在手上,而将第二张牌放在手上而不做任何检查。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多