Processing:Примеры/Лотерея

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Описание[1]

Этот пример демонстрирует, как использовать объект IntList для хранения списка чисел. Массив целочисленных значений служит примерно той же цели, что и IntList, но его размер фиксирован. Кроме того, значения в IntList можно легко удалять и добавлять, а также сортировать и перемешивать. Для списков значений float и String используйте, соответственно, объекты FloatList и StringList. Для списка объектов используйте ArrayList.

В данном скетче-примере создаются три списка целочисленных значений (т.е. три объекта IntList). Первый – это список постоянно перемешиваемых чисел, из которого скетч в случайном порядке выбирает числа для «результатов лотереи». Второй – это список «выбранных» чисел. И третий – это «лотерейный билет» с 5 числами, для которых должно выпасть совпадение.

Пример

// три объекта IntList (три списка целочисленных переменных):
IntList lottery;
IntList results;
IntList ticket;

void setup() {
  size(640, 360);
  frameRate(30);
  // создаем пустые IntList – для «лотереи», «результатов» и «билета»:
  lottery = new IntList();
  results = new IntList();
  ticket  = new IntList();
  
  
  // добавляем в «лотерею» 20 целочисленных значений:
  for (int i = 0; i < 20; i++) {
    lottery.append(i);
  }
  
  // выбираем из «лотереи» 5 чисел, чтобы добавить их в «билет»:
  for (int i = 0; i < 5; i++) {
    int index = int(random(lottery.size()));
    ticket.append(lottery.get(index));
  }
}

void draw() {
  background(51);
  
  // метод shuffle() в случайном порядке
  // перемешивает порядок значений в «лотерее»:
  lottery.shuffle();
  
  // вызываем метод showList(), который нарисует
  // целочисленные значения из списков на заданных XY-позициях:
  showList(lottery, 16, 48);
  showList(results, 16, 100);
  showList(ticket, 16, 140);
  
  
  // в этом цикле for() проверяем, совпадают ли
  // «выбранные» числа («результаты») числам в «билете»:
  for (int i = 0; i < results.size(); i++) {
    // это одно и то же число?
    if (results.get(i) == ticket.get(i)) {
      fill(0, 255, 0, 100);  // если да - зеленый
    } else {
      fill(255, 0, 0, 100);  // если нет - красный
    }
    ellipse(16+i*32, 140, 24, 24);
  }
  
  
  // каждые 30 секунд выбираем в «результаты» одно число из «лотереи»:
  if (frameCount % 30 == 0) {
    if (results.size() < 5) {
      // берем первое значение в «лотерее» и удаляем его:
      int val = lottery.remove(0);
      // помещаем его в «результаты»:
      results.append(val);
    } else {
      // ок, выбрали 5 чисел, теперь сбрасываем «результаты»:
      for (int i = 0; i < results.size(); i++) {
        // возвращаем «выбранные» числа обратно в «лотерею»:
        lottery.append(results.get(i));
      }
      // очищаем «результаты» и начинаем сначала:
      results.clear();
    }
  }
}

// рисуем список чисел, начиная с заданной XY-позиции:
void showList(IntList list, float x, float y) {
  for (int i = 0; i < list.size(); i++) {
    // при помощи метода get() извлекаем значение
    // из заданной позиции списка IntList:
    int val = list.get(i);
    stroke(255);
    noFill();
    ellipse(x+i*32, y, 24, 24);
    textAlign(CENTER);
    fill(255);
    text(val, x+i*32, y+6);
  }
}

См.также

Внешние ссылки