Показать сообщение отдельно
Старый 02.02.2010, 10:37   #612
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Вопрос-Ответ (для новичков)

Сообщение от Nex Посмотреть сообщение
А можно кодом? Выше я написал, что с массивами плохо дружу, а иначе сам бы уже догадался...
Можно.
Посмотри примерчик ниже.
Обрати внимание на строчку
If(mas(x+dx*k, y+dy*k) = val)
Надеюсь, что приведённый пример поможет разобраться.

;делаем "одинаковые" случайные числа
SeedRnd (2010)

Global dimX = 10
Global dimY = 10
Global x, y

Dim mas(dimX, dimY)

Const dirX = 1
Const dirY = 2

Local txt$ = ""

;заполняем массив числами от 1 до 5, например
For y=0 To dimY-1
	txt = ""
	For x=0 To dimX-1
		mas(x,y) = Rand (1, 5)
		txt = txt + mas(x,y) + ", "
	Next
	Print(txt)
Next

Print ("")

;ищем 3 идущих подряд числа 5, с позиции (0,0) по "ширине" массива
Local pos$ = fnFindTheSame(5, 3, dirX)
Print ("posX = " + pos)

;ищем 2 идущих подряд числа 1, с позиции (1,0) по "высоте" массива
pos = fnFindTheSame(1, 2, dirY, 1, 0)
Print ("posY = " + pos)


WaitKey()

End 



;функция поиска
;возвращает строчку, содержащую индексы позиции,
;начиная с которой выполняется условие
Function fnFindTheSame$(val=1, kolvo=3, dir=dirX, startX=0, startY=0)
	Local cnt = 0
	Local dx = 0
	Local dy = 0
	Local done = False
	Local retVal$ = ""
	Local k = 0 
	
	For y = startY To dimY-1
		For x = startX To dimX-1
			;если нашли нужную нам цифру
			If(mas(x,y) = val)

				;в зависимости от направления поиска устанавливаем приращения
				If(dir = dirX)
					dx = 1
					dy = 0
				EndIf
				If(dir = dirY)
					dx = 0
					dy = 1
				EndIf

				;запоминаем позицию
				retVal = retVal + x+","+y
				cnt = cnt + 1

				;пробегаем по "высоте" или "ширине" массива и ищем повторы нужного числа
				For k = 1 To kolvo-1
					If(mas(x+dx*k, y+dy*k) = val)
						cnt = cnt + 1
						;если нашли нужное количество идущих подряд повторов - выходим
						If(cnt = kolvo)
							done = True
							Exit
						EndIf
					Else
						cnt = 0
						retVal = ""						
						Exit
					EndIf 
				Next
				
				If(done = True) Exit ;выход из цикла по Х
			Else
				cnt = 0
				retVal = ""
			EndIf 
		Next
		If(done = True) Exit  ;выход из цикла по У
	Next

	;если не нашли нужное количество, то отражаем это в результате
	If(cnt < kolvo) retVal = "none"
	Return retVal
End Function
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nex (02.02.2010)