Рандомизировать массив строк и отобразить все значения

Я делаю карточную игру, и я прибыл во время шаффлина.

Я должен перетасовать несколько карт (которые выбираются ранее от пользователя, поэтому они не всегда одинаковы), а затем отображать их пользователю одну за другой.

Поскольку я все еще развиваю игровую логику, я отображаю название карты, изменяя текст кнопки.

Но я застреваю, когда пытаюсь получить название карточек и установить их как текст кнопки.

Что происходит, я получаю пустую кнопку или просто с "Масонами" или "Странником" String. Фактически, если я проверяю журнал, я вижу, что все другие карты (символы) отображаются как "ноль".

Вот как я пытался достичь цели (да, я новичок):

Это голова:

int demoniac;
int guard;
int masons;
int medium;
int mythomaniac;
int owl;
int villager;
int werehamster;
int all;
int i;
int t;
String[] characters = new String[24];
Button randomButton;

Мой способ добавить все карты (символы):

public void addAll(){
for(i = 0; i < all; i++){
    add(demoniac, "Demoniac");
    add(guard, "Guard");
    add(medium, "Medium");
    add(mythomaniac, "Mythomaniac");
    add(owl, "Owl");
    add(werehamster, "Werehamster");
    add(villager, "Villager");
    add(masons, "Masons");
   }

}

Мой метод добавления и управления различными типами карт (персонажей):

public int add(int character, String name){
    if(character != 0 && name == "Villager"){
        for(t = 0; t < character; t++){
            i+=t;
            characters[i] = name;}
    }
    else if(character == 2 && name == "Masons"){
        characters[i] = name;
        i++;
        characters[i] = name;
        Toast.makeText(randomSelection.this, "works", Toast.LENGTH_SHORT).show();
    }else if(character != 0){
        characters[i] = name;
    }
    return i;
}

Чтобы рандомизировать:

 public void randomize(){
    Collections.shuffle(Arrays.asList(characters));
    for (int s = 1; s < characters.length; s++)
    {
        System.out.println(characters[s]);
    }

}

Способ отображения другой карточки (символа) каждый раз, когда пользователь нажимает кнопку:

public void show(View view){
    for (int s = 1; s < characters.length; s++)
    {
        randomButton.setText(characters[s]);
    }
}

РЕДАКТИРОВАТЬ:

Я заметил нет смысла forloop Я сделал, кстати, вы должны знать, хотя большинство персонажей только 1 в своем роде (демон, охранник и т. Д.), Есть 2 масона и от 5 до 12 жителей деревни, поэтому нам нужно получить эти intи добавить как можно больше Stringс Array столько, сколько нам говорят от тех ints.

Пример: если я получу 6 Villagers, я должен добавить String "Житель" 6 раз в String Array,

Тогда я установил, что s значение до 1, потому что я должен отобразить первыйString ([0]) как только Activity начинается, поэтому на метод OnCreate().

Может быть, я ошибаюсь, если да, пожалуйста, поправьте меня!

3 ответа

Решение

Получение пустой кнопки или просто с помощью строки "Mason" или "Villager"

Это потому, что вы устанавливаете текст кнопки только с последним элементом списка. Который либо null или же "Masons" (не видя, как это может быть "Villager").

for (int s = 1; s < characters.length; s++)
{
    randomButton.setText(characters[s]);
}

Если я проверяю журнал, я вижу, что все остальные карты (символы) отображаются как "ноль"

Вы только устанавливаете позицию 0 вашего массива. Например, вы не инициализируете позиции, поэтому эти int Значения по умолчанию равны 0.

int demoniac;
int guard;
int all;

затем

for(i = 0; i < all; i++){
    add(demoniac, "Demoniac");
    add(guard, "Guard");

На самом деле, этот цикл не должен быть введен, потому что all равно 0

Дополнительно

Коллекции индексируются с нуля, так что это не печатает элемент 0. Вам нужно установить int s = 0;,

for (int s = 1; s < characters.length; s++)

Мне не ясно, что add(int character, String name) метод возвращается, но если вы объясните это, я обновлю этот ответ.

Я считаю, что этот код выполняет большинство из того, что вы пытаетесь достичь

// Where the characters are stored
private ArrayList<String> characters;

public void initDeck() {
    if (characters == null)
        characters = new ArrayList<String>();
    // Extract the numbers if you actually need them, otherwise, they just are constants
    addCharacter("Demoniac", 1, characters);
    addCharacter("Guard", 1, characters);
    addCharacter("Medium", 1, characters);
    addCharacter("Mythomaniac", 1, characters);
    addCharacter("Owl", 1, characters);
    addCharacter("Werehamster", 1, characters);
    addCharacter("Villager", 5, characters);
    addCharacter("Masons", 1, characters);
}

public void addCharacter(String name, int amount, ArrayList<String> cards) {
    if (amount < 0) {
        throw new IllegalArgumentException("Must add a non-negative number of characters for " + name);
    }

    // Don't use '==' for Strings
    if (name.equals("Villager")) {
        if (amount != 5 || amount != 12) {
            throw new IllegalArgumentException("There can only be 5 or 12 " + name);
        }
    }

    for (int i = 0; i < amount; i++) {
        cards.add(name);
    }
}

public int searchCharacters(String character, ArrayList<String> cards) {
    return cards.indexOf(character);
}

public Map<String, Integer> getAllCharacterPositions() {
    Map<String, Integer> allPositions = new LinkedHashMap<String, Integer>();
    for (int i = 0; i < characters.size(); i++) {
        allPositions.put(characters.get(i), i);
    }
    return allPositions;
}

void run() {
    // initialize the characters
    initDeck();

    // shuffle them
    Collections.shuffle(characters);

    // print them all out
    for (int i = 0; i < characters.size(); i++) {
        System.out.printf("%d: %s\n", i, characters.get(i));
    }

    // Find the position of a character
    System.out.println();
    String findCharacter = "Owl";
    // Option 1 -- always linear search lookup
    System.out.printf("%d: %s\n", searchCharacters(findCharacter, characters), findCharacter);
    // Option 2 -- one-time linear scan, constant lookup
    Map<String, Integer> positions = getAllCharacterPositions();
    System.out.printf("%d: %s\n", positions.get(findCharacter), findCharacter);

    // Get a random character
    System.out.println();
    Random rand = new Random(System.currentTimeMillis());
    int randPos = rand.nextInt(characters.size());
    System.out.printf("%d: %s\n", randPos, characters.get(randPos));

    // randomButton.setText(characters.get(randPos));
}

Учитывая, что массив уже перемешан, просто посмотрите на первую карту:

public void show(View view){
    randomButton.setText(characters[0]);
}

Если вы хотите перемещаться по этой колоде, я предлагаю вам поместить перемешанный список в Queue где можно посмотреть следующую карту (peek) или возьмите следующую карту (poll):

private static Queue<string> buildNewShuffledDeck(String[] characters){
    List<String> shuffledCharacterList = new ArrayList<String>(characters);
    Collections.shuffle(shuffledCharacterList);
    Queue<string> deck = new ArrayDeque(shuffledCharacterList);
    return deck;
}

public void show(View view){
    String nextCard = deck.peek();
    if (nextCard != null)
      randomButton.setText(nextCard);
    else
      //deck is empty...
}

Затем, чтобы взять из колоды, произнесите по случайному нажатию кнопки:

String nextCard = deck.poll();

Общие рекомендации по массивам: прекратите использовать их в пользу других типов данных, которые гораздо более полезны и взаимозаменяемы.

Тогда совет следующего шага, сделайте класс, который представляет Card и прекратить использование Strings строка, которая у вас есть в данный момент, является всего лишь одним свойством карты.

Вы просто отображаете последнее добавленное имя персонажа. Заменить этим

public void show(View view){
    Random r = new Random(System.currentTimeMillis());
    randomButton.setText(characters[r.nexInt(characters.length)])
}
Другие вопросы по тегам