|
2D-программирование Вопросы, касающиеся двумерного программирования |
23.09.2010, 17:08
|
#1
|
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
|
|
Ответ: Помогите с 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, поэтому чтобы не городить еще кучу условий проще его заюзать
|
|
|
Сообщение было полезно следующим пользователям:
|
|
24.09.2010, 14:17
|
#3
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Помогите с Type
Может лучше хранить объекты не в списке, а в своём двумерном массиве?
|
(Offline)
|
|
24.09.2010, 17:49
|
#4
|
AnyKey`щик
Регистрация: 10.09.2010
Сообщений: 17
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Помогите с Type
Не,в массиве не поместится информации столько же сколько так. Я в массив только ссылку на сам сделаю, а надо еще координаты, номера и еще что-то.
|
(Offline)
|
|
24.09.2010, 19:38
|
#5
|
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
|
|
Ответ: Помогите с 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
|
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
|
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
|
AnyKey`щик
Регистрация: 10.09.2010
Сообщений: 17
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Помогите с Type
А, вон как. Я подумал немного иначе. Так тоже неплохо, но я уже сделал другим путем, переделывать придется много, так что оставлю другой вариант, но все-равно большое спасибо.
|
(Offline)
|
|
30.09.2010, 18:16
|
#11
|
AnyKey`щик
Регистрация: 10.09.2010
Сообщений: 17
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Помогите с Type
Созрел такой вопрос еще(не по теме, но не хочется новую создавать тему). Вот в оконном режиме если нажать крест красный(закрытие окна), можно ли как-то сделать функцию, которая будет обрабатываться тогда, либо просто неактивным крест сделать. А то мне необходимо, чтобы при выходе из игры обработалась информация кое-какая.
|
(Offline)
|
|
01.10.2010, 04:08
|
#12
|
ПроЭктировщик
Регистрация: 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
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Жека за это полезное сообщение:
|
|
11.10.2010, 14:37
|
#14
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,360
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Помогите с Type
источник
AppTitle "test123" ; First parameter is the scancode to fake, the second is the window name InstallCloseHandler(72, "test123") While (Not KeyHit(1)) ; This if will be TRUE when the user tries to close the window, usually 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.10.2010, 16:22
|
#15
|
AnyKey`щик
Регистрация: 10.09.2010
Сообщений: 17
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Помогите с Type
Сообщение от Randomize
источник
AppTitle "test123" ; First parameter is the scancode to fake, the second is the window name InstallCloseHandler(72, "test123") While (Not KeyHit(1)) ; This if will be TRUE when the user tries to close the window, usually don't use a common key If KeyHit(72) DebugLog("yeah") EndIf Wend UnInstallCloseHandler()
Оххохо вот это решение!
|
Решение, конечно, дурацкое, т.к. там окно можно закрыть и любой кнопкой на клавиатуре, например тут 72. Но лучше еще ничего не нашел. Поэтому вполне конкурентноспособно
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:39.
|