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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2023, 08:37   #1
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 38
По умолчанию Делаю тетрис. Как ограничить движение фигуры главным блоком.

Не совсем пока понятно как ограничить движение фигуры чтобы не вылазила за линии. Мне надо чтобы при стыке с линией боковой становился не активным метод control.

2 кода дано: полный и метод control. подозреваю ошибка в нем.


вот полный код программы
Код:
uses System, graphABC, Timers;


{engine.base
figure.generate+
control.move
control.shift
control.align
turn(fall)}

var time: integer;

type
  figure = class
    
  public
  //  fx: integer;
   // fy: integer;
    
    gcolor: array [0..3] of string;
    part: array [0..2] of string;
    rcolor: integer;
  
    constructor();
    begin
      gcolor[0] := 'clred';
      gcolor[1] := 'clgreen';
      gcolor[2] := 'clblue';
      gcolor[3] := 'clyellow';
      rcolor := PABCSystem.random(3);
      part[0] := gcolor[rcolor];
      
      //for var n := 1 to 2 do
      //begin
      //part[0 + n] := gcolor[PABCSystem.random(3)];
      //if part[0 + n] = part[n - 1] then
      //part[0 + n] := gcolor[PABCSystem.random(3)];
      //end;
    end;
    end;


type
  engine = class
  
  public
  fx: integer;
    fy: integer;
    
    constructor();
    begin
    end;
    
      procedure control(key: integer);
    begin
      case key of
         VK_RIGHT:
         begin
        inc(self.fx);
          if self.fx > 50+50*6 then exit;
          end;
          
         VK_Left:
         begin
        dec(self.fx);
          if self.fx > 50*1 then exit;
            end;
            
         VK_down:
        inc(self.fy);
        
        32:
          begin
            //for var n := 0 to 2 do
            //part[0]:=part[2];
            //part[1]:=part[0];
            //part[2]:=part[1];
          end;
      end;
    end;
        
    procedure yplus;
    begin
  // x:=1;
  inc(time);
     textout(10,30,time);
                 inc(self.fy);
                  //if self.fy > 12 then exit;
                  if self.fy > 12 then self.fy:= 1;
                  //base[x]=self.fy;
                  //рисуем фигуру в точке падения первой
                    //inc(x);
                
                
      Window.Clear();
       lockdrawing;

      line(50 * 2, 50 * 2, 50 * 2, 200 * 2 * 2);
      line(50 * 2, 50 * 2, 100 * 2 * 2, 50 * 2);
      line(200 * 2, 50 * 2, 200 * 2, 200 * 2 * 2);
      line(200 * 2, 200 * 2 * 2, 50 * 2, 200 * 2 * 2);
      
      line(50 + 50 * self.fx, 50 + 50 * self.fy, 50 + 50 * self.fx + 50, 50 + self.fy * 50);
      line(50 + self.fx * 50, self.fy * 50 + 200, self.fx * 50 + 50 + 50, self.fy * 50 + 200);
      line(50 * self.fx + 50, self.fy * 50 + 50, 50 * self.fx + 50, self.fy * 50 + 200);
      line(self.fx * 50 + 100, self.fy * 50 + 50, 50 + self.fx * 50 + 50, self.fy * 50 + 200);
      redraw;

        
end;

    

    procedure run;
    begin

  if self.fy < 12 then
    begin
    var t := new Timer(500, self.yplus);
      t.Start;
     Sleep(500);
     
     
   
   // if fy=15 then t.Stop

      end;
       //t.Stop;
    

          //for var n := 10 to 1 do
      //begin
        //if line[n]:=true then
        //lines(x,y+1);  
      //end;
      //end;
 
onkeydown := self.control;
    end;
    end;
    
 //function line: boolean;
   // begin
    //end;


begin
  SetWindowTitle('Jewels');
  Setwindowsize(500, 900); //размер окна
  CenterWindow;//центр монитора

  var gameengine := engine.Create;
  gameengine.run;

end.

метод управления фигурой
Код:
 procedure control(key: integer);
    begin
      case key of
         VK_RIGHT:
         begin
        inc(self.fx);
          if self.fx > 50+50*6 then exit;
          end;
          
         VK_Left:
         begin
        dec(self.fx);
          if self.fx > 50*1 then exit;
            end;
            
         VK_down:
        inc(self.fy);
        
        32:
          begin
            //for var n := 0 to 2 do
            //part[0]:=part[2];
            //part[1]:=part[0];
            //part[2]:=part[1];
          end;
      end;
    end;

Последний раз редактировалось Kukla19; 25.11.2023 в 08:50.
Kukla19 вне форума Ответить с цитированием
Старый 25.11.2023, 21:19   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

добавить условие в блок (скажем при движении вправо)
Код:
 VK_RIGHT:
         begin
         if( вот тут ваше условие проверки, что фигура вышла за рамки дозволенного) then inc(self.fx);
          if self.fx > 50+50*6 then exit;
          end;
а до этого вы безоговорочно всё равно увеличиваете вашу величину self.fx.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 26.11.2023, 06:10   #3
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 38
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
добавить условие в блок (скажем при движении вправо)
Код:
 VK_RIGHT:
         begin
         if( вот тут ваше условие проверки, что фигура вышла за рамки дозволенного) then inc(self.fx);
          if self.fx > 50+50*6 then exit;
          end;
а до этого вы безоговорочно всё равно увеличиваете вашу величину self.fx.
Так это условие в скобках ваших и есть < 50+50*6...

50 расстояние от края окна.
50*6 = 300 пикселей правая граница блока за границы которой фигура не должна выходить а сидеть у стеночки когда ее двигают.
Kukla19 вне форума Ответить с цитированием
Старый 27.11.2023, 07:44   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Перед изменением позиции проверяйте, что это можно делать; задайте исходную координату фигуры внутри "стакана":
Код:
    constructor();
    begin
      fx := 3;
      fy := 0;
    end;
    
    procedure control(key: integer);
    begin
      case key of
         VK_RIGHT:
          if fx < 6 then inc(fx);
          
         VK_Left:
          if fx > 1 then dec(fx);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ограничить движение одного квадрата в другом monro86 C# (си шарп) 10 02.11.2013 02:17
Движение фигуры Di-em Паскаль, Turbo Pascal, PascalABC.NET 1 10.01.2012 20:55
Движение одной фигуры,вслед изменения высоты другой фигуры. 7vlad37 Microsoft Office Excel 3 21.07.2011 18:01
Ограничить движение мыши в StringGrid??? Dersou Помощь студентам 4 10.08.2010 15:53
Делаю тетрис на делфи немогу решить проблему Gigabit Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 05.12.2009 14:10