Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 2D-программирование

2D-программирование Вопросы, касающиеся двумерного программирования

Ответ
 
Опции темы
Старый 23.09.2010, 17:08   #1
volgeras
AnyKey`щик
 
Регистрация: 10.09.2010
Сообщений: 17
Написано 0 полезных сообщений
(для 0 пользователей)
Помогите с Type

Итак, есть примерно такой тип:
Type cube
  field x;координата х
  field y;координата у
  field number_x;порядковый номер строки, в которой расположен куб
  field number_y;порядковый номер столбца, в котором расположен куб
  field use;занят ли куб
End Type
Вот, я создаю поле из кубиков. И мне надо найти такие 3 кубика, чтобы cub\number_x у троих был один, а cub\number_y подряд шли(3,4,5 или 1,2,3 например) и эти 3 были свободны(field use). Не подскажите как это сделать. Вроде надо
for cub.cube = each cube
  if...
next
использовать, но я не придумаю никак какое условие в if писать.

Последний раз редактировалось volgeras, 23.09.2010 в 19:22.
(Offline)
 
Ответить с цитированием
Старый 23.09.2010, 19:57   #2
Venom2
 
Сообщений: n/a
Ответ: Помогите с Type

Если влоб решать, то цикл там не один, как и кол-во условий:
For cube1 = Each cube
	If cube1\use = False Then
		For cube2 = Each cube
			If cube2\use = False Then
				If cube2 <> cube1 And cube2\number_x = cube1\number_x And cube2\number_y - cube1\number_y = 1 Then
					For cube3 = Each cube
						If cube3\use = False Then
							If cube3 <> cube1 And cube3 <> cube1 And cube3\number_x = cube1\number_x And cube3\number_y - cube2\number_y = 1 Then
								Goto Found
							End If
						End If
					Next
				End If
			End If
		Next
	End If
Next
Goto NotFound
.Found
; кубы найдены.
.NotFound
Т.е. берем первый куб, и начинаем сравнивать его с другими, так чтобы number_x были равны, и соответственно разница между number_y была +1 (вдобавок нужно исключить проверку кубика с самим с собой). Как только нашли второй куб, ищем так-же (перебирая список) третий куб, получается перебор тройной вложенности. Решение в худшем случае O(N^3) сложности, поэтому лучше поискать что-то побыстрее или переформулировать саму задачу Можно оптимизировать немного, например сделать два списка (два Type) один с занятыми, другой со свободными кубиками и соответственно перемещать кубы между ними. Меньше перебирать прийдется да и условие занятости сократится. Еще можно кешировать (запоминать в отдельные переменные) поля number чтобы во внутренних циклах сократить доступ к ним.

ЗЫ
Сорри за goto, но в блице нет переменного Exit, поэтому чтобы не городить еще кучу условий проще его заюзать
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
volgeras (24.09.2010)
Старый 24.09.2010, 14:17   #3
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Помогите с Type

Может лучше хранить объекты не в списке, а в своём двумерном массиве?
(Offline)
 
Ответить с цитированием
Старый 24.09.2010, 17:49   #4
volgeras
AnyKey`щик
 
Регистрация: 10.09.2010
Сообщений: 17
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Помогите с Type

Не,в массиве не поместится информации столько же сколько так. Я в массив только ссылку на сам сделаю, а надо еще координаты, номера и еще что-то.
(Offline)
 
Ответить с цитированием
Старый 24.09.2010, 19:38   #5
volgeras
AnyKey`щик
 
Регистрация: 10.09.2010
Сообщений: 17
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Помогите с Type

Вот, сделал так:
For cub1.cubes = Each cubes
	If cub1\is_use = 0 Then
		DebugLog "ok1"
		For cub2.cubes = Each cubes
			DebugLog "ok2"
			If cub2\is_use = 0 And cub2\cube_x = cub1\cube_x And cub2\cube_z = cub1\cube_z+1 Then
				DebugLog "ok3"
				For cub3.cubes = Each cubes
					DebugLog "ok4"
					If cub3\is_use = 0 And cub2\cube_x = cub1\cube_x And cub2\cube_z = cub1\cube_z+2 Then
						DebugLog "ok5"
						Goto label1
					EndIf
				Next
			EndIf
		Next
	EndIf
Next
Однако, почему-то код зацикливается тут. В дебуге выводится каждую секунду то ОК2, то ОК4. Сам всю голову сломал, но не вижу никак, где ошибка. Не подскажите?
(Offline)
 
Ответить с цитированием
Старый 24.09.2010, 19:55   #6
Venom2
 
Сообщений: n/a
Ответ: Помогите с Type

Сообщение от volgeras Посмотреть сообщение
Вот, сделал так:
For cub1.cubes = Each cubes
	If cub1\is_use = 0 Then
		DebugLog "ok1"
		For cub2.cubes = Each cubes
			DebugLog "ok2"
			If cub2\is_use = 0 And cub2\cube_x = cub1\cube_x And cub2\cube_z = cub1\cube_z+1 Then
				DebugLog "ok3"
				For cub3.cubes = Each cubes
					DebugLog "ok4"
					If cub3\is_use = 0 And cub2\cube_x = cub1\cube_x And cub2\cube_z = cub1\cube_z+2 Then
						DebugLog "ok5"
						Goto label1
					EndIf
				Next
			EndIf
		Next
	EndIf
Next
Однако, почему-то код зацикливается тут. В дебуге выводится каждую секунду то ОК2, то ОК4. Сам всю голову сломал, но не вижу никак, где ошибка. Не подскажите?
1) во внутренних циклах нет исключения проверки куба с самим собой
2) cub2\cube_z = cub1\cube_z+1
не равно, а минус должно быть.
3) Выходить надо из цикла сразу как нашел нужные кубы
Внимательнее же код смотри
 
Ответить с цитированием
Старый 25.09.2010, 13:36   #7
volgeras
AnyKey`щик
 
Регистрация: 10.09.2010
Сообщений: 17
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Помогите с Type

Сообщение от Venom2 Посмотреть сообщение
1) во внутренних циклах нет исключения проверки куба с самим собой
2) cub2\cube_z = cub1\cube_z+1
не равно, а минус должно быть.
3) Выходить надо из цикла сразу как нашел нужные кубы
3)Я так и делаю(goto)
2)Не понял, какой минус.
If cub2\cube_z - cub1\cube_z+1
Че за ерунда?
1)ша посмотрю, че там у меня
(Offline)
 
Ответить с цитированием
Старый 25.09.2010, 13:48   #8
volgeras
AnyKey`щик
 
Регистрация: 10.09.2010
Сообщений: 17
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Помогите с Type

Вот я дурак невнимательный. В двух местах опечатался, он у меня 3 проверку не делал поэтому.
(Offline)
 
Ответить с цитированием
Старый 25.09.2010, 16:48   #9
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Помогите с Type

Сообщение от volgeras Посмотреть сообщение
Не,в массиве не поместится информации столько же сколько так. Я в массив только ссылку на сам сделаю, а надо еще координаты, номера и еще что-то.
Чё за фигня?

С экземпляром объекта мы работаем через указатель (ссылку) на него, поэтому - имея указатель в массиве, мы имеем доступ ко всем полям.

Вот массив объектов:
Type TElem
	Field x%,y%
	Field width%,height%
	Field r%, g%,b%
End Type

Global colCount% = 8, rowCount% = 8

Dim mas.TElem(colCount, rowCount)
И доступ
Я написал примерчик, чтоб удостовериться, что оно работает в блице. Итог: оно работает



Type TElem
Field x%,y%
Field width%,height%
Field r%, g%,b%
End Type

Global colCount% = 8, rowCount% = 8

Dim mas.TElem(colCount, rowCount)

Global screenWidth% = 800
Global screenHeight% = 600

Graphics(screenWidth, screenHeight, 16, 2)
SetBuffer (BackBuffer ())

fnCreateElems(screenWidth, screenHeight)

While(Not(KeyHit(1)))
fnDrawElems()
Flip()
Cls()
Wend

End



Function fnCreateElems(width%, height%)
Local cube.TElem
Local w%,h%
For c%=0 To colCount-1
For r%=0 To rowCount-1
cube = New TElem
w = Rand(10,30)
h = Rand(10,30)
cube\x = Rand(0, width-w)
cube\y = Rand(0, height-h)
cube\width = w
cube\height = h
cube\r = Rand(0,255)
cube\g = Rand(0,255)
cube\b = Rand(0,255)
mas(c, r) = cube
Next
Next
End Function

Function fnDrawElems()
For c%=0 To colCount-1
For r%=0 To rowCount-1
Color(mas(c, r)\r, mas(c, r)\g, mas(c, r)\b)
Rect (mas(c, r)\x, mas(c, r)\y, mas(c, r)\width, mas(c, r)\height)
Next
Next
End Function

(Offline)
 
Ответить с цитированием
Старый 25.09.2010, 19:03   #10
volgeras
AnyKey`щик
 
Регистрация: 10.09.2010
Сообщений: 17
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Помогите с Type

А, вон как. Я подумал немного иначе. Так тоже неплохо, но я уже сделал другим путем, переделывать придется много, так что оставлю другой вариант, но все-равно большое спасибо.
(Offline)
 
Ответить с цитированием
Старый 30.09.2010, 18:16   #11
volgeras
AnyKey`щик
 
Регистрация: 10.09.2010
Сообщений: 17
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Помогите с Type

Созрел такой вопрос еще(не по теме, но не хочется новую создавать тему). Вот в оконном режиме если нажать крест красный(закрытие окна), можно ли как-то сделать функцию, которая будет обрабатываться тогда, либо просто неактивным крест сделать. А то мне необходимо, чтобы при выходе из игры обработалась информация кое-какая.
(Offline)
 
Ответить с цитированием
Старый 01.10.2010, 04:08   #12
Crayzi
ПроЭктировщик
 
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений
(для 25 пользователей)
Ответ: Помогите с Type

Сообщение от volgeras Посмотреть сообщение
Созрел такой вопрос еще(не по теме, но не хочется новую создавать тему). Вот в оконном режиме если нажать крест красный(закрытие окна), можно ли как-то сделать функцию, которая будет обрабатываться тогда, либо просто неактивным крест сделать. А то мне необходимо, чтобы при выходе из игры обработалась информация кое-какая.
Както через Win API, точно незнаю как...
(Offline)
 
Ответить с цитированием
Старый 01.10.2010, 07:51   #13
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Помогите с Type

Во чо я нашол
Обработка WM_CLOSE
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Жека за это полезное сообщение:
Randomize (11.10.2010), volgeras (01.10.2010)
Старый 11.10.2010, 14:37   #14
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Помогите с Type

источник
AppTitle "test123"

First parameter is the scancode to fakethe second is the window name
InstallCloseHandler
(72"test123")

While (
Not KeyHit(1))
    ; 
This if will be TRUE when the user tries to close the windowusually don't use a common key
    If KeyHit(72)  
        DebugLog("yeah")
    EndIf
Wend

UnInstallCloseHandler() 
Оххохо вот это решение!
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Reks888 (11.10.2010)
Старый 12.10.2010, 16:22   #15
volgeras
AnyKey`щик
 
Регистрация: 10.09.2010
Сообщений: 17
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Помогите с Type

Сообщение от Randomize Посмотреть сообщение
источник
AppTitle "test123"

First parameter is the scancode to fakethe second is the window name
InstallCloseHandler
(72"test123")

While (
Not KeyHit(1))
    ; 
This if will be TRUE when the user tries to close the windowusually don't use a common key
    If KeyHit(72)  
        DebugLog("yeah")
    EndIf
Wend

UnInstallCloseHandler() 
Оххохо вот это решение!
Решение, конечно, дурацкое, т.к. там окно можно закрыть и любой кнопкой на клавиатуре, например тут 72. Но лучше еще ничего не нашел. Поэтому вполне конкурентноспособно
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 00:57.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com