Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Readkey и стрелочки.

Автор: Bengamin 6.05.2007 18:54

Добрый день.

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

Проблема вот в чем. Я все сделал, все работает, только не могу никак стрелочками задать движения и масштаб... 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 6.05.2007 19:05

Цитата
Метод типа #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;

Заодно избавился от меток, не нужны они тебе здесь ...

Автор: Гость 6.05.2007 23:12

Мерси! Все работает smile.gif Дописал тким же макаром кнопки "+" и "-" smile.gif

Спасибо огромное Volvo! smile.gif