Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2023, 22:33   #1
1redienhcs
Новичок
Джуниор
 
Регистрация: 17.12.2023
Сообщений: 1
По умолчанию Помогите со змейков на паскаль

Никак не могу реализовать удлинение туловища после съедения пищи.
Код:
program snakevertwo;

uses GraphABC, ABCObjects, ABCButtons;

Const MaxLength = 60*30;

var snake : array[0..MaxLength] of CircleABC;
    Life, LockKey : boolean;
    xHeadSnake, yHeadSnake, xApple, yApple, MoveKey, i : integer;
    SnakeHead, SnakeBody, Apple : CircleABC;
    Score : TextABC;
    x1GameWindow:=0; y1GameWindow:=0; x2GameWindow:=1200; y2GameWindow:=600;
    
procedure SnakeMove(key : integer);
begin
  case key of
  VK_Right, VK_D: MoveKey:=1;
  VK_Left, VK_A: MoveKey:=2;
  VK_Up, VK_W: MoveKey:=3;
  VK_Down, VK_S: MoveKey:=4;
  end
end;

BEGIN
  Window.Title:='SnakeGame';
  setWindowSize(1200,800);
  window.IsFixedSize:=true;
  SetbRushColor(clGreen);
  Rectangle(x1GameWindow, y1GameWindow, x2GameWindow, y2GameWindow);
  for i:= 1 to 30 do
  begin
    line(0, i*20, WindowWidth, i*20);
  end;
  for i:= 1 to 60 do
  begin
    line(i*20, 0, i*20, 600);
  end;
  
  xHeadSnake := 30*20-10; yHeadSnake := 20*20-10; // первое число - выбор клетки(- 10 из-за смещения)
  xApple :=20*20-10; yApple :=20*20-10;
  
  SnakeHead := CircleABC.Create(xHeadSnake,yHeadSnake,10,clIndianRed);
  Apple := CircleABC.Create(xApple,yApple,10,clRed);
  SetbrushColor(clWhite);
  Font.Color := clBlack;
  Font.Size := 25;
  TextOut(500, 675, 'Score :');
  Score := TextABC.Create(611, 675, 25, '0', ClRed);
  
  for i:=1 to 6 do
  begin
    Snake[i] := CircleABC.Create(xHeadSnake,yHeadSnake+20*i,10,clDarkOliveGreen);
  end;
  
  while true do
  begin
    onKeyDown := SnakeMove;
    
    //перемещение туловища к голове, если клавиша не нажата
    if MoveKey <> 0 then
    begin
      for i:= 6 downto  2 do
      begin
        Snake[i].MoveTo(Snake[i-1].Position.X, Snake[i-1].Position.Y);
      end;
      Snake[1].MoveTo(xHeadSnake - 10, yHeadSnake - 10);
    end;
    
    case MoveKey of
      1: xHeadSnake := xHeadSnake + 20;
      2: xHeadSnake := xHeadSnake - 20;
      3: yHeadSnake := yHeadSnake - 20;
      4: yHeadSnake := yHeadSnake + 20;
    end;
    
    //проверка выход за границу
    if (xHeadSnake > WindowWidth) then xHeadSnake := 10;
    if (xHeadSnake < 0) then xHeadSnake := WindowWidth - 10;
    if (yHeadSnake > y2GameWindow-10) then yHeadSnake := 10;
    if (yHeadSnake < 0) then yHeadSnake:= y2GameWindow-10;
      
    
    //жрем яблоко
    if ((xHeadSnake = xApple) and (yHeadSnake = yApple)) then
    begin
      xApple:= random(1, 60)*20-10;
      yApple:= random(1, 30)*20-10;
      Apple.MoveTo(xApple-10, yApple-10);
      Score.Text := ((score.text).ToInteger + 1).ToString();
    end;
    
    SnakeHead.MoveTo(xHeadSnake - 10, yHeadSnake - 10);
    Sleep(100);
  end;
END.

Последний раз редактировалось Arigato; 18.12.2023 в 12:34.
1redienhcs вне форума Ответить с цитированием
Старый 18.12.2023, 09:32   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 736
По умолчанию

Программу нужно переделывать. Заведите структуру(Record) точка: координаты x и y. Потом змейка будет состоять из этих точек. Потом заведите игровое поле - двумерный массив, надо будет его нарисовать. Переменная Length - длина змейки, изначально имеет размер 1, но с каждым съедением пищи увеличивается на 1.
Cuprum5 вне форума Ответить с цитированием
Старый 18.12.2023, 17:50   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Можно и с текущим кодом и минимальными правками заставить расти змею:
Код:
program snakevertwo;

uses GraphABC, ABCObjects, ABCButtons;

const
  MaxLength = 60 * 30;

var
  snake: array[0..MaxLength] of CircleABC;
  Life, LockKey: boolean;
  xHeadSnake, yHeadSnake, xApple, yApple, MoveKey, i, Score: integer;
  Apple: CircleABC;
  ScoreText: TextABC;
  x1GameWindow := 0;
  y1GameWindow := 0;
  x2GameWindow := 1200;
  y2GameWindow := 600;

procedure SnakeMove(key: integer);
begin
  case key of
    VK_Right, VK_D: MoveKey := 1;
    VK_Left, VK_A: MoveKey := 2;
    VK_Up, VK_W: MoveKey := 3;
    VK_Down, VK_S: MoveKey := 4;
  end
end;

begin
  Window.Title := 'SnakeGame';
  setWindowSize(1200, 800);
  window.IsFixedSize := true;
  SetbRushColor(clGreen);
  Rectangle(x1GameWindow, y1GameWindow, x2GameWindow, y2GameWindow);
  for i := 1 to 30 do
  begin
    line(0, i * 20, WindowWidth, i * 20);
  end;
  for i := 1 to 60 do
  begin
    line(i * 20, 0, i * 20, 600);
  end;
  
  xHeadSnake := 30 * 20 - 10; yHeadSnake := 20 * 20 - 10; // первое число - выбор клетки(- 10 из-за смещения)
  xApple := 20 * 20 - 10; yApple := 20 * 20 - 10;
  Score := 0;
  
  Apple := CircleABC.Create(xApple, yApple, 10, clRed);
  SetbrushColor(clWhite);
  Font.Color := clBlack;
  Font.Size := 25;
  TextOut(500, 675, 'Score :');
  ScoreText := TextABC.Create(611, 675, 25, Score.ToString(), ClRed);
  
  Snake[0] := CircleABC.Create(xHeadSnake, yHeadSnake, 10, clIndianRed);
  for i := 1 to Score do
  begin
    Snake[i] := CircleABC.Create(xHeadSnake, yHeadSnake + 20 * i, 10, clDarkOliveGreen);
  end;
  
  while true do
  begin
    onKeyDown := SnakeMove;
    
    //перемещение туловища к голове, если клавиша не нажата
    if MoveKey <> 0 then
    begin
      for i := Score downto 1 do
      begin
        Snake[i].MoveTo(Snake[i - 1].Position.X, Snake[i - 1].Position.Y);
      end;
      Snake[0].MoveTo(xHeadSnake - 10, yHeadSnake - 10);
    end;
    
    case MoveKey of
      1: xHeadSnake := xHeadSnake + 20;
      2: xHeadSnake := xHeadSnake - 20;
      3: yHeadSnake := yHeadSnake - 20;
      4: yHeadSnake := yHeadSnake + 20;
    end;
    
    //проверка выход за границу
    if (xHeadSnake > WindowWidth) then xHeadSnake := 10;
    if (xHeadSnake < 0) then xHeadSnake := WindowWidth - 10;
    if (yHeadSnake > y2GameWindow - 10) then yHeadSnake := 10;
    if (yHeadSnake < 0) then yHeadSnake := y2GameWindow - 10;
    
    
    //жрем яблоко
    if ((xHeadSnake = xApple) and (yHeadSnake = yApple)) then
    begin
      Inc(Score);
      Snake[Score] := CircleABC.Create(xHeadSnake, yHeadSnake, 10, clDarkOliveGreen);
      Snake[Score].ToBack();
      xApple := random(1, 60) * 20 - 10;
      yApple := random(1, 30) * 20 - 10;
      Apple.MoveTo(xApple - 10, yApple - 10);
      ScoreText.Text := Score.ToString();
    end;
    
    Snake[0].MoveTo(xHeadSnake - 10, yHeadSnake - 10);
    Sleep(100);
  end;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль помогите или С++ Strong_Man Фриланс 4 10.05.2018 18:15
Помогите. В паскаль -Pride Помощь студентам 2 02.10.2017 15:05
ПАСКАЛЬ ПОМОГИТЕ sotik2Ap Помощь студентам 1 22.06.2017 07:39
Помогите паскаль! Kenzo73 Паскаль, Turbo Pascal, PascalABC.NET 3 18.06.2015 19:49
помогите паскаль! lompart251 Помощь студентам 4 12.11.2013 23:25