Turbo Pascal - co zrobić żeby gwiazdka zniknęła


(Tezarrus) #1

witam! stwarzam bardzo prostą gierkę na zaliczenie, która nazywa się "zjadacz gwiazdek", utknąłem w jednym punkcie, który nie wiem jak rozbić. kod programu zamieszczam poniżej. przechodzę do problemu, mianowicie: chcę żeby po najechaniu na gwiazdkę w polu (gotoxy(20,19)) zniknęła ona (np może palić się na czarno i tak nic nie będzie widać). nie wiem jakiej komendy użyć. liczę na Waszą pomoc.

uses crt;

var x,y:integer;

    znak:char;

    t,u:integer;

    z,a:string;


Procedure ramka;

var z,a:string; t,h:integer;

begin


t:=0;

z:='|';

a:='-';


begin

gotoxy(20,5);


for t:=0 to 40 do


write('-');

gotoxy(61,5);

Write(#191);


end;



begin

gotoxy(20,20);

for t:=0 to 40 do

write('-');

end;


h:=5;

begin

for t:=0 to 13 do

begin

h:=h+1;

gotoxy(19,h);

write('|');

gotoxy(19,20);write(#192);

gotoxy(19,5); write(#218);

end;

end;

h:=5;



begin

for t:=0 to 14 do

begin

h:=h+1;

gotoxy(61 ,h);

write('|');


gotoxy(61,20);

write(#217);

end;

end;


end;

procedure jeden;

begin

gotoxy(20,18);

write('*');

end;


begin


clrscr;

gotoxy(25,25);

textcolor(red);

writeln('Jezeli skonczyles zabawe nacisnij ESC');


x:=40; y:=15;



repeat


textcolor(white);


ramka;


gotoxy(x,y);


write('*');


znak:=readkey;


if znak = #0 then

begin


jeden;


znak:=readkey;


textcolor(black);


gotoxy(x,y);

write('*');


if (znak=#75) and (x>20) then x:=x-1;

if (znak=#77) and (x<60) then x:=x+1;

if (znak=#72) and (y>7) then y:=y-1;

if (znak=#80) and (y<19) then y:=y+1;


gotoxy(2,19);



end;


until znak=#27;

end.

(Gina Gina) #2

A masz z dobrego serca ;/ na dwie gwiazdki do zjedzenia, chociażby i tak, choć można i na parę sposobów :wink:

  • parę innych poprawek bo nie lubię siana :PPP

    uses crt; (* Turbo Pascal 7 / Free Pascal compiler *)

    var

    x,y,
    
    xp1,yp1,ap1,
    
    xp2,yp2,ap2 :integer;
    
    znak :char;
    

    procedure writexy(x,y: byte; z: char); { w punkcie x,y wstawia znak z }

    begin

    gotoxy(x,y);
    
    write(z);
    

    end;

    procedure ramka;

    var

    z,a: char;
    
    t : integer;
    

    begin

    a:='-';
    
    z:='|';
    
    
    for t:=20 to 60 do
    
    begin
    
      writexy(t, 5,a);
    
      writexy(t,20,a);
    
    end;
    
    
    for t:=6 to 19 do
    
    begin
    
      writexy(19,t,z);
    
      writexy(61,t,z);
    
    end;
    
    
    gotoxy(19, 5); write(#218);
    
    gotoxy(61, 5); Write(#191);
    
    gotoxy(19,20); write(#192);
    
    gotoxy(61,20); write(#217);
    

    end;

    procedure gwiazdka(x,y: byte);

    begin

    writexy(x,y,'*');
    

    end;

    begin

    clrscr;
    
    gotoxy(25,25);
    
    textcolor(red);
    
    writeln('Jezeli skonczyles zabawe nacisnij ESC');
    
    x :=40; y :=15;
    
    xp1:=20; yp1:=17; ap1:=yellow; { pozycja i atrybut gwiazdki 1 do zjedzenia }
    
    xp2:=30; yp2:=10; ap2:=yellow; { pozycja i atrybut gwiazdki 2 do zjedzenia }
    
    repeat
    
      textcolor(white);
    
      ramka;
    
    
      textcolor(yellow);
    
      if (xp1=x)and(yp1=y) then ap1:=black;
    
      if not(ap1=black) then gwiazdka(xp1,yp1);
    
    
      if (xp2=x)and(yp2=y) then ap2:=black;
    
      if not(ap2=black) then gwiazdka(xp2,yp2);
    
    
      textcolor(white);
    
      writexy(x,y,'*');
    
      gotoxy(60,20);
    
      znak:=readkey;
    
      if znak = #0 then
    
      begin
    
        znak:=readkey;
    
        textcolor(black);
    
        writexy(x,y,'*');
    
        if (znak=#75) and (x>20) then x:=x-1;
    
        if (znak=#77) and (x<60) then x:=x+1;
    
        if (znak=#72) and (y>6) then y:=y-1;
    
        if (znak=#80) and (y<19) then y:=y+1;
    
      end;
    
    until znak=#27;
    

    end.

.

( a w tym linku tylko z jedną gwiazdką :wink: http://wklej.org/id/b2123e6531)


(Tezarrus) #3

Tak wygląda mój projekt końcowy. mam niestety kilka problemów z którymi nie mogę sobie poradzić. mianowicie nie działa mi zapętlenie z ESC nie wiem dlaczego i jeżeli w piszę 2 muszę 2 razy enter naciskać a samo nie chce wyjść (właściwie powinno się raz enter nacisnąć i koniec programu)


(Gina Gina) #4

Wszystko jest OK , oprócz ostatniego readln - jest zbędne :spoko:

plik:

http://up.wklej.org/download.php?id=510 … ed5b7075bb


(Tezarrus) #5

dzięki! haha pisałem ten program 6 godzin i nie zauważyłem podstawowego błędu. dzięki wszystkim za pomoc!


(Gina Gina) #6

No to jeszcze na czysto i z pewnymi praktycznymi zmianami :roll: (lepsze jest wrogiem …) :lol:

uses crt;

const

  ar: array[1..14,1..2]of byte = { pozycje gwiazdek}

                   ((20,17),(21,19),(45,10),(40,17),(30,15),(26,11),(40,12),

                    (25,16),(25,19),(29, 8),(33,13),(47,12),(29,10),(47,15));

var

  x,y :byte;

  znak :char;


procedure writexy(x,y: byte; z: char); { w punkcie x,y wstawia znak z }

begin

  gotoxy(x,y);

  write(z);

end;


procedure ramka;

var

  z,a: char;

  t : integer;

begin

  a:='-';

  z:='|';


  for t:=20 to 60 do

  begin

    writexy(t, 5,a);

    writexy(t,20,a);

  end;


  for t:=6 to 19 do

  begin

    writexy(19,t,z);

    writexy(61,t,z);

  end;


  gotoxy(19, 5); write(#218);

  gotoxy(61, 5); Write(#191);

  gotoxy(19,20); write(#192);

  gotoxy(61,20); write(#217);

end;


procedure dwa;

var

  i: byte;

begin

  clrscr;

  gotoxy(25,25);

  textcolor(red);

  writeln('Jezeli skonczyles zabawe nacisnij ESC');


  textcolor(white);

  ramka;


  textcolor(yellow);

  for i:=Low(ar) to High(ar) do

     writexy(ar[i,1],ar[i,2],'*');


  x:=40; y:=15;

  repeat;

    textcolor(white);

    writexy(x,y,'*');

    gotoxy(x,y);

    znak:=readkey;

    if znak = #0 then

    begin

      znak:=readkey;

      textcolor(black);

      writexy(x,y,'*');

      if (znak=#75) and (x>20) then x:=x-1;

      if (znak=#77) and (x<60) then x:=x+1;

      if (znak=#72) and (y> 6) then y:=y-1;

      if (znak=#80) and (y<19) then y:=y+1;

    end;

  until znak=#27;

end;


procedure druga_strona;

var

  i:byte;

begin

  clrscr;

  gotoxy(11,2);

  textcolor(14);

  writeln('T w o i m z a d a n i e m b e d z i e');

  writeln;

  gotoxy(11,3);

  textcolor(15);

  writeln('Doprowadzenie do znikniecia wszystkich gwiazdek');

  writeln;

  textcolor(2);

  gotoxy(11,4);

  writeln('Z a p o m o c a s t r z a l e k');

  writeln;

  textcolor(3);

  gotoxy(11,5);

  writeln('Kierujesz biala gwiazdka');

  writeln;

  writeln;

  writeln;

  writeln;

  writeln;

  writeln;

  textcolor(4);

  writeln('Jezeli dalej nacisnij 1 a potem ');

  writeln;

  textcolor(5);

  writeln('Jezeli chcesz skonczyc nacisnij 2, a potem ');

  readln(i);

  if i=1 then dwa;

end;


procedure menu;

var

  i:byte;

begin

  clrscr;

  gotoxy(14,3);

  textcolor(red+white);

  writeln('W I T A M W M O J E J P I E R W S Z E J G I E R C E ');

  writeln;

  gotoxy(29,4);

  writeln('W P A S C A L I K U');

  writeln;

  textcolor(white);

  gotoxy(10,20);

  textcolor(green);

  writeln('Aby przejsc dalej nacisnij 1, a potem ');

  gotoxy(11,21);

  writeln('Aby wyjsc 2, a potem ');

  readln(i);

  if i=1 then druga_strona;

end;


begin

  menu;

end.