Страница: 1 |
Страница: 1 |
Вопрос: Randomizing
Добавлено: 12.09.09 22:05
Автор вопроса: DkBobby
Всем доброго времени суток! Такая ситуация: делаю игру карточную и соответственно неплохо бы "перетасовать" "карты".
Sub RandomPack()
Dim RandomNumber As Integer
For i = 1 To 36 Step 1
MakeRandomNumber:
RandomNumber = Int(Rnd(1) * 36) 'создание рандомного числа
If Numbers(RandomNumber) = 0 And RandomNumber > 0 Then 'проверка занято ли уже число другой картой и больше ли оно нуля
Cards(i) = RandomNumber 'присваивание карте номера
Numbers(RandomNumber) = 1 'присваивание значения "занятого" номеру
Else
GoTo MakeRandomNumber
End If
Next
End Sub
Соотвественно массивы в General:
Dim Cards(1 To 36) As Integer
Dim Numbers(1 To 36) As Integer
После N-кол-ва похождений цикла (смотрел по построчному дебагу) программа, видимо, входит в бесконечный цикл, от чего зависает и становится "Not responsing". Пробовал по-разному делать, но тогда выдается ошибка номер 9 "Subscript out range" (или что-то вроде того). Подскажите пожалуйста что нетак и как исправить? Заранее спасибо.
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 12.09.09 22:46
Номер ответа: 2
Автор ответа:
DkBobby
Вопросов: 6
Ответов: 20
Профиль | | #2
Добавлено: 12.09.09 23:06
Спасибо
Номер ответа: 3
Автор ответа:
DkBobby
Вопросов: 6
Ответов: 20
Профиль | | #3
Добавлено: 12.09.09 23:17
всё равно зависает...
Номер ответа: 4
Автор ответа:
DkBobby
Вопросов: 6
Ответов: 20
Профиль | | #4
Добавлено: 12.09.09 23:18
может обновление какое-нибудь нужно, не знаете?
Номер ответа: 5
Автор ответа:
Boconon
ICQ: 216390557
Вопросов: 25
Ответов: 71
Web-сайт:
Профиль | | #5
Добавлено: 12.09.09 23:49
походу цикл доходит до конца, генерит значение... а так как все карты уже заняты.... перебирает снова и снова... уходит в астрал? очень нечитабельный и не удобный кодо, имхо, убери goto, реализуй циклами.
Номер ответа: 6
Автор ответа:
DkBobby
Вопросов: 6
Ответов: 20
Профиль | | #6
Добавлено: 12.09.09 23:55
так карт 36 и цикл после 36 раза должен закончиться...
Номер ответа: 7
Автор ответа:
DkBobby
Вопросов: 6
Ответов: 20
Профиль | | #7
Добавлено: 12.09.09 23:56
номеров 36 и карт тоже 36 и номера должны рандомно распределится по картам..
Номер ответа: 8
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #8
Добавлено: 12.09.09 23:57
лучше заведи массив из 36 элементов. рандомом получаешь индекс элемента. сохраняешь его в массив результата, элемент из исходного массива удаляешь. далее уменьшаем делитель на 1. и так. типа как то так
while(source_array.size() > 0){
int cur_index = rnd() % source_array.size();
result_array.add( source_array.get_item( cur_index ) );
source_array.remove( cur_index );
}
типа как то так. детали типа удаления, добавления етц - обернуты в класс дабы не мешать пониманию алгоритма.
Номер ответа: 9
Автор ответа:
DkBobby
Вопросов: 6
Ответов: 20
Профиль | | #9
Добавлено: 13.09.09 00:05
к сожалению VB не дает возможности считать кол-во элементов массива. по крайней мере я не смог найти функу такую..
Номер ответа: 10
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #10
Добавлено: 13.09.09 00:12
дело в том что это не просто массивы. из середины массива удалять просто так нельзя. нужно его перекопировать в новый. для упрощения всего этого шаманства нужно сделать свой класс, который спрячет эти возможности. по сути же самым удобным для этого алгоритма структурой данных является обычный односвязный список.
Номер ответа: 11
Автор ответа:
DkBobby
Вопросов: 6
Ответов: 20
Профиль | | #11
Добавлено: 13.09.09 00:16
ясно. спасибо
Номер ответа: 12
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #12
Добавлено: 13.09.09 15:31
Номер ответа: 13
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #13
Добавлено: 13.09.09 16:00
тож хороший вариант
Номер ответа: 14
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #14
Добавлено: 13.09.09 18:26
Номер ответа: 15
Автор ответа:
DkBobby
Вопросов: 6
Ответов: 20
Профиль | | #15
Добавлено: 16.09.09 21:21
всем спасибо, проблема разрешилась. сделал всё же по своему (код всё такой же нечитабельный))):