Помощь - Поиск - Пользователи - Календарь
Полная версия: Readkey и стрелочки.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Bengamin
Добрый день.

Задача такая : Нужно сделать программу, в которой в начале нужно ввести колличество углов для многоугольника, затем программа должна создать этот многоугольник, и при нажатии стрелочек многоугольник должен двигатся в сторону стрелочек, а если нажать на клавишу "+" или "-" то фигура должна увеличиваться/уменьшаться.

Проблема вот в чем. Я все сделал, все работает, только не могу никак стрелочками задать движения и масштаб... unsure.gif Вот такой я ламер... Метод типа #72 не могу понять...Хелп читал, поиск тоже...

Сейчас выполняется всё путем нажатия на 'a' - 's' - 'd' - 'w' (Движение), 'q' - 'e' (Масштаб), 'z' - 'x' (Изменение углов). Помогите параллельно им дописать стрелочки (Т.е. не заменить, а чтоб паралельно приписать)... rolleyes.gif

Код прилагаю (Рабочий на 100%).

Uses Crt, Graph;
Var
 GraphDriver, GraphMode : Integer;
 Index : Integer;
 Palette : PaletteType;
 Color: Word;
 NGon : Integer;
 NGonAngle : Real;
 NGonArray : Array [3..20] of PointType;
 Zoom : Real;
 PosX, PosY : Integer;
 Key : Char;

Function IntToStr(IntToStrI : Longint) : String;
Var
 IntToStrS: string;
begin
 Str(IntToStrI, IntToStrS);
 IntToStr := IntToStrS;
end;

Procedure GraphAsk;
Label 1;
Begin
 1: Writeln('Pogalujsta, vvedite kollichestvo uglov u mnogougolnika : ');
 Read(NGon);
 If (NGon > 20) or (NGon < 3) then Goto 1;
 Readln;
End;

Procedure GraphInit;
Begin
 GraphDriver := Detect;
 InitGraph(GraphDriver, GraphMode, '');
 If GraphResult<> grOk Then
 Halt(1);

 Zoom := 50;
 PosX := (GetMaxX div 2);
 PosY := (GetMaxY div 2);
End;

Procedure GraphMenu;
Begin
 Rectangle(0,0,639,479);
 Rectangle(0,0,162,10);
 Rectangle(0,10,106,40);
 Rectangle(106,10,162,40);

 OutTextXY(2,2,'Using driver :' + GetDriverName);
 for Index := 0 to GetMaxMode do
 OutTextXY(2, (10 * Succ(Index)) + 2, GetModeName(Index));

 GetPalette(Palette);
 If Palette.Size <> 1 Then
 For Color := 0 to Pred(Palette.Size) do
 Begin
  SetColor(Color);
  Line(107,10 + (Color * 2), 161,10 + (Color * 2));
 End;

 OutTextXY(107,12,IntToStr(Color+1) + 'Color');

End;

Procedure GraphDraw;
Begin
 NGonAngle := 360 div NGon;
 For Index := 1 to NGon do
 Begin
  NGonArray[Index+2].X:=PosX + Trunc(Zoom*(Cos(NGonAngle*(Pi)*Index/180)));
  NGonArray[Index+2].Y:=PosY + Trunc(Zoom*(Sin(NGonAngle*(Pi)*Index/180)));
 End;
 Circle(PosX,PosY,1);
 DrawPoly(NGon,NGonArray);
 Line((NGonArray[3].X),(NGonArray[3].Y),(NGonArray[NGon+2].X),(NGonArray[NGon+2].Y));
End;

Procedure GraphWork;
Label 1;
Begin
 Repeat
1:GraphMenu;
  OutTextXY(2,470,'PRESS "c" to QUIT!');
  GraphDraw;
  Key := Readkey;
  If Key = 'c' then Break;
  If Key = 's' then
  Begin
   PosY := PosY + 5;
   ClearViewPort;
   Goto 1;
  End;
  If Key = 'w' then
  Begin
   PosY := PosY - 5;
   ClearViewPort;
   Goto 1;
  End;
  If Key = 'd' then
  Begin
   PosX := PosX + 5;
   ClearViewPort;
   Goto 1;
  End;
  If Key = 'a' then
  Begin
   PosX := PosX - 5;
   ClearViewPort;
   Goto 1;
  End;
  If Key = 'q' then
  Begin
   Zoom := Zoom + 5;
   ClearViewPort;
   Goto 1;
  End;
  If Key = 'e' then
  Begin
   Zoom := Zoom - 5;
   ClearViewPort;
   Goto 1;
  End;
  If Key = 'z' then
  Begin
   NGon := NGon + 1;
   If NGon > 18 Then NGon := 18;
   ClearViewPort;
   Goto 1;
  End;
  If Key = 'x' then
  Begin
   NGon := NGon - 1;
   If NGon < 1 Then Ngon := 1;
   ClearViewPort;
   Goto 1;
  End;
  If Key <> #0 then goto 1;
  Until False;
End;

Begin
 GraphAsk;
 GraphInit;
 GraphWork;
 CloseGraph;
End.


volvo
Цитата
Метод типа #72 не могу понять...
Ничего сложного - коды "стрелочек" состоят из 2-х байт, первый из которых равен 0... То есть ты доджен прочесть ReadKey, и если это был нулевой символ, то прочесть еще один, и уже ВТОРОЙ анализировать на "стрелочки" ...

Смотри:

Repeat
  GraphMenu;
  OutTextXY(2,470,'PRESS "c" to QUIT!');
  GraphDraw;

  Key := Readkey;
  case key of
    'c': Break;
    's':
    Begin
      PosY := PosY + 5; ClearViewPort;
    end;
    'w':
    Begin
      PosY := PosY - 5; ClearViewPort;
    end;
    'd': 
    Begin
      PosX := PosX + 5; ClearViewPort;
    end;
    'a':
    Begin
      PosX := PosX - 5; ClearViewPort;
    End;
    'q':
    Begin
      Zoom := Zoom + 5; ClearViewPort;
    End;
    'e':
    Begin
      Zoom := Zoom - 5; ClearViewPort;
    End;
    'z':
    Begin
      NGon := NGon + 1;
      If NGon > 18 Then NGon := 18; ClearViewPort;
    End;
    'x':
    Begin
      NGon := NGon - 1;
      If NGon < 1 Then Ngon := 1; ClearViewPort;
    End;

    #0: { А вот тут - анализируешь второй код: }
    Begin
      Case ReadKey Of
        #72: Begin { Добавь нужные действия } End;
        { и все остальные коды - аналогично: #80, #75 и #77 }
      End; { закрыт нижний Case }
    End;
  end; { закрыт верний Case }
  Until False;

Заодно избавился от меток, не нужны они тебе здесь ...
Гость
Мерси! Все работает smile.gif Дописал тким же макаром кнопки "+" и "-" smile.gif

Спасибо огромное Volvo! smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.