Работа со списками
Материал из Blitz Et Cetera
Поводом написания этой статьи было мое личное заблуждение по использованию типов в Blitz-е. Возьмем простой пример - нужен список юнитов игрока. Что обычно делается (ну или я делал) - делаю такой простой код:
Type TUnit
Field x,y,id
End Type
Global Units.TUnit ; создаем переменную юнитов
for i=1 to 10
Units.TUnit = New TUnit
Units\x=i:Units\x=i:Units\id=i
next
; теперь переберем все юниты
for Unit.TUnit=Each TUnit
Print Unit\id
Next
В данном случае все нормально - но если мы захотим списки для каждого игрока, то такой способ не подойдет, т.к. при переборе Each Unit - будут выдаваться все юниты этого типа. Можно конечно ставить всякие условия, но есть способ гораздо лучший. Делаем связанный список используя типы Блица и проблема решается. Вникать в подробности создания списка я не буду (это можно понять самому, т.к. код небольшой), а дам пример использования.
; Переменная списка - может быть сколько угодно разных
Global MyList.TList = New TList
Global MyList2.TList = New TList
For i=1 To 10
Add(MyList,i) ; Добавляет i в список List
Next
For i=1 To 10
Add(MyList2,i+15) ; Добавляет i в список List
Next
Start(MyList) ; Устанавливает список на начало
While Not EofList(MyList) ; Пока список не закончился
NextItem(MyList) ; Следующий элемент
Print Item(MyList)
Wend
Это был код который нужно написать пользователю для использованию списков с предлагаемыми мною функциями. Как видите здесь все просто. И все списки отделены друг от друга! Так же можно создать массив списков.
Полный код включаю мои функции:
Type TList
Field Start.TItem,Item.TItem
End Type
Type TItem
Field c%
Field N.TItem
End Type
; Переменная списка - может быть сколько угодно разных
Global MyList.TList = New TList
Global MyList2.TList = New TList
For i=1 To 10
Add(MyList,i) ; Добавляет i в список List
Next
For i=1 To 10
Add(MyList2,i+15) ; Добавляет i в список List
Next
Start(MyList) ; Устанавливает список на начало
While Not EofList(MyList) ; Пока список не закончился
NextItem(MyList) ; Следующий элемент
Print Item(MyList)
Wend
Function Add(List.TList,i)
Local a.TItem
a.TItem = New TItem
a\c=i
If List\Item=Null Then List\Item=New TItem:List\Start=List\Item
List\Item\n=a
List\Item=a
End Function
Function Start(List.TList)
List\Item=List\Start
End Function
Function NextItem(List.TList)
List\Item=List\Item\n
End Function
Function EofList(List.TList)
If List\Item\n=Null Then Return True Else Return False
End Function
Function Item(List.TList)
Return List\Item\c
End Function
Автор: Amir (e-mail: AmirL mail.ru)
|