HOME ПРИМЕРЫ THANKS НОВИЧКАМ ДОКИ LINKS JavaScript Mail


 
В этот день много лет назад...
26 ноября. В 1769 году (255 лет назад) - В России учреждается Георгиевский крест.
 
 

Turbo Pascal Examples

Графика:
Построение графика функции
Прыгающий по экрану мячик.
Качание маятника.
Вложенные цветные круги.
Броуновское движение. Использование объектов.
Матрицы и массивы:
Сортировка элементов массива.
Удаление одинаковых элементов.
Простой пример на поворот матрицы.
Сортировка методом Шелла. +функции измерения временных интервалов.
Проверка выпуклости многоугольника.
Перемоножение матриц
Вычисление определителя матрицы. Рекурсия.
Нахождение обратной матрицы.
Задача об автостоянке.
Рекурсия. Подземелье сокровищ.
Численные методы:
Задачка на определение угла между стрелками часов.
Проверка на принадлежность точки многоугольнику.
Нахождение точки пересечения двух отрезков на плоскости.
Сортировка методом Шелла. +функции измерения временных интервалов.
Сортировка методом "пузырька". Пример на динамические структуры данных. Связанные списки.
Нахождение корня функции методом половинного деления.
Вычисление арккосинуса
Нахождение суммы цифр натурального числа.
Работа с фалами:
Рекурсивное сканирование директорий.
Работа со строками:
Работа со словами в предложении с разделителями.
Простейший синтаксический анализатор для распознавания и вычисления многчлена.
Синтаксический анализатор для распознавания и вычисления многчлена.
Работа со строками: смена кодировки, удаление тегов из HTML текста, обработка
Переименование файлов из кириллицы в латиницу.
Выдача контекстной подсказки.
Частотный словарь символов.
Подсчет повторяющихся символов в строке.
Ссылочные переменные:
Моделирование стека.
Пасьянс "Косынка".
Игры:
Пасьянс "Косынка".
Игра "Питон"
Игра "Анацефал". Пример использования объектов.
Игра "Минное поле"
Большие проекты:
Электронная картотека (без исходника)


 Игра "Анацефал". Использование объектов.

Условия игры просты. По полю расставлены мины. Двигаясь по полю, игрок может поворачивать влево и вправо. При этом на месте поворота остается "зеркало-пластина" - попадая в это место в следующий раз, и игрок и компьютер будут "отражаться" и менять направление движения. Задача в том, чтобы маневрируя между минами расставить "зеркала" так, чтобы заставить нарвыться компьютер на мины. Каждое попадание на мину - штрафное очко. Проигрывает тот, кто первый наберет 12 штрафных очков. Идея игры взята с написанной когда-то аналогичной игры "Анацефал", реализованной на компьютере "Искра 1256" Алексеем Редозубовым в 1985 году. Тогда - для компьютера с 64Кб памятью и кассетным устройством записи это было просто круто!
При написании программы был применен объектно-ориентированный подход. Основные параметры-константы подлежат возможной настройке (редактированию) с вашей стороны. Можно поменять цвет и символ игрока и компьютера, количество бомб на экране, размеры игрового поля (в сторону уменьшения), количество очков до проигрыша, выводимую рамку. Особое внимание обратите на задержку. Почти наверняка вам придется его поменять, чтобы игра доставляла удовольствие. К сожалению, турбо паскаль не гарантирует, что задержка в милисекундах будет одинаковой на разных компьютерах. По крайней мере у меня на разных компьютерах скорость разная - приходится менять задержку. Как всегда, исходный код вместе с откомпилированным ехе-файлом можно взять здесь, хотя наверно должен работать и откомпилированный вариант, взятый с этой странички.

uses Crt;
const pause:word=18550;  { задержка: меняйте это значение для }
      { ускорения/замедления игры }
      MaxBomb=100;  { количество бомб }
      BombCh='ж';   { символ бомбы }
      AnAt=#78;     { цвет анацефала }
      MaxPoint=12;  { Счет: по достижении значения игра заканчивается }
      PoleW_min=2;  PoleW_max=79; { границы поля }
      PoleH_min=2;  PoleH_max=23;
      Frame:array[1..6] of string[11]= { массив рамок }
      ('-T¬+++L+-¦-', 'гT¬¦+¦L¦-¦=', 'гT¬¦+¦L¦-¦-',
       '-T¬¦+¦L¦-¦=', '+++++++++!-', '           ');
      CurFrame=1; { текущая рамка для оформления поля }
type
ScrPtr=array[1..25,1..80] of { Экранная память }
        record
          ch,at:char;
        end;
var scr:^ScrPtr;
    WinSt:string[30]; { победная строка }
type
MoveItem=object { движущийся объект - и игрок, и анацефал }
  i,j,Point,PosOut:byte; {координаты, схвачено бомб, позиция вывода счета }
  di,dj:shortint;        { направление движения }
  ch,at:char;      { символ и атрибут движущегося объекта }
  sc_ch,sc_at:char;{ символ и атрибут экрана для восстановления из-под символа }
  Procedure Show;  { показать объект }
  Procedure Hide;  { спрятать объект }
  Procedure TurnLeft; { повернуть налево }
  Procedure TurnRight; { повернуть направо }
  Procedure DoStep; { сделать шаг в заданном направлении }
  end;
Procedure MoveItem.Show;
  begin
  self.sc_ch:=scr^[j,i].ch;
  self.sc_at:=scr^[j,i].at;
  scr^[j,i].ch:=self.ch;
  scr^[j,i].at:=self.at;
  end;
Procedure MoveItem.Hide;
  begin
  scr^[j,i].ch:=self.sc_ch;
  scr^[j,i].at:=self.sc_at;
  end;
Procedure MoveItem.TurnLeft;
var t:shortint;
  begin
  t:=di; di:=dj; dj:=-t; { turn left }
  end;
Procedure MoveItem.TurnRight;
var t:shortint;
  begin
  t:=di; di:=-dj; dj:=t; { turn right }
  end;
Procedure MoveItem.DoStep;
  begin
  inc(i,di); { проверка вылета за границы поля }
  if (i>PoleW_max) then i:=PoleW_min;
  if (i<PoleW_min) then i:=PoleW_max;
  inc(j,dj);
  if (j>PoleH_max) then j:=PoleH_min;
  if (j<PoleH_min) then j:=PoleH_max;
  if (scr^[j,i].ch='\') then { проверка на поворот }
    if di=0 then TurnLeft
            else TurnRight;
  if (scr^[j,i].ch='/') then
    if dj=0 then TurnLeft
            else TurnRight;
  { не нарвались ли на бомбу? }
  if (scr^[j,i].ch=BombCh) then
    begin { нарвались... }
    inc(Point);
    GoToXY(PosOut,25);write(Point:3);
    scr^[j,i].ch:=' ';
    if (Point+1>MaxPoint) then
      if (at=AnAt) { смотрим кто нарвался }
        then WinSt:='CONGRATULSTIONS! YOU WIN!'
        else WinSt:='  SORRY, BUT YOU LOST!';
    if at=AnAt then { если анацефал, то поворот на 180 }
      begin
      di:=-di; dj:=-dj;
      end;
    end;
  end;



var
    p:^byte;
    ch:char;
    i,j:byte;
    di,dj,t:shortint;
    An,Pl:MoveItem;
Procedure ShowCh(i,j:byte;ch:char);
  begin
  scr^[j,i].ch:=ch;
  {scr^[j,i].at:=#7;}
  end;
Procedure InitField;
var i,j,k:byte;
  begin
  Randomize; TextAttr:=16*6; clrscr; { цвет поля }
  { Распределение бомб по полю }
  for k:=1 to MaxBomb do
    begin
      repeat
        i:=PoleW_min+Random(PoleW_max-PoleW_min+1);
        j:=PoleH_min+Random(PoleH_max-PoleH_min+1);
      until (scr^[j,i].ch<>BombCh) and (i<>An.i);
    scr^[j,i].ch:=BombCh;
    end;
  { Построение рамки вокруг поля }
  for i:=PoleW_min to PoleW_max do
    begin
    scr^[PoleH_max+1,i].ch:=Frame[CurFrame,11];
    scr^[PoleH_min-1,i].ch:=Frame[CurFrame,11];
    end;
  for j:=PoleH_min to PoleH_max do
    begin
    scr^[j,PoleW_max+1].ch:=Frame[CurFrame,10];
    scr^[j,PoleW_min-1].ch:=Frame[CurFrame,10];
    end;
  scr^[PoleH_max+1,PoleW_max+1].ch:=Frame[CurFrame,9];
  scr^[PoleH_min-1,PoleW_max+1].ch:=Frame[CurFrame,3];
  scr^[PoleH_max+1,PoleW_min-1].ch:=Frame[CurFrame,7];
  scr^[PoleH_min-1,PoleW_min-1].ch:=Frame[CurFrame,1];
  j:=16*7+1; { Формирование статусной строки-подсказки }
  for i:=1 to 80 do scr^[25,i].at:=chr(j); TextAttr:=j;
  gotoXY(Pl.PosOut-5,25); write('You:   0'); scr^[25,Pl.PosOut-7].at:=Pl.at;
  gotoXY(An.PosOut-5,25); write('An:    0'); scr^[25,An.PosOut-7].at:=An.at;
  end;
begin
p:=Ptr($40, $49); { Адрес байта, хранящего текущую моду (режим экрана) }
if p^=7 then Scr:=Ptr($b000,0) else Scr:=Ptr($b800,0);
ch:=' '; WinSt:='';
with an do { Инициализация анацефала }
  begin
  i:=39; di:=0; Point:=0; PosOut:=65;
  j:=1;  dj:=1;
  ch:=' '; at:=AnAt;
  end;
with Pl do { Инициализация игрока }
  begin
  i:=1; di:=1; Point:=0; PosOut:=15;
  j:=10; dj:=0;
  ch:=' '; at:=#16;
  end;
InitField;
GotoXY(28,25);
Write('Use ''z'' and ''x'' keys');
repeat
  if KeyPressed then
    begin
    ch:=Readkey;
    if ch=#0 then
      begin
      ch:=Readkey;
      end;
    case ch of
      'z':
        with Pl do
          begin
          if di=0 then TurnLeft
                  else TurnRight;
          ShowCh(i,j,'\');
{ ниже код для более простого варианта игры, когда поворот не
  зависит от направления движения: z - налево, х - направо }
{          TurnLeft;
          if di=0
            then ShowCh(i,j,'/')
            else ShowCh(i,j,'\');}
          end;
      'x':
        with Pl do
          begin
          if dj=0 then TurnLeft
                  else TurnRight;
          ShowCh(i,j,'/');
{ ниже код для более простого варианта игры, когда поворот не
  зависит от направления движения: z - налево, х - направо }
{          TurnRight;
          if dj=0
            then ShowCh(i,j,'/')
            else ShowCh(i,j,'\');}
          end;
      end
    end;
  Pl.DoStep;
  Pl.Show;
  an.DoStep;
  an.Show;
  Delay(pause);
  an.hide;
  Pl.hide;
until (ch=#27) or (WinSt<>'');
Pl.Show;
an.Show;
GotoXY(28,25);
Write(WinSt);
end.

 

 

 

 

 

 

 


HOME