Страница: 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
       
    
       
  
всем спасибо, проблема разрешилась. сделал всё же по своему (код всё такой же нечитабельный))):