Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.05.2015, 23:31
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание Помошь в заполнении поля для игры ЛОТО

Ребята всем привет
мне нужна чисто идея - собственно в чем проблема - она заключается в следующем - нужно заполнить карточку для игры Русское ЛОТО - рандомно выбранными цифрами

Вот как я решил заполнить - просто мне нужен совет знатоков - насколько эффективнее данный способ - можно ли как то по другому это сделать более эффективнее



На форме стоят две таблицы StringGrid1 и StringGrid2
получаем номер из 1 до 90 случайном порядке и проверяем номер
Код:
if shar_no<10 then
...
...
..
if (shar_no >= 10) and (shar_no <= 19) then
..
..
..
в зависимости от номера помешаем его в нужное место в StringGrid1 при этом проверяем свободна ли ячейка если нет то сохраняя столбец спускаемся по рядам вниз до последнего ряда второй таблицы StringGrid2 пока не найдем свободную ячейку.

После того как мы разместили все выпавшие номера по циклу с одного до 45 (это с запасом)

Потом проверяем все ряды на количество заполненных полей - если их количество превышает 5ти то после пятого номера следующие спускаем по столбцу вниз и так до конца последней таблицы.


И так в чем заключается проблема - проблема в том что заполняем вы поля начиная с начала - а вот когда начинаем проверку рядов на количество заполненных ячеек мы теряем первые номера это как? щяс наглядно покажу - смотрите на картинку

Красным я указал последовательность выпадения случайным образом этих номеров - видите там где номер 5 и 6 выпали 72 и 89 но после проверки для них не осталось места в таблице и они как бы выбили а в левой стороне получилось бардак несмотря на то что цифры 40 и 24 выпали после 72 и 89 - получается что какие выпавшие номера ближе к левому краю останутся всегда а те которые в правее выпадут из таблицы как в моем случае.

Что посоветуете как с этим бороться??
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #2  
Старый 15.05.2015, 00:05
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

В лото не играл, так что мб ошибаюсь с правилом заполнения. Но если я правильно понял, то по столбцам идут числа вида NX, где N - номер столбца, а X - произвольная цифра, но уникальная для столбца.
Если так, то заполняется легко: для каждого столбца берем массив цифр от 0 до 9 (для первого столбца - от 1 до 9) и делаем как-то так:
Код:
// положим n - номер текущего заполняемого столбца
if n =0 then begin
    cnt := 9
    for i := 0 to cnt-1 do 
       arr[i] := i + 1;
end else begin
    cnt := 10;
    for i := 0 to cnt-1 do 
       arr[i] := i;
end;
j := cnt;
lim := cnt - 5;
while j >= lim do begin
  rnd := random(j);
  grid[cnt - j, n] := 10*n + arr[rnd];
  arr[rnd] := arr[cnt - 1];
  j := j - 1;
end;
То есть выбираем рандомный индекс в массиве возможных цифр, в грид пишем цифру по этому индексу, и выкидываем эту цифру из массива, заменив её последней из массива, после чего убираем последнюю (уменьшаем длину массива на 1). Таким образом рандом будет выдавать уникальные цифры в пределах столбца.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 15.05.2015 в 00:08.
Ответить с цитированием
  #3  
Старый 15.05.2015, 00:37
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Такой метод я уже пробовал он не подходит по одному принципу - нам нужно полученные цифры размешать
Я просто чтоб тему не нагружать сильно - написал цифры попадаются рандомно - а на самом деле они по другому принципу получаются

Если сказать другим методом - то представьте у нас есть список цифр в количестве 45 штук все разные одинаковых нет - с начала списка до конца их нужно размешать в таблице

И что в конце будем проверять ряды на количество заполненных полей последние цифры из столбцов 60 - 70 - 80 не терялись

Допустим в списке продолжительность такая

Код:
1
3
15
65
23
5
72
40
22
60
21
9
55
и т.д

В конце когда проверяем допустим 72 уже шестая занятая поля - его оставить а переместить или вообще удалить номер 9 с того же ряда - по принципу что 9й номер в списке идет после номера 72


Я походу уже сам догадываюсь как это реализовать))) - щяс уже поздно пойду спать утром разберусь..
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #4  
Старый 15.05.2015, 00:43
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Я нашел в чем моя ошибка - а она в том что я на ходу считывая ячейки с лева в право делаю перемещение последние на один ряд вниз

А нужно на оборот - сперва посчитать сколько заполненных ячеек в ряду а потом начать проверку какой номер в какой ячейке - который по списку...yahooooo
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #5  
Старый 15.05.2015, 00:51
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Никогда не играл и правил не знаю, но вот нашёл такое описание.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:10.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025