(pascal)движение символа по экрану в текстовом режиме

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
gluik
Сообщения: 13
Зарегистрирован: 10 дек 2007, 14:23

Задача:Написать программу ,которая создаёт окно заданого цвета и размера и помещает заданный пользователем символ ,указанного цвета ,в центр этого окна
далее при нажатии клавиш-стрелок символ двигается по окну(и не может двигаться если упирается в границу),выход осуществляется клавищей esc.
Проблема:При создании окна границы сбиваются(не соответствуют заданным из-за чего символ движется неправильно) ,не знаю почему и как это исправить

Код: Выделить всё

program proverka;
uses Crt;
var
   x1,x2,y1,y2: integer;
   cf,cs:byte;
   ch:char;
procedure MoveCh(x1,y1,x2,y2:integer;cf,cs:byte;ch:char);
var
   xch,ych:integer;
   key:char;
begin
   window(x1,y1,x2,y2);
   textbackground(cf);
   textcolor(cs);
   clrscr;
   xch:=((x2-x1) div 2)+1;
   ych:=((y2-y1) div 2)+1;
   gotoxy(xch,ych);
   write(ch);
   gotoxy(xch,ych);
   repeat
      key:=readkey;
      if ord(key)=0 then begin
         key:=readkey;
         gotoxy(xch,ych);
         case ord(key) of
            75: begin
                   if (xch>x1) then begin
                      gotoxy(xch,ych);
                      write(' ');
                      xch:=xch-1;
                      gotoxy(xch,ych);
                      write(ch);
                      gotoxy(xch,ych);
                    end;
                end;
            77: begin
                   if (xch<x2) then begin
                      gotoxy(xch,ych);
                      write(' ');
                      xch:=xch+1;
                      gotoxy(xch,ych);
                      write(ch);
                      gotoxy(xch,ych);
                   end;
                end;
            80: begin
                   if (ych<y2) then begin
                      gotoxy(xch,ych);
                      write(' ');
                      ych:=ych+1;
                      gotoxy(xch,ych);
                      write(ch);
                      gotoxy(xch,ych);
                    end;
                 end;
            72: begin
                   if (ych>y1) then begin
                      gotoxy(xch,ych);
                      write(' ');
                      ych:=ych-1;
                      gotoxy(xch,ych);
                      write(ch);
                      gotoxy(xch,ych);
                   end;
                end;
         end;
      end;{if}
   until (ord(key)=27);
end;

BEGIN
   textbackground(black);
   textcolor(white);
   clrscr;
   writeln('Программа проверки подпрограммы MoveChv.');
   {
   write('Введите x1,y1,x2,y2 через пробел:');
   readln(x1,y1,x2,y2);
   write('Введите цвет фона: ');
   readln(cf);
   write('Введите цвет символа: ');
   readln(cs);
   write('Введите символ: ');
   readln(ch);
   MoveCh(x1,y1,x2,y2,cf,cs,ch);
   }
   ych:=0;
   xch:=0;
   x1:=5;
   y1:=3;
   x2:=30;
   y2:=10;
   ch:='*';
   MoveCh(x1,y1,x2,y2,magenta,black,'*');

END.
Vovchik
Сообщения: 196
Зарегистрирован: 28 фев 2008, 18:32
Контактная информация:

попробуй строку
.. xch,ych:integer; ..
из процедуры
скрпировать в главный VAR
я так сделал и у меня вроде работает !!!
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Вроде можно сделать так:
[syntax='Delphi']
program wnd;

uses
crt;

var
CX,CY:byte;

procedure MoveCh(X,Y,W,H,FC,BC:byte;ch:char);
var
key:char;
begin
window(X,Y,X+W,Y+H);
TextColor(FC);
TextBackground(BC);
clrscr;
GotoXY(W div 2,H div 2);
write(ch);
CX:=W div 2;
CY:=H div 2;

repeat
key:=ReadKey;
case key of
#100:if CX<W then inc(CX);
{l}#97:if CX>0 then dec(CX);
{d}#115:if CY<H+1 then inc(CY);
{u}#119:if CY>0 then dec(CY);
#27:Halt;
end;{case}
clrscr;
GotoXY(CX+1,CY);
write(ch);
gotoxy(CX+1,CY);
until false;
end;

begin
TextMode(3);
MoveCH(5,5,10,10,0,10,'*');
end.
[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...
gluik
Сообщения: 13
Зарегистрирован: 10 дек 2007, 14:23

попробовал ничего не изменилось мб это паскаль так глючит потому, что
при проверки значений переменных когда ych=3 не на верхней границе окна а на растоянии 3 символ-мест от него, а кгода ych=7 символ на нижней границе,при дальнейшем увеличении ych символ начинает копироваться в право.Аналогичная ситуация и с перемешением по горизонтали с лево на право.
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

не надо выходить за границы окна
читайте хелп по gotoxy (в нижний правый угол думаю вам попасть не удасться...)

Код: Выделить всё

procedure MoveCh(x1,y1,x2,y2:integer;cf,cs:byte;ch:char);
var
   key:char;
   xch,ych:integer;
begin
   window(x1,y1,x2,y2);
   textbackground(cf);
   textcolor(cs);
   xch:=((x2-x1) div 2)+1;
   ych:=((y2-y1) div 2)+1;
   repeat
      clrscr;
      gotoxy(xch,ych);
      write(ch);
      gotoxy(xch,ych);
      key:=readkey;
      if ord(key)=0 then begin
         key:=readkey;
         case ord(key) of
            75: if (xch>1) then xch:=xch-1;
            77: if (xch<(x2-x1+1)) then xch:=xch+1;
            80: if (ych<(y2-y1+1)) then ych:=ych+1;
            72: if (ych>1) then ych:=ych-1;
         end;
      end;{if}
   until (ord(key)=27);
end;
Ответить