【问题标题】:How to shuffle two array for poker evaluator如何为扑克评估器洗牌两个数组
【发布时间】:2014-07-17 18:32:22
【问题描述】:

我正在开发一个扑克程序。我在弄清楚如何洗牌时遇到了一些问题。我必须使用数组。我不能使用枚举或列表。我知道有更好的方法来制作这个程序,但重点是理解数组。

我在弄清楚如何洗牌时遇到了一些问题。我试图让这件事尽可能简单,所以我有一个班级可以拿到牌组并洗牌。

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

public class Card 
{


    String[] suits = { "Spades", "Clubs", "Hearts", "Diamonds" };
    String[] values = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"};

    public Card()
    {

    }

        public void getCards()
        {
           for(int indexSuit = 0; indexSuit < suits.length; indexSuit++)
           {

              String suit = suits[indexSuit];
              System.out.print(suit + " ");

               for(int indexType = 0; indexType < values.length; indexType++)
               {
                  String type = values[indexType];
                  System.out.print(type + " ");
               }
           }

        }    

        public void shuffle(String[] suit, String[] value)
        {
            Random rndSuits = new Random();
            Random rndType = new Random();

            for(int indexSuit = suits.length - 1; indexSuit > 0; indexSuit--)
            {
                int index = rndSuits.nextInt(indexSuit + 1);

                String temp = suits[indexSuit];
                suits[indexSuit] = suit[index];
                suit[index] = temp;

                System.out.print(temp);

                for(int indexType = values.length -1; indexType > 0; indexType--)
                {
                    int index2 = rndType.nextInt(indexType + 1);

                    String temp2 = values[indexType];
                    values[indexType] = value[index2];
                    value[index2] = temp2;

                    System.out.print(temp2);
                }
            }
        }

        public void deal()
        {

        }
}

这是我的主要内容:

public class FiveCardPoker 
{

    public static void main(String[] args){
    Card timsCards = new Card();

    timsCards.getCards();
    timsCards.shuffle(args, args);

    }

}

我试图根据我在此处找到的另一个问题编写 shuffle 方法,但它仅适用于单个数组。我不确定 shuffle 方法的逻辑是否正确。我也不完全确定如何在我的主要方法中调用它。

当我调用 timsCards.shuffle 时,如何将我的数组从 Card 类获取到 Main 类?

编辑:所以我尝试像这样编辑它,但它似乎没有做任何事情。

public void shuffle()
        {
            Collections.shuffle(Arrays.asList(suits));
            Collections.shuffle(Arrays.asList(values));
            System.out.println(Arrays.toString(values) + " of " + Arrays.toString(suits));
        }

【问题讨论】:

  • 提示:西装和排名可能更好地建模为枚举而不是字符串数组。
  • 我不能使用枚举,我需要学习如何使用数组。至于可能的重复,那是我获得初始代码的地方,但它仅适用于单个数组,我的似乎更复杂,并且不能完全回答我的问题。如果方法中有参数,如何调用函数。

标签: java arrays poker


【解决方案1】:

我能想到的理想方式是,您可以从这些数组中创建一些Collection 并使用

Collections.shuffle() 方法。

代码-

 String[] suits = {"Spades", "Clubs", "Hearts", "Diamonds"};
 List<String> list = Arrays.asList(suits);
 Collections.shuffle(list);
 System.out.println(list); //Prints shuffled list

Javadoc

【讨论】:

    【解决方案2】:

    关于你的最后一个问题,关于如何将数组从 shuffle 函数内部获取到 main 函数中,你应该让你的 shuffle 函数返回一个数组,并像这样调用它:

    shuffledCards[] = timsCards.Shuffle(...);
    

    我知道其他人提供了其他解决方案,但你提到目的是理解数组,所以我想我会提到这将完成同样的事情。

    另外,虽然我承认没有测试过,但似乎你的洗牌阵列会洗牌本身的每套花色,而不是整个套牌。你可能想考虑一个更有创意的解决方案(如果你不打算使用Collections.shuffle()

    【讨论】:

      【解决方案3】:

      如果你想自己写一个 shuffle 方法,你可以这样做。

      static Random rnd = new Random();
      
      static void shuffle(Object[] array) {
        for(int index1 = array.length - 1; index1 > 0; index1--) {
          int index2 = rnd.nextInt(index1 + 1);
          Object temp = array[index1];
          array[index1] = array[index2];
          array[index2] = temp;
        }
      }
      
      public static void main(String[] args) {
        String[] suits = { "Spades", "Clubs", "Hearts", "Diamonds" };
        String[] values = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"};
      
        shuffle(suits);
        shuffle(values);
      }
      

      这样您就可以随机播放任意对象的数组,而不仅仅是字符串。您可能希望用代表卡片的对象填充数组,然后将其洗牌。

      【讨论】:

        【解决方案4】:

        您的示例中有几处需要改进。

        1. 首先,花色(“Spades”、“Clubs”、“Hearts”、“Diamonds”)和值应该使用 Enum 类型而不是 String 来操作。它会更容易阅读和调试。如果你愿意,你可以实现一个枚举数组。

        2. 只有一个随机对象就足够了。如果您希望进行不可预测的洗牌,您应该使用种子...

        3. 你如何洗牌每个数组是正确的,但不是全局数组。在这里你打乱西装,在西装里面你打乱价值,但所有的钻石都在一起...... 如果你想洗一副纸牌(就像我想象的那样),那么你应该只实现一个集合/数组:一组卡片,每张卡片都是一个独特的情侣套装,价值。

        对于您的最后一个问题,我建议将“洗牌”实现为一个工厂(因此它应该是静态的),它返回一副洗牌纸牌。如果你更喜欢对象方法(NO STATIC),那么你应该实现一个 Deck 类,那么 shuffle 将意味着 shuffle THIS deck。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-21
          • 1970-01-01
          • 2017-03-26
          • 1970-01-01
          • 2018-08-25
          相关资源
          最近更新 更多