Как найти игру на паскале

К оглавлению | Назад | Вперёд

Все программы, код которых выложен здесь, являются работоспособными. Ниже приведены возможные варианты реализации игр «Крестики-нолики» и «Змейка» на PascalABC.Net 3.0.

Крестики-нолики[править]

Описание алгоритма
  1. Отрисовать игровое поле.
  2. Позволить сделать шаг игроку.
  3. Проверить выиграл ли кто-то.
  4. Если да — выиграл текущий игрок, иначе — вернуться к шагу 1.

Управление:

  • Левая кнопка мыши — установить крестик/нолик.
uses GraphABC;
const
  N = 2;
  Z = '0';
  K = 'X';
  Size = 200;
  Border = 1;
  Sx = 1200;
  Sy = 70;

var
  Matrix: array [0..N, 0..N] of char;
  Player1: boolean;

procedure Draw();
  procedure DrawZ(i, j: integer);
  begin
    SetPenColor(clCyan);
    SetPenWidth(4);
    var size2 := Size div 2;
    DrawCircle((i + 1) * Size - size2, (j + 1) * Size - size2, Round(size2 * 0.7));
  end;
  
  procedure DrawK(i, j: integer);
    procedure RLine(x, y, x1, y1: real):=Line(Round(x), Round(y), Round(x1), Round(y1));

  begin
    SetPenColor(clPink);
    SetPenWidth(4);
    var size2 := Size div 2 * 0.3;
    var cx1 := i * Size + size2;
    var cy1 := j * Size + size2;
    var cx2 := (i + 1) * Size - size2;
    var cy2 := (j + 1) * Size - size2;
    RLine(cx1, cy1, cx2, cy2);
    RLine(cx1, cy2, cx2, cy1);
  end;

  begin
    ClearWindow(clBlack);
    if Player1 then SetWindowCaption('Ходит первый игрок') else SetWindowCaption('Ходит второй игрок');
    for var i := 0 to N do
      for var j := 0 to N do
      begin
        SetPenColor(clLightBlue);
        SetPenWidth(1);
        DrawRectangle(i * Size + Border, j * Size + Border, (i + 1) * Size - Border, (j + 1) * Size - Border);
        if Matrix[i, j] = Z then DrawZ(i, j)
        else if Matrix[i, j] = K then DrawK(i, j);
      end;
    Redraw();
  end;

function Won(c: char): boolean;
var
  count: byte;
begin
  Result := false;
  for var i := 0 to N do
  begin
    count := 0;
    for var j := 0 to N do
      if Matrix[i, j] = c then Inc(count);
    if count = 3 then Result := true;
  end;
  
  if not Result then
  begin
    for var i := 0 to N do
    begin
      count := 0;
      for var j := 0 to N do
        if Matrix[j, i] = c then Inc(count);
      if count = 3 then Result := true;
    end;
    
    if not Result then
    begin
      count := 0;
      for var i := 0 to N do
        if Matrix[i, i] = c then Inc(count);
      if count = 3 then Result := true;
      
      if not Result then
      begin
        count := 0;
        for var i := 0 to N do
          if Matrix[N - i, i] = c then Inc(count);
        if count = 3 then Result := true;
      end;
    end;
  end;
end;

function IsFull(): boolean;
begin
  Result := true;
  for var i := 0 to N do
    for var j := 0 to N do
      if (Matrix[i, j] <> Z) and (Matrix[i, j] <> K) then
      begin
        Result := false;
        break;
      end;
end;

procedure MouseDown(x, y, mb: integer);
  procedure ShowWinner(s: string; c: Color);
  begin
    SetWindowCaption('Результат игры');
    Sleep(2000);
    SetWindowSize(Sx, Sy);
    CenterWindow();
    ClearWindow(clBlack);
    
    SetFontSize(16);
    SetFontStyle(fsBold);
    SetFontColor(c);
    DrawTextCentered(0, 0, Sx, Sy, s);
    
    Redraw();
    Sleep(2000);
    Halt();
  end;

begin
  var i := x div Size;
  var j := y div Size;
  if (Matrix[i, j] <> Z) and (Matrix[i, j] <> K) then
  begin
    if Player1 then Matrix[i, j] := Z else Matrix[i, j] := K;
    Draw();
    
    var winnerExists := Won(Z) or Won(K);
    if winnerExists then
      if Player1 then ShowWinner('Игрок первый победил!', clLightBlue) else ShowWinner('Игрок второй победил!', clLightBlue);
    
    if IsFull() and not winnerExists then ShowWinner('Ничья!', clOrange);
    
    Player1 := not Player1;
  end;
end;

begin
  var Size2 := Size * 3;
  SetWindowIsFixedSize(true);
  SetWindowSize(Size2, Size2);
  CenterWindow();
  LockDrawing();
  
  Player1 := true;
  Draw();
  
  OnMouseDown := MouseDown;
end.

Змейка[править]

==Упрощенный вариант== (просто змейка которой можно управлять)

Описание алгоритма
  1. Нарисовать змейку.
  2. Если нажали клавишу — добавить новую точку, в которую перешла голова змейки, в список и удалить первую точку в списке. Перейти к шагу 1.

Управление:

  • W — вверх.
  • S — вниз.
  • A — влево.
  • D — вправо.
uses GraphABC;
const
  Size = 20;

var
  Snake: List<Point>;

procedure Draw();
begin
  ClearWindow();
  Polyline(Snake.ToArray());
  
  var c := Snake.Count - 1;
  Circle(Snake[c].X, Snake[c].Y, 5);
  Redraw();
end;

procedure KeyDown(Key: integer);
begin
  var c := Snake.Count - 2;
  case Key of
    VK_Left:
      begin
        Snake.RemoveAt(0);
        Snake.Add(new Point(Snake[c].X - Size, Snake[c].Y));
      end;
    VK_Right:
      begin
        Snake.RemoveAt(0);
        Snake.Add(new Point(Snake[c].X + Size, Snake[c].Y));
      end;
    VK_Up:
      begin
        Snake.RemoveAt(0);
        Snake.Add(new Point(Snake[c].X, Snake[c].Y  - Size));
      end;
    VK_Down:
      begin
        Snake.RemoveAt(0);
        Snake.Add(new Point(Snake[c].X, Snake[c].Y  + Size));
      end;
  end;
  Draw();
end;

begin
  LockDrawing();
  SetSmoothingOff();
  
  Snake := new List<Point>();
  for var x := 1 to 30 do
    Snake.Add(new Point(x * Size, Size));
  
  Draw();
  OnKeyDown := KeyDown;
end.

456

Возрастающая последовательность[править]

uses GraphABC, ABCObjects;
const
  Border = 100;


var
  Obj: CircleABC;
  DX, DY: integer;
  Move: boolean;
  Numbers: TCircles;

function IsEqual(L2: TCircles): boolean;8
begin
  Result := true;
  for var i := 0 to L2.Count - 1 do
    if Numbers[i].Number <> L2[i].Number then
    begin
      Result := false;
      break;
    end;
end;

procedure MouseUp(x, y, mb: integer);
procedure MouseMove(x, y, mb: integer);
begin
  if mb = 1 then
    if not Move then
    begin
      for var i := 0 to Numbers.Count - 1 do
        if Numbers[i].PtInside(x, y) then
        begin
          DX := x - Numbers[i].Position.X;
          DY := y - Numbers[i].Position.Y;
          Obj := Numbers[i];
          
          Move := true;
          break;
        end;
    end
    else
      Obj.Position := new Point(x - Dx, y - Dy);
end;

begin
  var W := Window.Width - 2 * Border;
  var H := Window.Height - 2 * Border;
  
  Numbers := new TCircles();
  for var i := 0 to 6 do
  end;
begin
    Numbers.Add(new CircleABC(Border + Random(W), Border + Random(H), 30, clRandom()));
    Numbers.Last().Number := i;
  
  Move := false;
  OnMouseMove := MouseMove;
  OnMouseUp := MouseUp;76
end.

430

uses
  graphABC, ABCobjects, timers;



var
  f, fn: text;
  t,check: Timer;
  base_color, cgr: Color;
  
  ug, time_play_sec,take_speed,time: real;
  login, Str, str2, str3, st1, ch, password, zs, ks: string;
  chapter, level, n, xgr, ygr, rgr, x_power, y_power,spin, time_play_sec2,chapter_test: integer;  
  xb, yb, xg, yg, power, ww, wh, shot, time_play_min, shot_max,level_test: integer;
  
  Basa: RegularPolygonABC;
  show4, target, target_bad: ObjectABC;
  show, show2, show3, registr_but, login_but, status_box: RectangleABC;
  Star, sun: StarABC;
  show_pos: CircleABC;
    
  Average_ugol: array of integer;
  Average_power: array of integer;
  mb: array[1..62] of string;
  ground: array [1..9] of CircleABC;
  panel: array [1..5] of RectangleABC;
  
  lvlup_b, play, Cont, login_next, regist_next, from_0, from_6: boolean;

procedure pfile;
begin
  Assign(fn, login + '.txt');
  append(fn);
  writeln(fn, '0');
  write(fn, '0');
  close(fn);
end;

procedure prewrite;
begin
  Assign(f, login + '.txt');
  Rewrite(f);
  writeln(f, level);
  Write(f, chapter);
  Close(f);
end;

procedure pread;
var
  level_s, chapter_s: string;
begin
  Assign(f, login + '.txt');
  Reset(f);
  repeat
    Readln(f, level_s);
    level := StrToInt(level_s);
    readln(f, chapter_s);
    chapter := StrToInt(chapter_s);
  until Eof(f);
  Close(f);
end;

procedure pgenerate;
begin
  var show_login: RectangleABC := new RectangleABC(0, 51, 150, 35, clorangeRed);
  show_login.Text := 'Ваш логин: ' + Login;
  st1 := 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789.';
  for var it := 1 to st1.length - 1 do 
  begin
    mb[it] := st1[it];
  end;
  status_box.Text := 'Введите пароль: ';
  readln(ch);
  password := ch;
  status_box.text := 'Вы создали нового пользователя!';
  show_login.Destroy; 
  pfile;
end;

procedure pcreate;
begin
  var show_login: RectangleABC := new RectangleABC(0, 51, 150, 25, clorangeRed);
  assign(F, 'users.txt');
  append(f);
  close(f);
  reset(f);
  show_login.text := 'Введите логин: ';
  status_box.Text := 'Введите логин: ';
  readln(login);
  while not eof(f) do
  begin
    if (str <> str2) then eof(f);
    readln(f, str);
    if pos(login, str) > 0 then begin
      str2 := str;
      readln(f, str);
      str3 := str;
      if (str <> str2) then eof(f);
    end;
  end;
  close(f);
  if login = str2 then begin
    status_box.Text := 'Это имя уже занято!';
    regist_next := false;
  end
  else begin
    Append(F);
    status_box.text := 'Помощь: Если ввести /gen, то пароль будет сгенерирован автоматически.';
    pgenerate;
    zs := '';
    ks := ',.!@?-:;+';
    for var i := 1 to password.Length do 
    begin
      n := pos(password[i], ks);
      zs := zs + inttostr(n);
    end; 
    zs := '';
    ks := ',.!@?-:;+Zqazwsxedc90rfvtgbhnu7jAmiklop345QWERTYSXDCyFVG1BUHNMJI2OPKL68';
    for var i := 1 to password.Length do 
    begin
      n := pos(password[i], ks);
      zs := zs + inttostr(n);
    end;
    password := zs;
    writeln(f, login);
    writeln(f, password);
    close(f); 
  end;
  show_login.Destroy;
end;

procedure plogin;
begin
  Assign(f, 'users.txt');
  append(f);
  Close(f);
  Assign(f, 'users.txt');
  reset(f);
  var show_login: RectangleABC := new RectangleABC(0, 51, 150, 35, clorangeRed);
  show_login.Text := 'Ваш логин: ';
  status_box.Text := 'Введите логин';
  readln(Login); 
  show_login.Text += Login;
  while not eof(f) do
  begin
    if (str <> str2) then eof(f);
    readln(f, str);
    if pos(login, str) > 0 then begin
      str2 := str;
      readln(f, str);
      str3 := str;
      if (str <> str2) then eof(f);
    end;
  end;
  status_box.Text := 'введите пароль';
  readln(password);
  zs := '';
  ks := ',.!@?-:;+Zqazwsxedc90rfvtgbhnu7jAmiklop345QWERTYSXDCyFVG1BUHNMJI2OPKL68';
  for var i := 1 to password.Length do 
  begin
    n := pos(password[i], ks);
    zs := zs + inttostr(n);
  end;
  password := zs;
  if (str3 = password) then begin
    status_box.Text := 'Выполнен вход в учетную запись: ' + Login;
  end
  else begin status_box.Text := 'Ошибка входа: Неверный логин или пароль'; login_next := false; end;
  close(f);
  show_login.Destroy;
end;

procedure stats;
var
  x, y, w, h: integer;
begin
  x := 0;
  y := wh - 30;
  w := 160;
  h := 30;
  for var i := 1 to 5 do //Создаем нижнюю панель
  begin
    if i < 5 then panel[i] := new RectangleABC(x, y, w + 1, h, RGB(120 + 15 * i, 50 + level * 5, 100));
    if i = 5 then panel[i] := new RectangleABC(x, y, w, h, RGB(120 + 15 * i, 50 + level * 5, 100));
    panel[i].BorderWidth := 2;
    x += w;
  end;
end;

procedure Start;
begin
  SetWindowSize(800, 600);
  ClearWindow(clWhite);
  wh := WindowHeight;
  ww := WindowWidth;
  if level = 0 then level := 0;
  if chapter = 0 then chapter := 0;
  Window.IsFixedSize := true;
  sun := new StarABC(35, 35, 20, 25, 16, clGold);
  SetLength(Average_power, 0);
  SetLength(Average_ugol, 0);
  shot := 0;
  time_play_min := 0;
  time_play_sec := 0;
end;

procedure basegen(xb, yb: integer);//создаем базу
begin
  Line(xb - 50, yb, xb + 50, yb);
  Line(xb, yb - 50, xb, yb + 50);
  Line(xb - 50, yb - 1, xb + 50, yb - 1);
  Line(xb - 1, yb - 50, xb - 1, yb + 50);
  Line(xb - 50, yb, xb + 50, yb);
  Line(xb, yb - 50, xb, yb + 50);
  Line(xb - 50, yb - 1, xb + 50, yb - 1);
  Line(xb - 1, yb - 50, xb - 1, yb + 50);
  basa := new RegularPolygonABC(xb, yb, 30, 5, base_color);
end;

procedure mapgen(level_p: integer);//генерируем карту
begin
  target_bad := new RectangleABC(0, 0, 0, 0, clWhite);
  shot_max := 5;
  xb := 100;
  yb := 300;
  xgr := 0;
  ygr := 530;
  rgr := 100;
  cgr := clLavender;
  for var i := 1 to 9 do 
  begin
    ground[i] := new CircleABC(xgr, ygr, rgr, cgr);
    ground[i].bordered := false;
    xgr += 100;
  end;
  xgr := 0;
  for var i := 1 to 9 do 
  begin
    Arc(xgr, ygr - 1, 100, 60, 120);
    xgr += 100;
  end;
  basegen(xb, yb);//добавляем базу
  
  if level_p=-2 then begin target := new rectangleABC(650, 100, 10, 300, clRed); end;
  
  
  if level_p = 0 then begin
    from_0 := true;
    show := new RectangleABC(100, 0, ww - 100, 20, clwheat);
    show.Text := 'Кликните в любом месте мышкой и удерживая перетащите в любое другое место, так вы сможете выбрать силу.';
    show2 := new RectangleABC(100, 20, ww - 100, 20, clwheat);
    show2.Text := 'Внизу на панеле отображается ваши текущие угол и сила, При соприкосновении с поверхностью ядро взрывается';
    show3 := new RectangleABC(100, 40, ww - 100, 20, clwheat);
    show4 := new RectangleABC(0, 60, ww, 20, cllime);
    show3.Text := 'На каждом уровне есть ограниченное кол-во выстрелов, если вы не успели попасть в цель, вы переходите на уровень назад';
    show4.text := 'Чтобы пройти уровень надо попадать по красным мишеням. Сейчас попадите в красную стенку';
    show3.TextScale := 0.9;
    target := new rectangleABC(650, 100, 10, 300, clRed);
  end;
  stats;//добавляем нижнюю панель
  panel[3].Text := 'Глава: ' + IntToStr(chapter);
  panel[4].Text := 'Уровень: ' + IntToStr(level); 
  if level_p = 1 then begin
    if (from_0 = true) then begin
      show.Destroy;
      show2.Destroy;
      show3.Destroy;
      show4.Destroy;
    end;
    target := new CircleABC(300, 200, 30, clRed);
  end;
  if level > 1 then panel[5].Text := 'Выстрел ' + IntToStr(shot) + ' из ' + IntToStr(shot_max);  
  if (level_p = 2) then target := new CircleABC(400, 400, 30, clRed);
  if (level_p = 3) then target := new CircleABC(100, 50, 30, clRed);
  if (level_p = 4) then target := new CircleABC(500, 110, 30, clRed);
  if (level_p = 5) and (from_6 = false) then target := new CircleABC(700, 330, 20, clRed);
  if (level_p = 5) and (from_6 = true) then begin show.Destroy; target := new CircleABC(700, 330, 20, clRed); end;
  if (level_p = 6) then begin
    from_6 := true; show := new RectangleABC(100, 0, ww - 100, 20, clwheat);
    show.Text := 'Черные цели перенаправляют вас сразу на уровень назад!';
    target := new CircleABC(720, 350, 30, clred); target_bad := new CircleABC(720, 150, 30, clblack);
  end;
  
  time_play_min := 0;
  time_play_sec := 0;
  if level > 6 then begin
    if (from_6 = true) then begin
      from_6 := false;
      show.Destroy;
    end;
    target := new CircleABC(Random(100, ww - 50), Random(100, wh - 250), 30, clRed);
  end;
end;

procedure lvldown;
begin
  target.Destroy;
  target_bad.Destroy;
  ClearWindow(clWhite);
  var stat_box := new RoundRectABC(10, 10, ww - 20, wh - 20, 15, clslateblue);
  stat_box.BorderWidth := 2;
  var box: array[1..5] of RoundRectABC;
  var x_box, y_box: integer;
  x_box := 20;
  y_box := 20;
  for var i := 1 to 5 do 
  begin
    box[i] := new RoundRectABC(x_box, y_box, ww - 40, 100, 15, RGB(100 + 20 * i, 100, 100));
    box[i].BorderWidth := 2;
    y_box += 105;
    if i = 1 then begin box[i].Color := clred; box[i].Text := 'Вы не прошли уровень: ' + IntToStr(level); end;
    if i = 2 then box[i].Text := 'Средняя сила: ' + IntToStr(Round(Average_power.Average)) + 'p';
    if i = 3 then box[i].Text := 'Средний угол: ' + IntToStr(Round(Average_ugol.Average));
    if i = 4 then box[i].Text := 'Выстрелов: ' + IntToStr(shot); 
    if i = 5 then begin
      if time_play_min = 0 then box[i].Text := 'Время: ' + time_play_sec.ToString + 'c.'
      else box[i].Text := 'Время: ' + time_play_min.ToString + 'm. ' + time_play_sec.ToString + 'c.';
    end;
  end;
  Sleep(5000);
  for var i := 1 to 5 do box[I].Destroy;
  stat_box.destroy;
  level -= 1;
  SetLength(Average_power, 0);
  SetLength(Average_ugol, 0);
  shot := 0;
  prewrite;
  mapgen(level);
  Basa.RedrawNow;
  for var i := 1 to 5 do panel[i].RedrawNow;
  sun.RedrawNow;
  for var i := 1 to 9 do ground[i].RedrawNow;
end;

procedure lvlup;
begin
  lvlup_b := false;
  ClearWindow(clWhite);
  
  target.Destroy;
  target_bad.Destroy;
  var stat_box := new RoundRectABC(10, 10, ww - 20, wh - 20, 15, clslateblue);
  stat_box.BorderWidth := 2;
  var box: array[1..5] of RoundRectABC;
  var x_box, y_box: integer;
  x_box := 20;
  y_box := 20;
  for var i := 1 to 5 do 
  begin
    box[i] := new RoundRectABC(x_box, y_box, ww - 40, 100, 15, RGB(100, 100 + 20 * i, 170));
    box[i].BorderWidth := 2;
    y_box += 105;
    if i = 1 then begin box[i].Color := cllime; box[i].Text := 'Вы прошли уровень: ' + IntToStr(level); end;
    if i = 2 then box[i].Text := 'Средняя сила: ' + IntToStr(Round(Average_power.Average)) + 'p';
    if i = 3 then box[i].Text := 'Средний угол: ' + IntToStr(Round(Average_ugol.Average));
    if i = 4 then box[i].Text := 'Выстрелов: ' + IntToStr(shot); 
    if i = 5 then begin
      if time_play_min = 0 then box[i].Text := 'Время: ' + time_play_sec.ToString + 'c.'
      else box[i].Text := 'Время: ' + time_play_min.ToString + 'm. ' + time_play_sec.ToString + 'c.';
    end;
  end;
  Sleep(5000);
  for var i := 1 to 5 do box[I].Destroy;
  stat_box.destroy;
  level += 1;
  if (level = 1) and (chapter = 0) then chapter += 1;
  if (level mod 6 = 0) and (level > 1) then chapter += 1;
  SetLength(Average_power, 0);
  SetLength(Average_ugol, 0);
  shot := 0;
  prewrite;
  mapgen(level);
  Basa.RedrawNow;
  for var i := 1 to 5 do panel[i].RedrawNow;
  sun.RedrawNow;
  for var i := 1 to 9 do ground[i].RedrawNow;
  
end;

function myfunc(xr, yr, p, ug: real): real;//функция полета
var
  t: real;
begin
  play := true;
  t := 0;//Время
  xg := 0;//Коориданата Х
  yg := 0;//Коориданата У
  Star := new StarABC(Round(xr), Round(yr), 20, 10, 10, clRandom);//Создаем объект-ядро
  if level < 0 then Check.Start;
  repeat
  if level < 0 then TextOut(0,500,'ПРОРИСОВКА: '+time_play_sec2.ToString+' ');
    xg := Round((xr) + ((p * t * cos(ug)) / 2));
    yg := Round((yr) - (p * t * sin(ug) - (9.8 * t * t / 2)));
    xg -= 2;
    Star.MoveTo(xg, yg);//перемещения ядра в (xg,yg)
    Star.Angle += spin;//Вращаем ядро
    MoveTo(xg, yg);
    PutPixel(xg, yg, clRed);//рисуем путь
    t += time;//Прибавляем время
    sleep(2);//Задержка в 2 милисекунды 
    if (Star.Intersect(target) = true) then lvlup_b := true;
    if (Star.Intersect(target_bad) = true) then begin lvlup_b := false; shot += shot_max * 2; end;
    if (Star.Intersect(target) = true) then take_speed := time_play_sec2;
  until (star.Intersect(ground[1]) = true) or (star.Intersect(ground[2]) = true) 
   or (star.Intersect(ground[3]) = true) or (star.Intersect(ground[4]) = true)
    or (star.Intersect(ground[5]) = true) or (star.Intersect(ground[6]) = true)
     or (star.Intersect(ground[8]) = true) or (star.Intersect(ground[8]) = true)
      or (star.Intersect(ground[9]) = true) or (xg > ww + 10) or (Star.Intersect(target) = true)
      or (star.Intersect(target_bad) = true);
     if level < 0 then  check.Stop;
     if level < 0 then  time_play_sec2:=0;
  Star.Destroy;//убираем звезду
  shot += 1;
  if level > 1 then panel[5].Text := 'Выстрел ' + IntToStr(shot) + ' из ' + IntToStr(shot_max);
  
  //подсчет средних
  setLength(Average_ugol, shot);
  Average_ugol[shot - 1] := Round(RadToDeg(ug));
  setLength( Average_power, shot);
  Average_power[shot - 1] := Round(power);
  if (shot > shot_max - 1) and (lvlup_b = false) and (level > 1) then lvldown;
  if (level > 0) then if (lvlup_b = true) and (shot < shot_max + 1) then lvlup;
  if (level < 2) and (lvlup_b = true) then lvlup;
  myfunc := t;
  Play := false;
end;

procedure MouseMove(xm, ym, mb: integer);
var
  a, b, c: real;
begin
  a := Abs(xm - xb);
  b := Abs(ym - yb);
  c := Sqrt(Sqr(a) + Sqr(b));
  ug := (arcsin(b / c));
  panel[1].Text := 'Угол: ' + IntToStr(Round(RadToDeg(ug)));
  if mb = 1 then  panel[2].Text := 'Сила: ' + IntToStr(Round(sqrt(sqr((xm - x_power)) + sqr((ym - y_power))))) + 'p';//Показываем силу
end;

procedure MouseDown(xm, ym, mb: integer);
begin
  show_pos := new CircleABC(xm, ym, 2, clwheat);
  x_power := xm;
  y_power := ym;
end;

procedure MouseUp(xm, ym, mb: integer);
var
  a, b, c: real;
begin
  a := Abs(xm - xb);
  b := Abs(ym - yb);
  c := Sqrt(Sqr(a) + Sqr(b));
  ug := (arcsin(b / c));
  power := Round(sqrt(sqr((xm - x_power)) + sqr((ym - y_power))));//Высчитывем силу
  panel[1].FontColor := clWhite;
  panel[1].text := 'Угол полета: ' + IntToStr(Round(RadToDeg(ug)));
  panel[2].FontColor := clWhite;
  panel[2].text := 'Сила полета: ' + IntToStr(Round(power)) + 'p';
  if (mb = 1) and (play = false) and (power > 0) then myfunc(xb, yb, power, ug);//запускаем ядро
  panel[2].FontColor := clBlack;
  panel[1].FontColor := clBlack;
  panel[2].Text := '';
  show_pos.Destroy;
end;

procedure rotate;
begin
  sun.Angle += 1;
  time_play_sec += 0.5;
  if time_play_sec = 60.0 then begin time_play_min += 1; time_play_sec := 0; end;
end;

procedure MouseDownS(xm, ym, mb: integer);
begin
  if mb = 1 then base_color := GetPixel(xm, ym);
end;

procedure Hello;
begin
  SetWindowSize(800, 600);
  Window.IsFixedSize := true;
  var start1 := new RoundRectABC(8, 8, windowwidth - 16, WindowHeight - 15, 10, clLavender);
  start1.BorderWidth := 3;
  var start1_name := new RoundRectABC(15, 15, windowwidth - 30, 50, 10, clGreenYellow);
  start1_name.BorderWidth := 2;
  start1_name.Text := 'Добро пожаловать, ' + Login + '!';
  Sleep(200);
  var start1_color := new RoundRectABC(15, 70, WindowWidth - 30, 50, 10, clFirebrick);
  start1_color.BorderWidth := 2;
  start1_color.Text := 'Выберите цвет базы';
  for var iy := 1 to 18 do 
  begin
    Rectangle(50, 105 + iy * 25, 151, 135 + iy * 25);
    FloodFill(52, 105 + iy * 25 + 2, clRandom);
  end;
  for var iy := 1 to 18 do 
  begin
    Rectangle(50 + 100 * 1, 105 + iy * 25, 151 + 100 * 1, 135 + iy * 25);
    FloodFill(52 + 100 * 1, 105 + iy * 25 + 2, clRandom);
  end;
  for var iy := 1 to 18 do 
  begin
    Rectangle(50 + 100 * 2, 105 + iy * 25, 151 + 100 * 2, 135 + iy * 25);
    FloodFill(52 + 100 * 2, 105 + iy * 25 + 2, clRandom);
  end;
  for var iy := 1 to 18 do 
  begin
    Rectangle(50 + 100 * 3, 105 + iy * 25, 151 + 100 * 3, 135 + iy * 25);
    FloodFill(52 + 100 * 3, 105 + iy * 25 + 2, clRandom);
  end;
  for var iy := 1 to 18 do 
  begin
    Rectangle(50 + 100 * 4, 105 + iy * 25, 151 + 100 * 4, 135 + iy * 25);
    FloodFill(52 + 100 * 4, 105 + iy * 25 + 2, clRandom);
  end;
  for var iy := 1 to 18 do 
  begin
    Rectangle(50 + 100 * 5, 105 + iy * 25, 151 + 100 * 5, 135 + iy * 25);
    FloodFill(52 + 100 * 5, 105 + iy * 25 + 2, clRandom);
  end;
  for var iy := 1 to 18 do 
  begin
    Rectangle(50 + 100 * 6, 105 + iy * 25, 151 + 100 * 6, 135 + iy * 25);
    FloodFill(52 + 100 * 6, 105 + iy * 25 + 2, clRandom);
  end;
  OnMouseDown := MouseDownS;
  var timerShow := new RoundRectABC(WindowWidth - 55, 70, 40, 50, 10, clcyan);
  timerShow.BorderWidth := 2;
  timerShow.Text := '3';
  Sleep(1000);
  timerShow.Text := '2';
  Sleep(1000);
  timerShow.Text := '1';
  Sleep(1000);
  timerShow.Destroy;
  start1.Destroy;
  start1_color.Destroy;
  start1_name.Destroy;
end;

procedure MouseDownBeg(xm, ym, mb: integer);
begin
  if login_but.PtInside(xm, ym) = true then login_next := true;
  if registr_but.PtInside(xm, ym) = true then regist_next := true;
end;
procedure timer_check;
begin
  time_play_sec2 += 1;
end;

begin
base_color:=clRandom;
  SetWindowCaption('TimeKiller v0.2');
  target_bad := new RectangleABC(0, 0, 0, 0, clWhite);
  SetWindowSize(800, 600);
  cont := false;
  from_0 := false;
  from_6 := false;
  OnMouseDown := MouseDownBeg;
  var main: RectangleABC := new RectangleABC(0, 0, WindowWidth, windowheight, clLavender);
  login_but := new RectangleABC(0, 0, 401, 50, clolive);
  registr_but := new RectangleABC(399, 0, 400, 50, clOliveDrab);
  login_but.BorderWidth := 2;
  registr_but.BorderWidth := 2;
  login_but.FontColor := clwhite;
  registr_but.FontColor := clgold;
  login_but.Text := 'Войти';
  registr_but.Text := 'Зарегистрироваться';
  status_box := new RectangleABC(0, WindowHeight - 30, WindowWidth, 30, clgold);
  status_box.BorderWidth := 2;
  status_box.Color := ARGB(120, 255, 215, 0);
  status_box.Text := 'Вам необходимо войти или зарегистрироваться';
  repeat
    Sleep(1000);
    if login_next = true then begin plogin; end; 
    if regist_next = true then begin pcreate; end; 
  until (login_next = true) or (regist_next = true);
  pread;
  cont := true;
  if Cont = true then begin
    main.Destroy;
    status_box.Destroy;
    login_but.Destroy;
    registr_but.Destroy;
    Hello;
    start;
    
    TextOut(0,0,'Подождите идет загрузка данных. Прорисовка.');
     time := 0.02;
     spin := 1;
    time_play_sec := 0;
    level_test:=level;
    chapter_test:=chapter;
    chapter:=0;
    level:=-2;
    mapgen(level); 
   
    Check := new Timer(1, timer_check);
    
    myfunc(xb, yb, 200, Pi / 10);//Проверка медленной скорости;
   
    if take_speed > 100 then begin time := 0.08; spin := 2; end;
    check.Stop; 
    Check := new Timer(1, timer_check);
    time_play_sec := 0;
    target.Destroy;
    level:=-2;
    mapgen(level);
    TextOut(0,0,'Подождите идет загрузка данных. Прорисовка.');
    myfunc(xb, yb, 200, Pi / 10);//Проверка быстрой скорости;
   
    if take_speed < 50 then begin time := 0.02; spin := 1; end;
    target.Destroy;
    level:=level_test;
    chapter:=chapter_test;
  
    
    mapgen(level); 
    T := new Timer(500, rotate);
    T.Start;
    OnMouseMove := MouseMove; 
    OnMouseDown := MouseDown;
    OnMouseUp := MouseUp;
  end;
end.

Представляю Вашему вниманию пример реализации алгоритмической игры «Жизнь» на языке Паскаль. Игра «Жизнь», она же так называемый клеточный автомат, обязана своим появлением английскому математику Джону Конвейю.

Для начала — относительно простой, но одновременно структурированный вариант текста программы (на Free Pascal в самом простом и совместимом исполнении):

program Life;

uses
  ptcGraph, ptcCrt;

const
  HorSize = 640;
  VerSize = 480;

type
  TMatrix = array [0..VerSize+1, 0..HorSize+1] of Byte;

var
  GraphDriver :Integer;
  GraphMode :Integer;

  NewArr, OldArr :TMatrix;

  { Процедура очистки массива (заполнения нулями) }
  procedure ClearMatrix(var Matrix :TMatrix; VSize, HSize :Integer);
  var
    i, j :Integer;
  begin
    for i := 0 to VSize+1 do
      for j := 0 to HSize+1 do
        Matrix[i, j] := 0;
  end;

  { Процедура "вставки" в массив некоторого прямоугольника из единиц }
  procedure InitMatrix(var Matrix :TMatrix;
                           RVpos, RHPos, RVSize, RHSize :Integer);
  var
    i, j :Integer;
  begin
    for i := 1 to RVSize do
      for j := 1 to RHSize do
        Matrix[RVPos+i-1, RHPos+j-1] := 1;
  end;

  { Процедура "заворачивания" границ массива для эмуляции "бесконечного" поля }
  procedure InfiMatrixEdges(var Matrix :TMatrix; VSize, HSize :Integer);
  var
    i :Integer;
  begin
    Matrix[0, 0] := Matrix[VSize, HSize];
    Matrix[VSize+1, HSize+1] := Matrix[1, 1];
    Matrix[0, HSize+1] := Matrix[VSize, 1];
    Matrix[VSize+1, 0] := Matrix[1, HSize];

    for i := 1 to VSize do
      begin
        Matrix[i, 0] := Matrix[i, HSize];
        Matrix[i, HSize+1] := Matrix[i, 1];
      end;

    for i := 1 to HSize do
      begin
        Matrix[0, i] := Matrix[VSize, i];
        Matrix[VSize+1, i] := Matrix[1, i];
      end;
  end;

  { Процедура реализации игровой логики }
  procedure GameLogic(var Source, Dest :TMatrix; VSize, HSize :Integer);
  var
    i, j :Integer;
    around :Byte;
  begin
    for i := 1 to VSize do
      for j := 1 to HSize do
        begin
          around := Source[i-1, j-1] + Source[i-1, j] + Source[i-1, j+1] +
                    Source[i, j-1] + Source[i, j+1] +
                    Source[i+1, j-1] + Source[i+1, j] + Source[i+1, j+1];

          case Source[i, j] of
            0: if around = 3 then
                 Dest[i, j] := 1
               else
                 Dest[i, j] := 0;
            1: if (around < 2) or (around > 3) then
                 Dest[i, j] := 0
               else
                 Dest[i, j] := 1;
          end;
        end;
  end;

  { Процедура "визуализации" - отрисовывает игровое поле на экран }
  procedure DrawMatrix(var Matrix :TMatrix; VSize, HSize :Integer;
                                            Color, Background :Integer);
  var
    i, j :Integer;
  begin
    for i := 1 to VSize do
      for j := 1 to HSize do
        case Matrix[i, j] of
          0: PutPixel(j-1, i-1, Background);
          1: PutPixel(j-1, i-1, Color);
        end;
  end;

begin

  ClearMatrix(NewArr, VerSize, HorSize);
  ClearMatrix(OldArr, VerSize, HorSize);

  InitMatrix(OldArr, 140, 220, 200, 200);

  { DetectGraph(GraphDriver, GraphMode);
  WriteLn('Driver: ', GraphDriver, ', Mode: ', GraphMode); }

  GraphDriver := VGA;
  GraphMode := VGAHi;
  InitGraph(GraphDriver, GraphMode, '');

  repeat

    GameLogic(OldArr, NewArr, VerSize, HorSize);
    InfiMatrixEdges(NewArr, VerSize, HorSize);

    OldArr := NewArr;

    { Delay(100); }

    DrawMatrix(NewArr, VerSize, HorSize, 15, 0);

  until KeyPressed;

  CloseGraph;

end.

Пояснения по тексту программы ниже, а сейчас — немного о сути игры.

В нашем распоряжении есть игровое поле — двумерный массив ячеек (клеток). Каждая такая ячейка может находиться в одном из двух возможных состояний: «живом» и «неживом». Скажем, пусть состоянию «жив» соответствует численное значение, равное 1, а состоянию «мертв» — численное значение, равное 0. Для образности каждую «живую» ячейку мы можем называть, скажем, бактерией.

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

Суть игрового алгоритма такова: по очереди «пересматриваем» все клетки и подсчитываем количество «живых соседей» каждой клетки. В зависимости от количества «живых соседей» меняем состояние текущей клетки — «возрождаем» (создаем) нашу «бактерию» либо «убиваем» её. Вот варианты условия:

  • если вокруг пустой («мертвой») находятся ровно три непустые («живые») клетки, то данная клетка «оживает» (либо, другими словами, «появляется» — кому как больше нравится);
  • состояние непустой («живой») клетки при наличии двух или трех непустых же («живых») соседей не изменяется (клетка продолжает «существовать»);
  • если у непустой («живой») клетки меньше двух или больше трех «живых» соседей, то данная клетка «умирает» (перестает «существовать»).

Задав выборочно начальные условия (разместив на игровом поле то или иное количество «живых» клеток) и запустив игровой алгоритм, можно наблюдать за развитием «жизни» в пределах игрового поля — изменением конфигурации и количества «бактерий», их движением. Процесс и результат могут быть довольно любопытными.

И немного по тексту программы-примера. Для реализации игрового поля будем использовать двумерный массив элементов типа Byte, в цикле перебирая все его ячейки (по строкам и столбцам). «Живой» ячейкой будет элемент со значением «1», «мертвой» — со значением «0». Результат работы алгоритма, что естественно, будем помещать в другой идентичного типа двумерный массив, который и отображается графически. После отработки игрового алгоритма в очередном «шаге» первый массив будем обновлять, копируя в него содержимое из второго.

Чтобы сделать игровое поле «бесконечным» (и избавиться от «краевых» эффектов), мы «заворачиваем» края двумерного массива. Для этого добавляем к каждому краю двумерного массива по лишнему элементу, куда копируем значение элемента с противоположенного края. Соответственно, в данном случае каждая ячейка с обычным индексом в массиве «видит» полный набор «соседей» и алгоритм работает корректно (пусть и в «завернутом» пространстве игрового поля).

В тексте программы названия переменных и процедур/функций выбраны таким образом, чтобы можно было максимально быстро понять, для чего они нужны. Например, HorSize и VerSize — задают горизонтальный и вертикальный размеры игрового поля соответственно. Поскольку для реализации применен Free Pascal, графика выполнена с использованием модулей ptcGraph и ptcCrt (последний — для считывания клавиатуры). Но версия Паскаля здесь принципиального значения не имеет — программу легко адаптировать под любой диалект, немного изменится лишь реализация графики.

Скачать текст программы и её модификации с «улучшенной» графикой Вы можете здесь: zip-архив.

Превосходная программа, демонстрирующая возможности графики и алгоритма игры «Жизнь» на торе. Немного пояснений для тех кто только начинает учиться.

Игра «Жизнь» была придумана английским математиком Джоном Конвейем в 1970 году. Впервые описание этой игры опубликовано в октябрьском выпуске (1970) журнала Scientic American, в рубрике «Математические игры» Мартина Гарднера.

Место действия этой игры – «вселенная» – это размеченная на клетки поверхность. Каждая клетка на этой поверхности может находиться в двух состояниях: быть живой или быть мертвой. Клетка имеет восемь соседей. Распределение живых клеток в начале игры называется первым поколением. А дальше все происходит почти как в реальной жизни, потому игра так и называется. Каждое следующее поколение рассчитывается на основе предыдущего по таким правилам:

1) пустая (мертвая) клетка с ровно тремя живыми клетками-соседями оживает;
2) если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить;
3) в противном случае (если соседок меньше двух или больше трех) клетка умирает (от «одиночества» или от «перенаселенности»).

В этой задаче рассматривается игра «Жизнь» на торе. Представим себе прямоугольник размером n строк на m столбцов. Для того, чтобы превратить его в тор мысленно «склеим» его верхнюю сторону с нижней, а левую с правой. Таким образом, у каждой клетки, даже если она раньше находилась на границе прямоугольника, теперь есть ровно восемь соседей.

Ваша задача состоит в том, чтобы найти конфигурацию клеток, которая будет через k поколений от заданного.

А вот код решения задачи. Попробовать программу онлайн можно здесь. Перед переходом по ссылке скопируйте код программы, а затем вставьте в онлайн-компилятор. Программа может даже потянуть на простенькую курсовую.

// Игра "Жизнь" на торе
// Оптимизация хешированием по равномерной сетке
uses Graph;

const 
/// Пауза между поколениями
 delay = 10;
/// Ширина клетки
 w = 10;
/// Количество клеток по ширине
 m = 70;
/// Количество клеток по высоте
 n = 60;
/// Отступ поля от левой границы окна
 x0 = 1;
/// Отступ поля от верхней границы окна
 y0 = 21;
 mm = m + 1;
 nn = n + 1;
/// Количество клеток сетки по горизонтали
 mk = 10;
/// Количество клеток сетки по вертикали
 nk = 5;

var
 a,b,sosedia,sosedib: array [0..nn,0..mm] of byte;
 obnovA,obnovB: array [1..nk,1..mk] of boolean;
 CountCells: integer;
 obn: boolean;
 gen: integer;
 hn,hm: integer;

/// Нарисовать ячейку
procedure DrawCell(i,j: integer);
begin
 SetBrushColor(Color.Black);
 FillRectangle(x0+(j-1)*w,y0+(i-1)*w,x0+j*w-1,y0+i*w-1);
end;

/// Стереть ячейку
procedure ClearCell(i,j: integer);
begin
 SetBrushColor(Color.White);
 FillRectangle(x0+(j-1)*w,y0+(i-1)*w,x0+j*w-1,y0+i*w-1);
end;

/// Нарисовать все изменившиеся ячейки
procedure DrawConfiguration;
begin
 for var i:=1 to n do
 for var j:=1 to m do
 begin
 var bb := b[i,j];
 if a[i,j]<>bb then
 if bb=1 then DrawCell(i,j)
 else ClearCell(i,j);
 end;
end;

/// Нарисовать все ячейки
procedure DrawConfigurationFull;
begin
 for var i:=1 to n do
 for var j:=1 to m do
 if b[i,j]=1 then DrawCell(i,j)
 else ClearCell(i,j);
end;

/// Нарисовать поле
procedure DrawField;
begin
 Pen.Color := Color.LightGray;
 for var i:=0 to m do
 begin
 if i mod hm = 0 then
 Pen.Color := Color.Gray
 else Pen.Color := Color.LightGray;
 Line(x0+i*w-1,y0,x0+i*w-1,y0+n*w-1);
 end;
 for var i:=0 to n do
 begin
 if i mod hn = 0 then
 Pen.Color := Color.Gray
 else Pen.Color := Color.LightGray;
 Line(x0,y0+i*w-1,x0+m*w,y0+i*w-1);
 end;
end;

/// Увеличить массив соседей для данной клетки
procedure IncSosedi(i,j: integer);
var i1,i2,j1,j2: integer;
begin
 if i=1 then i1:=n else i1:=i-1;
 if i=n then i2:=1 else i2:=i+1;
 if j=1 then j1:=m else j1:=j-1;
 if j=m then j2:=1 else j2:=j+1;
 SosediB[i1,j1] += 1;
 SosediB[i1,j] += 1;
 SosediB[i1,j2] += 1;
 SosediB[i,j1] += 1;
 SosediB[i,j2] += 1;
 SosediB[i2,j1] += 1;
 SosediB[i2,j] += 1;
 SosediB[i2,j2] += 1;
end;

/// Уменьшить массив соседей для данной клетки
procedure DecSosedi(i,j: integer);
var i1,i2,j1,j2: integer;
begin
 if i=1 then i1:=n else i1:=i-1;
 if i=n then i2:=1 else i2:=i+1;
 if j=1 then j1:=m else j1:=j-1;
 if j=m then j2:=1 else j2:=j+1;
 SosediB[i1,j1] -= 1;
 SosediB[i1,j] -= 1;
 SosediB[i1,j2] -= 1;
 SosediB[i,j1] -= 1;
 SosediB[i,j2] -= 1;
 SosediB[i2,j1] -= 1;
 SosediB[i2,j] -= 1;
 SosediB[i2,j2] -= 1;
end;

/// Поставить ячейку в клетку (i,j)
procedure SetCell(i,j: integer);
begin
 if b[i,j]=0 then
 begin
 b[i,j] := 1;
 obn := True;
 IncSosedi(i,j);
 end;
 CountCells += 1;
end;

/// Убрать ячейку из клетки (i,j)
procedure UnSetCell(i,j: integer);
begin
 if b[i,j]=1 then
 begin
 b[i,j] := 0;
 obn := True;
 DecSosedi(i,j);
 end;
 CountCells -= 1;
end;

/// Инициализировать массивы и конфигурацию поля
procedure Init;
var 
 xc := n div 2;
 yc := m div 2;
begin
 for var i:=0 to n+1 do
 for var j:=0 to m+1 do
 b[i,j] := 0;
 a := b;
 SosediB := b;
 SosediA := SosediB;
 for var ik:=1 to nk do
 for var jk:=1 to mk do
 obnovB[ik,jk] := True;
 obnovA := obnovB;
 CountCells := 0;

 SetCell(xc,yc);
 SetCell(xc,yc+1);
 SetCell(xc,yc+2);
 SetCell(xc-1,yc+2);
 SetCell(xc+1,yc+1);
end;

/// Обработать ячейку
procedure ProcessCell(i,j: integer);
begin
 case SosediA[i,j] of
0..1,4..9:
 if b[i,j]=1 then
 begin
 b[i,j] := 0;
 obn := True;
 DecSosedi(i,j);
 ClearCell(i,j);
 Dec(CountCells);
 end;
3: if b[i,j]=0 then
 begin
 b[i,j] := 1;
 obn := True;
 IncSosedi(i,j);
 DrawCell(i,j);
 Inc(CountCells);
 end;
 end; {case}
end;

/// Перейти к следующему поколению
procedure NextGen;
var ifirst,jfirst,ilast,jlast: integer;
begin
 for var ik:=1 to nk do
 begin
 for var jk:=1 to mk do
 begin
 obn := False;
 ifirst := (ik-1)*hn+1;
 ilast := (ik-1)*hn+hn;
 jfirst := (jk-1)*hm+1;
 jlast := (jk-1)*hm+hm;
 if obnovA[ik,jk] then
 begin
 for var i:=ifirst to ilast do
 for var j:=jfirst to jlast do
 ProcessCell(i,j);
 end
 else
 begin
 var ik1,jk1,ik2,jk2: integer;
 if ik=1 then ik1:=nk else ik1:=ik-1;
 if ik=nk then ik2:=1 else ik2:=ik+1;
 if jk=1 then jk1:=mk else jk1:=jk-1;
 if jk=mk then jk2:=1 else jk2:=jk+1;
 var l := obnovA[ik,jk1];
 var r := obnovA[ik,jk2];
 var u := obnovA[ik1,jk];
 var d := obnovA[ik2,jk];
 var lu := obnovA[ik1,jk1];
 var ld := obnovA[ik2,jk1];
 var ru := obnovA[ik1,jk2];
 var rd := obnovA[ik2,jk2];
 if u then
 for var j:=jfirst+1 to jlast-1 do
 ProcessCell(ifirst,j);
 if d then
 for var j:=jfirst+1 to jlast-1 do
 ProcessCell(ilast,j);
 if l then
 for var i:=ifirst+1 to ilast-1 do
 ProcessCell(i,jfirst);
 if r then
 for var i:=ifirst+1 to ilast-1 do
 ProcessCell(i,jlast);
 if u or l or lu then
 ProcessCell(ifirst,jfirst);
 if u or r or ru then
 ProcessCell(ifirst,jlast);
 if d or l or ld then
 ProcessCell(ilast,jfirst);
 if d or r or rd then
 ProcessCell(ilast,jlast);
 end;
 obnovB[ik,jk] := obn;
 end;
 end;
end;

/// Перерисовка содержимого окна
procedure LifeRedrawProc;
begin
 DrawConfigurationFull;
end;

/// Вывод номера поколения и количества ячеек
procedure DrawInfo;
begin
 Brush.Color := Color.LightGray;
 FillRectangle(0,0,Window.Width,20);
 Font.Size := 10;
 TextOut(15,5,'Поколение '+IntToStr(gen));
 TextOut(Window.Width - 130,5,'Жителей: '+IntToStr(CountCells)+' ');
end;

begin
 if (m mod mk<>0) or (n mod nk<>0) then
 begin
 writeln('Размер кластера не согласован с размером поля. Программа завершена');
 exit
 end;
 hm := m div mk;
 hn := n div nk;
 Window.SetPos(200,50);
 Window.SetSize(x0+m*w,y0+n*w);
 Window.Title := 'Игра Жизнь';
 Init;
 
 DrawInfo;
 DrawField;
 DrawConfiguration;
 
 var mil := Milliseconds;
 gen := 0;
 Sleep(100);
 DrawField;
 
 while True do
 begin
 gen += 1;
 
// if gen mod 11 = 0 then
 DrawInfo;
 
 SosediA := SosediB;
 obnovA := obnovB;
 NextGen;
 DrawConfiguration;
 Sleep(delay);
 end;
end.

Похожие публикации

2016-01-14 • Просмотров [ 7925 ]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
uses
  GraphABC, ABCObjects;
 
var
  pic1, pic2, pic3: PictureABC;
  px1, px2, px3, p, m, n, m2, n2, m3, n3, b, b2, b3, bank, q1, q2, q3, r: integer;
  s, mstr, nstr, m2str, n2str, m3str, n3str, bstr, b2str, b3str, race: string;
 
procedure dorogi;
var
  y: integer;
begin
  Brush.Hatch := bhBackwardDiagonal;
  Brush.Style := bssolid;
  setbrushcolor(clred);
  Rectangle(window.Width - 30, window.Height div 4, window.Width, window.Height);
  SetPenWidth(2);
  for var i := 1 to 3 do
  begin
    y := Window.Height div 4;
    y := y * i;
    Line(0, y, window.Width - 30, y);
  end;
  Brush.Style := bsclear;
end;
 
procedure stavka;
begin
  SetBrushColor(clWhite);
  Brush.Style := bssolid;
  TextOut(10, 10, ' ');TextOut(10, 10, 'Ваша ставка (максимальная ставка - 100): ');
  repeat
    Read(m);
  until (m >= 1) and (m <= 100);
  mstr := 'Ваша ставка (максимальная ставка - 100): ' + m.ToString;
  TextOut(10, 10, ' ');TextOut(10, 10, mstr);
  TextOut(10, 25, ' ');TextOut(10, 25, 'Выберите гонщика (в игре - 3 гонщика) : ');
  repeat
    Read(n);
  until (n >= 1) and (n <= 3);
  if n = 1 then inc(q1);
  if n = 2 then inc(q2);
  if n = 3 then inc(q3);
  nstr := 'Выберите гонщика (в игре - 3 гонщика) : ' + n.ToString;
  TextOut(10, 25, ' ');TextOut(10, 25, nstr);
  b := b - m;
  bstr := 'Ваш баланс:' + b.ToString;
  TextOut(10, 40, ' ');TextOut(10, 40, bstr);
  TextOut(400, 10, ' ');TextOut(400, 10, 'Ставка игрока №2: ');
  m2 := random(99) + 1;
  m2str := 'Ставка игрока №2: ' + m2.ToString;
  TextOut(400, 10, ' ');TextOut(400, 10, m2str);
  
  TextOut(400, 25, ' ');TextOut(400, 25, 'Номер гонщика: ');
  n2 := random(3) + 1;
  if n2 = 1 then inc(q1);
  if n2 = 2 then inc(q2);
  if n2 = 3 then inc(q3);
  n2str := 'Номер гонщика: ' + n2.ToString;
  TextOut(400, 25, ' ');TextOut(400, 25, n2str);
  b2 := b2 - m2;
  b2str := 'Баланс игрока:' + b2.ToString;
  TextOut(400, 40, ' ');TextOut(400, 40, b2str);
  
  TextOut(700, 10, ' ');TextOut(700, 10, 'Ставка игрока №3: ');
  m3 := random(99) + 1;
  m3str := 'Ставка игрока №3: ' + m3.ToString;
  TextOut(700, 10, ' ');TextOut(700, 10, m3str);
  TextOut(700, 25, ' ');TextOut(700, 25, 'Номер гонщика: ');
  n3 := random(3) + 1;
  if n3 = 1 then inc(q1);
  if n3 = 2 then inc(q2);
  if n3 = 3 then inc(q3);
  n3str := 'Номер гонщика: ' + n3.ToString;
  TextOut(700, 25, ' ');TextOut(700, 25, n3str);
  b3 := b3 - m3;
  b3str := 'Баланс игрока:' + b3.ToString;
  TextOut(700, 40, ' ');TextOut(700, 40, b3str); 
end;
 
procedure races;
begin
  repeat
    px1 := px1 + random(4);
    px2 := px2 + random(4);
    px3 := px3 + random(4);
    pic1.MoveTo(px1, window.Height div 8 + window.Height div 4);
    pic2.MoveTo(px2, window.Height div 2 + window.Height div 8);
    pic3.MoveTo(px3, window.Height - window.Height div 8);
    sleep(10);
  until (px1 > window.Width - 30) or (px2 > window.Width - 30) or (px3 > window.Width - 30);
  TextOut(100, p, '                                 ');s := 'Победитель!';
  Brush.Style := bsClear;
  SetFontStyle(fsBold);
  if (px1 > px2) and (px1 > px3) then 
  begin
    p := window.Height div 8 + window.Height div 4;
    if q1 <> 0 then bank := bank div q1;
    if n = 1 then b := b + bank;
    if n2 = 1 then b2 := b2 + bank;
    if n3 = 1 then b3 := b3 + bank;
  end;
  if (px2 > px1) and (px2 > px3) then
  begin
    p := window.Height div 2 + window.Height div 8;
    if q2 <> 0 then bank := bank div q2;
    if n = 2 then b := b + bank;
    if n2 = 2 then b2 := b2 + bank;
    if n3 = 2 then b3 := b3 + bank;
  end;
  if (px3 > px2) and (px3 > px1) then
  begin
    p := window.Height - window.Height div 8;
    if q3 <> 0 then bank := bank div q3;
    if n = 3 then b := b + bank;
    if n2 = 3 then b2 := b2 + bank;
    if n3 = 3 then b3 := b3 + bank;
  end;  
  TextOut(100, p, '                                 ');TextOut(100, p, s);  
end;
 
procedure money;
begin
  Brush.Style := bssolid;
  bstr := 'Ваш баланс:' + b.ToString;
  b2str := 'Баланс игрока:' + b2.ToString;
  b3str := 'Баланс игрока:' + b3.ToString;
  Brush.Style := bssolid;
  TextOut(10, 55, '                                ');TextOut(10, 55, bstr);
  TextOut(400, 55, '                                ');TextOut(400, 55, b2str);;
  TextOut(700, 55, '                                 ');TextOut(700, 55, b3str);
  
  SetFontStyle(fsNormal);
end;
 
begin
  Window.Maximize;
  Window.Title := 'Мега гонки!';
  b := 100;
  b2 := 100;
  b3 := 100;
  pic1 := PictureABC.Create(px1 - 50, window.Height div 4, '1.ico');
  pic2 := PictureABC.Create(px2 - 50, ((window.Height div 2) + (window.Height div 8)), 'game.ico');
  pic3 := PictureABC.Create(px3 - 50, window.Height - window.Height div 8, 'cstrike.ico');
  repeat
    inc(r);
    race := 'Гонка №' + r.ToString;
    TextOut(10, 70, '                                  ');TextOut(10, 70, race);
    dorogi;
    stavka;
    bank := m + m2 + m3;
    q1 := 0;
    q2 := 0;
    q3 := 0;
    px1 := 0;
    px2 := 0;
    px3 := 0;
    races;
    money;
    SetFontStyle(fsNormal);
  until (b = 0) or (b2 = 0) or (b3 = 0);
end.

Понравилась статья? Поделить с друзьями:
  • Как найти файлы по списку имен
  • Как достать соседа найди игру
  • Гель лак отошел от ногтя как исправить
  • Как найти свою команду в орифлейм
  • Просто найдите такого же сумасшедшего как вы