java—以随机顺序访问数组中的每个值

jyztefdp  于 2021-07-03  发布在  Java
关注(0)|答案(4)|浏览(432)

我正在做一个猜谜游戏,你应该猜x国的首都,用户应该是提示,如果他们想再猜一次有一个数组的15个国家的卡,我需要通过随机顺序阅读,我也不能使用同一张卡两次。当我运行我当前的代码时,我完成了数组的14次迭代,最后一次只是停留在while循环的最开始(在将1输入yesno之后什么都没有发生)这里是相关的代码,任何帮助都是非常感谢的:

while (CountryCard.instances < 30) {
    System.out.println("Would you like to guess the capital of a country?"
            + " Hit 1 for yes, or 2 for no (Case sensitive)");
    yesNo = input.nextInt();
    if (yesNo == 2) {
        return;
    }
    Random generator = new Random();
    int randomNumber = generator.nextInt(game.length);
    while (game[randomNumber].used == true && CountryCard.uses < 15) {
        randomNumber = generator.nextInt(game.length);
    }
    System.out.println("What is the Capital of "
            + game[randomNumber].getName() + "?");
    game[randomNumber].usedCard(1);
    guess = input.next();
    if (guess.equals(game[randomNumber].getCapital())) {
        System.out.println("Correct! :)");
    } else {
        System.out.println("Incorrect! :(");
    }
}//end of while
System.out.println("Thanks for playing :)");
9w11ddsr

9w11ddsr1#

为什么不把你的countrycard列表和collections一起洗牌呢?
比如:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

class Game {
  private static final List<CountryCard> countryCards = new ArrayList<>(
    Arrays.asList(
        new CountryCard("Canada", "Ottawa"),
        new CountryCard("USA", "Washington, D.C."),
        new CountryCard("France", "Paris"),
        new CountryCard("Germany", "Berlin"),
        new CountryCard("Spain", "Madrid"),
        new CountryCard("Turkey", "Ankara"),
        new CountryCard("Sudan", "Khartoum"),
        new CountryCard("Brazil", "Brasilia")
        // TODO add more countries as needed
     ));

  private Scanner input = new Scanner(System.in);

  public void play() {
    // shuffle the country card list before playing
    Collections.shuffle(countryCards);
    for (CountryCard randomCountryCard: countryCards) {
        System.out.println("What is the capital of " + randomCountryCard.getName() + "?");

        String guess = input.next();

        if (randomCountryCard.getCapital().equalsIgnoreCase(guess)) {
            System.out.println("Correct!");
        } else {
            System.out.println("Incorrect!");
        }

        System.out.println("Answer: " + randomCountryCard.getCapital() + "\n");
    }
  }

  public static void main(String[] args) {
    Game game = new Game();
    game.play();
  }
}

class CountryCard {
    private String name;
    private String capital;

    CountryCard(String name, String capital) {
        this.name = name;
        this.capital = capital;
    }

    public String getName() {
        return name;
    }

    public String getCapital() {
        return capital;
    }
}
wsewodh2

wsewodh22#

我之前在一篇评论中提到,因为在查找最后1/15个数字时,在while循环中随机生成数字,所以很难做到这一点。您可以实现开放寻址冲突处理。其中,可以使用线性探测或双哈希。
线性探测:如果随机生成的数字是x,则x已经被使用,而不是生成新的随机数字,取x+1。如果使用x+1,则取x+2,依此类推。
双重散列:如果不使用随机生成的数字x,则继续正常操作,但如果使用,则使用散列将变量常量值添加到x中。

w9apscun

w9apscun3#

如果它只工作14次,那么问题将处于循环状态。
尝试改变 CountryCard.uses<15CountryCard.uses<=15 同时检查game.length的值

wqlqzqxt

wqlqzqxt4#

如果你的集合/数组只有15个元素,你可以直接使用 Collections.shuffle() 然后迭代。
如果不想更改初始数组,可以使用索引(从零到array.length)生成集合,然后将其无序排列。

相关问题