随机化String Array并显示所有值

时间:2016-01-28 21:26:36

标签: java android

我正在制作纸牌游戏,而且我已经到了shufflin'时间。

我要随机播放一些卡片(之前从用户处选择,因此它们并不总是相同的数量),然后逐个显示给用户。

由于我仍然在开发游戏的逻辑,我正在展示卡片'通过更改按钮文字来命名。

但是当我试图获得卡片时,我会陷入困境。命名并将其设置为按钮的文本。

会发生什么是我开心的事情。一个空白按钮或只是" Masons"或者"村民"串。事实上,如果我检查日志,我会看到所有其他卡(字符)显示为" null"。

这就是我尝试实现目标的方式(是的,我是新手):

这是头脑:

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我已经完成了,顺便说一句你应该知道大多数角色只有他们中的一个(恶魔,守卫等)。有2个泥瓦匠和5到12个村民,所以我们需要检索这些int s 并添加 String Array intVillager告诉我们String

示例:如果我得到6 String Array,我就要添加s&#34; 村民&#34;进入String 6次。

然后我将[0]值设置为 1 &#39;因为我显示第一个 Activity 启动时var child.prototype = Object.create(parent.prototype, {...object with properties/methods...} SerialStage.prototype = Stage.prototype; ,onCreate()方法也是如此。

也许我错了,如果是的话我请你纠正我!

3 个答案:

答案 0 :(得分:1)

  

获取空白按钮或仅使用“Masons”或“Villager”字符串

这是因为您只使用列表的最后一个元素设置Button的文本。哪个是null"Masons"(没有看到"Villager"如何)。

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

如果我查看日志,我会看到所有其他卡片(字符)显示为“null”

您只需设置数组的位置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));
}

答案 1 :(得分:1)

鉴于阵列已经洗牌,只需看看第一张牌:

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

如果你想浏览那个套牌,我建议你把洗牌后的列表放到Queue,在那里你可以查看下一张卡片(peek)或拿下一张卡片{{1 }}):

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,您当前拥有的字符串只是卡片的一个属性。

答案 2 :(得分:0)

您只是显示您添加的最后一个字符名称 替换为

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