В прошлый раз мы с вами остановились на том, что нарисовали поле и вывели на нем нашу змейку. Теперь я хочу объяснить, для чего нужны другие методы и поля объекта 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;Как видите, все просто. Еще раз повторю, что пока мы не будем вдаваться в то, как работают другие методы, но уверяю вас, что мы все подробно рассмотрим. А на этот раз, пожалуй, все. До встречи в следующий раз.
© Чарышкин Олег
Задать вопросы можно здесь