簡體   English   中英

隨機化字符串數組並顯示所有值

[英]Randomize String Array and display all of the values

我正在玩紙牌游戲,而我已經到了洗牌時間。

我必須隨機整理幾張卡片(之前是從用戶那里選擇的,因此它們的金額不一定總是相同的),然后將它們一張一張地顯示給用戶。

當我仍在開發游戲邏輯時,我正在通過更改按鈕文本來顯示紙牌的名稱。

但是,當我嘗試獲取卡的名稱並將其設置為按鈕的文本時,我陷入了困境。

發生的事情是我得到一個空白按鈕,或者僅輸入“ Masons”或“ Villager” 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]);
    }
}

編輯:

我注意到了沒有意義 for loop我已經做了,由你應該知道 ,盡管大多數字符是他們的那種1路(邪惡的,門衛等。) 有2個泥瓦匠和5〜12個村民 ,所以我們需要找回這些int S 和添加盡可能多的String到S Array一樣多,我們需要從這些告訴int秒。

示例:如果我得到6個Villager ,則必須將StringVillager ”添加6次到String Array

然后,將s值設置為1, 因為一旦 Activity 開始就必須顯示第一個 String[0] ),因此使用OnCreate()方法。

也許我錯了,如果是的話,請您指正我!

獲取空白按鈕或僅使用“泥瓦匠”或“別墅”字符串

那是因為您僅將Button的文本設置為列表的最后一個元素。 這是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;設置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 ,您當前擁有的字符串只是card的一個屬性。

您只是顯示添加的最后一個字符名稱,用此替換

public void show(View view){
    Random r = new Random(System.currentTimeMillis());
    randomButton.setText(characters[r.nexInt(characters.length)])
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM