Как перемешать два массива для покерного оценщика
Я работаю над покерной программой. У меня есть некоторые проблемы, выясняющие, как тасовать. Я должен использовать массивы. Я не могу использовать перечисления или списки. я знаю, что есть гораздо лучшие способы сделать эту программу, но дело в том, чтобы понять массивы.
У меня возникли проблемы с выяснением того, как перетасовать мою колоду карт. Я стараюсь сделать это как можно проще, поэтому у меня есть один класс, чтобы взять карты колоды и перемешать их.
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, основанный на другом вопросе, который я нашел здесь, но это было только для одного массива. Я не уверен, что логика правильна для метода случайного выбора. Я также не совсем уверен, как вызвать его в моем основном методе.
Как получить массивы из класса Card в класс Main, когда я вызываю timsCards.shuffle?
РЕДАКТИРОВАТЬ: Итак, я попытался редактировать это так, но, похоже, ничего не делает.
public void shuffle()
{
Collections.shuffle(Arrays.asList(suits));
Collections.shuffle(Arrays.asList(values));
System.out.println(Arrays.toString(values) + " of " + Arrays.toString(suits));
}
4 ответа
Что касается вашего последнего вопроса, относительно того, как получить массив из функции shuffle в основную функцию, вы должны сделать так, чтобы ваша функция shuffle возвращала массив и вызывала его так:
shuffledCards[] = timsCards.Shuffle(...);
Я понимаю, что другие люди предоставили другие решения, но вы упомянули, что цель состоит в том, чтобы понять массивы, поэтому я подумал, что упомяну, что это достигнет того же самого.
Кроме того, хотя я, по общему признанию, не проверял это, кажется, что ваш набор перетасовок будет перетасовывать каждую масть внутри себя, но не колоду в целом. Вы можете подумать о более креативном решении этого (если вы не собираетесь использовать Collections.shuffle()
)
В идеале я могу придумать 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
Если вы хотите написать метод случайного воспроизведения самостоятельно, вы можете сделать это следующим образом.
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);
}
Таким образом, вы можете перетасовывать массивы любых произвольных объектов, а не только строк. Возможно, вы захотите заполнить массив объектами, представляющими карты, а затем перемешать это.
Есть несколько вещей, которые нужно улучшить в вашем примере.
Во-первых, костюмы ("Пики", "Клубы", "Сердца", "Бриллианты") и ценности следует манипулировать с помощью типа Enum, а не String. Это будет легче читать и отлаживать. Вы можете реализовать массив enum, если хотите.
Только ОДИН случайный объект достаточно хорош. И вы должны использовать семя, если вы надеетесь на непредсказуемое перемешивание...
То, как вы перемешиваете каждый массив, является правильным, но НЕ глобальным. Здесь вы суфле масти, а внутри масти вы перетасовываете значения, но все алмазы остаются вместе... Если вы хотите перетасовать колоду карт (как я себе представляю), то вы должны реализовать только ОДНУ коллекцию / массив: массив карт и каждая карта является уникальной парой мастей, стоимостью.
Что касается вашего последнего вопроса, я рекомендую использовать "shuffle" как фабрику (поэтому она должна быть статичной), которая возвращает колоду карт в случайном порядке. Если вы предпочитаете объектный метод (NO STATIC), тогда вы должны реализовать класс Deck, тогда shuffle будет означать shuffle THIS.