Выбор случайного объекта из массива

#java #arrays #object #random

#java #массивы #объект #Случайный

Вопрос:

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

 public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    int yesNo;
    CountryCard a = new CountryCard();
    a.setName("Canada");
    a.setCapital("Ottawa");
    CountryCard b = new CountryCard();
    b.setName("United States");
    b.setCapital("Washington");
    CountryCard c = new CountryCard();
    c.setName("Denmark");
    c.setCapital("Copenhagen");
    CountryCard d = new CountryCard();
    d.setName("Egypt");
    d.setCapital("Cairo");
    CountryCard e = new CountryCard();
    e.setName("Finland");
    e.setCapital("Helsinki");
    CountryCard f = new CountryCard();
    f.setName("Germany");
    f.setCapital("Berlin");
    CountryCard g = new CountryCard();
    g.setName("Thailand");
    g.setCapital("Bangkok");
    CountryCard h = new CountryCard();
    h.setName("Syria");
    h.setCapital("Damascus");
    CountryCard i = new CountryCard();
    i.setName("Uganda");
    i.setCapital("Kampala");
    CountryCard j = new CountryCard();
    j.setName("Latvia");
    j.setCapital("Riga");
    CountryCard k = new CountryCard();
    k.setName("Japan");
    k.setCapital("Tokyo");
    CountryCard l = new CountryCard();
    l.setName("China");
    l.setCapital("Beijing");
    CountryCard m = new CountryCard();
    m.setName("Costa Rica");
    m.setCapital("San Jose");
    CountryCard n = new CountryCard();
    n.setName("Brazil");
    n.setCapital("Brasilia");
    CountryCard o = new CountryCard();
    o.setName("New Zealand");
    o.setCapital("Wellington");
    CountryCard[] game = {a, b, c, d, e, f, g, f, i, j, k, l, m, n, o};

    //I will need to implement some form of a loop here
    System.out.println("Would you like to guess the capital of a country?"
              " Hit 1 for yes, or 2 for no");
    yesNo = input.nextInt();
    if (yesNo != 1) {
        System.out.println("Goodbye :(");
        System.exit(2);
    }
    if (yesNo == 1) {
        // this portion should be the guessing game,
        // get data from array compare
    }
}//end of main
 
 // template for the playing cards
class CountryCard {
    //name of the country
    String name;
    //capital of the country
    String capital;
    //has the card been used or not
    Boolean used = false;
    //number of instances created within the class
    static int instances = 0;

    //sets name for a card
    public void setName(String name) {
        this.name = name;
        instances  = 1;
    }//end of setName

    //gets the name of a card, returns name
    public String getName() {
        return name;
    }//end of getName

    //set capital for a card
    public void setCapital(String capital) {
        this.capital = capital;
        instances  = 1;
    }//end of setCapital

    //gets capital of a card, returns capital
    public String getCapital() {
        return capital;
    }//end of getCapital

    //determines whether or not card has
    public boolean usedCard(boolean used) {
        //been used, returns boolean value
        return used;
    }

    //returns the amount of instances in class
    public int getInstances() {
        return instances;
    }//end of getInstances
}//end of class country card
 

Ответ №1:

Вы можете использовать генератор случайных чисел для генерации случайных значений int для вашего массива

 //initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];
 

Ответ №2:

Сначала вам нужно сгенерировать случайное число, чтобы выбрать случайный CountryCard объект из массива. Вот метод, который может это сделать —

 class SomeClass {
  // instantiate only once
  private Random random;
  ...
  private static CountryCard generateRandomCard(CountryCard[] array) {
      int randomIndex = random.nextInt(array.length);
      return array[randomIndex];
  }

  ...
 

Затем в main() методе вы должны использовать while цикл для выполнения игры и запрашивать ввод пользователя в самом конце цикла, чтобы игра продолжалась до тех пор, пока пользователь вводит 1 for YesNo .

 public static void main(String[] args) {
    ....
    YesNo = input.nextInt();
    while (YesNo == 1) {
      // game logic here
      CountryCard card = generateRandomCard();
      ....
      // at the end, ask user if they'd like to continue again
      YesNow = input.nextInt();
}
 

Ответ №3:

Насколько я понимаю, сгенерируйте случайное число из (0 — длина массива), затем получите доступ к элементу массива из сгенерированного числа.

Как показано ниже.

 Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
myArray[randomIndex];
 

Ответ №4:

Вы можете преобразовать этот массив в список, а затем использовать Collections.shuffle метод для изменения порядка элементов. После того как вы перетасовали этот список, вы можете возвращать объекты из него один за другим, не повторяясь. Также вы можете упростить свой код, добавив в класс этого объекта конструктор с двумя полями. Ваш код может выглядеть примерно так:

 class CountryCard {
    String name;
    String capital;

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

    @Override
    public String toString() {
        return name   "="   capital;
    }
}
 
 public static void main(String[] args) {
    ArrayList<CountryCard> cards = new ArrayList<>(Arrays.asList(
            new CountryCard("Canada", "Ottawa"),
            new CountryCard("United States", "Washington"),
            new CountryCard("Denmark", "Copenhagen"),
            new CountryCard("Egypt", "Cairo"),
            new CountryCard("Finland", "Helsinki"),
            new CountryCard("Germany", "Berlin"),
            new CountryCard("Thailand", "Bangkok"),
            new CountryCard("Syria", "Damascus"),
            new CountryCard("Uganda", "Kampala"),
            new CountryCard("Latvia", "Riga"),
            new CountryCard("Japan", "Tokyo"),
            new CountryCard("China", "Beijing"),
            new CountryCard("Costa Rica", "San Jose"),
            new CountryCard("Brazil", "Brasilia"),
            new CountryCard("New Zealand", "Wellington")));

    Collections.shuffle(cards);

    // output in a column
    cards.forEach(System.out::println);
}
 

Вывод:

 Denmark=Copenhagen
Costa Rica=San Jose
Canada=Ottawa
United States=Washington
Latvia=Riga
Finland=Helsinki
Syria=Damascus
Uganda=Kampala
Germany=Berlin
New Zealand=Wellington
Egypt=Cairo
Japan=Tokyo
Thailand=Bangkok
Brazil=Brasilia
China=Beijing