Пишем игрушку

Пишем игру "Змейка". Часть 2

В этом выпуске:
  1. Новые методы
  2. Что наша змейка?


И снова, здравствуйте, уважаемые любители пограммирования на языке Pascal. В этой статье мы продолжим, я, со своей стороны,- объяснение, а вы - изучение уже написанной программы-игры "Змейка".

В прошлый раз мы с вами остановились на том, что нарисовали поле и вывели на нем нашу змейку. Теперь я хочу объяснить, для чего нужны другие методы и поля объекта TSoliter.

Метод Run является, как бы самым главным, в нем организован основной цикл. Вот его фрагмент:

листинг 1

         …
  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.
Теперь о том, как движется змейка. Метод MoveSoliter содержит следующее:
       
      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;
Как видите, все просто. Еще раз повторю, что пока мы не будем вдаваться в то, как работают другие методы, но уверяю вас, что мы все подробно рассмотрим. А на этот раз, пожалуй, все. До встречи в следующий раз.

[ в начало ]

© Чарышкин Олег

Задать вопросы можно здесь

 

Hosted by uCoz