В прошлый раз мы с вами остановились на том, что нарисовали поле и вывели на нем нашу змейку. Теперь я хочу объяснить, для чего нужны другие методы и поля объекта TSoliter.
Метод Run является, как бы самым главным, в нем организован основной цикл. Вот его фрагмент:
…
1) Repeat
2) If fDot.fNotDot then AddDot;
3) fPrev:=fRule;
4) fPrevVer:=(fRule=kbUp) or (fRule=kbDown);
5) Wait;
6) If KeyPressed then kbEvent;
7) MoveSoliter;
8) until fExitCode <> excContinue;
…
Строки 2 пока опустим. Поле fRule является управляющим символом, т.е. он будет принимать символ клавиши, которую нажали на клавиатуре. fPrev содержит символ предыдущей нажатой клавиши, это удобно в том плане, что так мы легко можем отслеживать, где змейка изменила свое направление. Поле fVer - это логическая переменная, которая принимает истинное значение в случае вертикального движения змейки после нажатия пользователем клавиши:
fVer:=(fRule=kbUp) or (fRule=kbDown);
Аналогично, поле fPrevVer принимает истинное значение, в том случае, если предыдущее (до нажатия клавиши) направление было вертикальным. В строке 5 (листинг 1) обеспечивается задержка. Ведь у разных компьютеров - разное быстродействие,а змейка все же должна двигаться с одинаковой скоростью. В строке 6 мы вызываем метод kbEvent (его мы рассмотрим чуть позже), если нажата какая-то клавиша. Кстати, попробуйте вызывать его просто так, без условий, тогда увидите для чего это все нужно. Ну, а в строке 7 мы просто двигаем змейку. Константы типа excXXXX, определяют код выхода из цикла. За это отвечает поле fExitCode, устанавливаемое соответствующим образом в процессе игры. Поле fIsTurn - логическая переменная принимающая истинное значение тогда, когда змейка совершает поворот. Теперь вам не составит труда разобраться в там, что делает kbEvent. Об остальном поговорим поподробнее.
Надо сказать что, важным является то, как мы будем представлять нашу змейку в программе. Т.е., какова информация, по которой в любой момент времени, можно было бы однозначно определить положение каждой клетки змейки на поле. В программе реализован следующий вариант: хранить координаты головы, хвоста, длину змейки, координаты клеток на поле, где змейка совершает повороты (такие клетки назовем углами). Кроме своих координат, углы будут характеризоваться входным и выходным направлениями, это направления, в которых змейка входит и выходит из угла соответственно. Этим и определяются поля и методы типа TCorner:
fX, fY : byte; {координаты угла}
fInDir : char; {входное направление}
fOutDir : char; {выходное направление}
Constructor Init(X1, Y1 : byte; InD, OutD : char);
Destructor Done;virtual;
Все углы содержатся в коллекции fCorCol, которая является
полем метода Tsoliter.
SetNewHeadCoor; {устанавливаем новые координаты головы}
fDot.fNotDot:=(fX=fDot.fDotX)and(fY=fDot.fDotY);{об этом позже}
If fDot.fNotDot then {и об этом тоже}
begin
inc(fLen);
DrawBar(fX, fY);
If fCurDot = fDot.fMaxDot then
fExitCode:=excVictory;
Exit;
end;
Check; {проверка на то может ли дальше двигаться змейка}
SetNewZCoor; {устанавливаем новые координаты хвоста}
If fExitCode = excContinue then {если еще живы, то: }
begin
DrawBar(fX, fY); {рисуем новую голову}
end;
Как видите, все просто. Еще раз повторю, что пока мы не
будем вдаваться в то, как работают другие методы, но уверяю
вас, что мы все подробно рассмотрим. А на этот раз, пожалуй,
все. До встречи в следующий раз.
© Чарышкин Олег
Задать вопросы можно здесь