Pascal小游戏 打飞机

时间:2021-09-18 01:00:33

一个经典的打飞机游戏(1)Pascal代码

十分经典,有一种街机的感觉

奇葩青年的又一控制台神作。

uses crt; 

type list=record 
        ty,ax:integer; 
        end; 
     xy=record 
        bx,by:integer; 
        end; 
     l1=array[1..4,1..5]of char; 
     l2=array[1..5,1..6]of char; 
     l3=array[1..8,1..5]of char; 

const 
     my:l1=(('0','0','A','0','0'), 
            ('A','0','H','0','A'), 
            ('b','H','H','H','d'), 
            ('0','T','U','T','0')); 

     pl:l3=(('0','H','0','H','0'), 
            ('p','H','I','H','q'), 
            ('0','H','X','H','0'), 
            ('0','V','0','V','0'), 
            ('0','H','H','H','0'), 
            ('0','H','O','H','0'), 
            ('0','H','H','H','0'), 
            ('0','0','V','0','0')); 

     boss:l2=(('0','T','H','H','T','0'), 
              ('X','H','I','I','H','X'), 
              ('X','H','X','X','H','X'), 
              ('H','0','H','H','0','H'), 
              ('V','0','V','V','0','V')); 

var  ix,hp,bshp,box,i,j,k,t,sum,every:integer; 
     enlist:array[1..30]of list; 
     ch:char; 
     nowen:array[1..3]of list; 
     bom,boe:array[1..25]of xy; 

procedure myij(x:integer); 
begin 
     for k:=1 to 4 do begin 
        if x>=2 then gotoxy(x-1,21+k) 
           else gotoxy(x,21+k); 
        write(' '); 
        for t:=1 to 5 do 
           if my[k,t]<>'0' then write(my[k,t]) else write(' '); 
        if x+4<80 then write(' '); 
        end; 
end; 

procedure now(enemy:integer); 
begin 
     gotoxy(1,1); 
     delline; 
     gotoxy(1,1); 
     insline; 
     gotoxy(1,1); 
     textcolor(black); 
     write('    Hp:',hp,'    Remain enemy:',enemy,'    Boss Hp:',bshp); 
     textcolor(red); 
end; 

function hiten(s:integer):integer; 
begin 
     hiten:=0; 
     for t:=1 to 3 do 
        if (bom[s].by<=6)and(bom[s].bx-nowen[t].ax>=0) 
           and(bom[s].bx-nowen[t].ax<=4)then hiten:=t; 
end; 

function hitmy(s:integer):boolean; 
begin 
     hitmy:=false; 
     if (boe[s].by>=21)and(boe[s].bx-ix>=0) 
        and(boe[s].bx-ix<=4)then hitmy:=true; 
end; 

function hitbo(s:integer):boolean; 
begin 
     hitbo:=false; 
     if (bom[s].by<=7)and(bom[s].bx-box>=0) 
        and(bom[s].bx-box<=5)then hitbo:=true; 
end; 

procedure clear(s:integer); 
begin 
     for t:=1 to 4 do begin 
        gotoxy(nowen[s].ax,t+1); 
        write('     '); 
        end; 
end; 

procedure win; 
begin 
     clrscr; 
     gotoxy(28,12); 
     writeln('Congratulations,You win!'); 
     write('                            Press Enter to exit...'); 
     readln; 
     halt; 
end; 

procedure plij(s,x:integer); 
begin 
     for k:=1 to 4 do begin 
        if x>=2 then gotoxy(x-1,1+k) 
           else gotoxy(x,1+k); 
        write(' '); 
        for t:=1 to 5 do 
           if pl[s+k-1,t]<>'0' then write(pl[s+k-1,t]) else write(' '); 
        if x+4<80 then write(' '); 
        end; 
end; 

procedure lost; 
begin 
     clrscr; 
     gotoxy(32,12); 
     writeln('Sorry,You lost!'); 
     write('                            Press Enter to exit...'); 
     readln; 
     halt; 
end; 

function canmove(x:integer;y:integer):boolean; 
begin 
    canmove:=false; 
    if ((x>=2)and(y=1))or((x<=71)and(y=2)) then canmove:=true;

 

end; 

function appear(x:integer):byte; 
var  f:boolean; 
begin 
     repeat 
        randomize; 
        t:=random(70)+2; 
        f:=true; 
        for k:=1 to 3 do 
           if (t-nowen[k].ax>=-5)and(t-nowen[k].ax<=5)then f:=false; 
        until f; 
     appear:=t; 
     if enlist[x].ty=1 then plij(1,t) 
        else plij(5,t); 
end; 

function enis:integer; 
begin 
     t:=0; 
     for k:=1 to 3 do 
        if nowen[k].ty<>-1 then t:=t+1; 
     enis:=t; 
end; 

function itmove(s,t:integer):boolean; 
begin 
     itmove:=true; 
     for k:=1 to 3 do if k<>s then 
        if ((t=0)and(nowen[s].ax-nowen[k].ax<7)) 
        or ((t=1)and(nowen[k].ax-nowen[s].ax<7)) then itmove:=false; 
end; 

procedure move(s:integer); 
begin 
     randomize; 
     t:=random(100) mod 2; 
     if itmove(s,t) then 
        if t=0 then begin 
           if nowen[s].ty=0 then plij(1,nowen[s].ax-1) 
              else plij(5,nowen[s].ax-1); 
           nowen[s].ax:=nowen[s].ax-1; 
           end else if t=1 then begin 
              if nowen[s].ty=0 then plij(1,nowen[s].ax+1); 
              if nowen[s].ty=1 then plij(5,nowen[s].ax+1); 
              nowen[s].ax:=nowen[s].ax+1; 
              end; 
end; 

procedure bb(s:integer); 
begin 
     if nowen[s].ty=0 then begin 
        for k:=1 to 25 do 
           if boe[k].bx=0 then begin 
              gotoxy(nowen[s].ax+1,6); 
              write('V'); 
              boe[k].bx:=nowen[s].ax+1; 
              boe[k].by:=6; 
              break; 
              end; 
        for k:=1 to 25 do 
           if boe[k].bx=0 then begin 
              gotoxy(nowen[s].ax+3,6); 
              write('V'); 
              boe[k].bx:=nowen[s].ax+3; 
              boe[k].by:=6; 
              break; 
              end; 
        end else begin 
           for k:=1 to 25 do 
              if boe[k].bx=0 then begin 
                 gotoxy(nowen[s].ax+2,6); 
                 write('V'); 
                 boe[k].bx:=nowen[s].ax+2; 
                 boe[k].by:=6; 
                 break; 
                 end; 
           end; 
end; 

procedure main; 
begin 
     i:=1; 
     while 30-i+enis>=0 do begin 
        gotoxy(1,1); 
        ch:=' '; 
        if keypressed then ch:=readkey; 
        if hp<=0 then lost; 
        for j:=1 to 25 do 
           if bom[j].bx<>0 then 
            if (hiten(j)<>0)or(bom[j].by=2) then begin 
                 if hiten(j)<>0 then begin 
                    clear(hiten(j)); 
                    now(30-i+enis); 
                    nowen[hiten(j)].ty:=-1; 
                    nowen[hiten(j)].ax:=0; 
                    end; 
                 gotoxy(bom[j].bx,bom[j].by); 
                 write(' '); 
                 bom[j].bx:=0; 
                 bom[j].by:=0; 
                 myij(ix); 
                 end else begin 
                    gotoxy(bom[j].bx,bom[j].by); 
                    write(' '); 
                    bom[j].by:=bom[j].by-1; 
                    gotoxy(bom[j].bx,bom[j].by); 
                    write('A'); 
                    myij(ix); 
                    end;

if sum mod 2=0 then for k:=1 to 25 do 
           if boe[k].bx<>0 then 
              if hitmy(k)or(boe[k].by=25) then begin 
                 if hitmy(k) then hp:=hp-1; 
                 gotoxy(boe[k].bx,boe[k].by); 
                 write(' '); 
                 boe[k].bx:=0; 
                 boe[k].by:=0; 
                 myij(ix); 
                 now(30-i+enis); 
                 end else begin 
                    gotoxy(boe[k].bx,boe[k].by); 

write(' '); 
                    boe[k].by:=boe[k].by+1; 
                    gotoxy(boe[k].bx,boe[k].by); 
                    write('V'); 
                    end; 
        case ch of 
           #27:halt; 
           'a':if canmove(ix-2,1)then begin 
              ix:=ix-1; 
              myij(ix); 
              end; 
           'd':if canmove(ix-2,2)then begin 
              ix:=ix+1; 
              myij(ix); 
              end; 
           'j':begin 
              for j:=1 to 25 do 
                 if bom[j].bx=0 then begin 
                    gotoxy(ix+2,21); 
                    write('A'); 
                    bom[j].bx:=ix+2; 
                    bom[j].by:=21; 
                    break; 
                    end; 
              end; 
           end; 
        delay(every); 
        sum:=sum+1; 
        if sum mod (every*(every div 3))=0 then for j:=1 to 3 do 
           if nowen[j].ty<>-1 then begin 
              bb(j); 
              move(j); 
              sum:=0; 
              end; 
        for j:=1 to 3 do 
           if (nowen[j].ty=-1)and(i<31) then begin 
              nowen[j].ty:=enlist[i].ty; 
              nowen[j].ax:=appear(j); 
              i:=i+1; 
              break; 
              end; 
        end; 

     win; 
end; 

procedure welcome; 
begin 
     clrscr; 
     gotoxy(29,13); 
     write('Press Enter to start:'); 
     readln; 
     writeln('             use:  a-left  f-right  j-bomb'); 
     write('      Please input how fast(suggest 20):'); 
     readln(every); 
     textbackground(green); 
     clrscr; 
     gotoxy(29,13); 
     writeln('Now upbilnd enemy list...'); 
     for i:=1 to 30 do begin 
        randomize; 
        enlist[i].ty:=random(100) mod 2; 
        end; 
     for i:=1 to 3 do 
        with nowen[i] do begin 
           ty:=-1; 
           ax:=0; 
           end; 
     for i:=1 to 25 do 
        with bom[i] do begin 
           bx:=0; 
           by:=0; 
           end; 
     for i:=1 to 25 do 
        with boe[i] do begin 
           bx:=0; 
           by:=0; 
           end; 
     delay(500); 
     clrscr; 
     textcolor(red); 
     ix:=38; 
     hp:=20; 
     sum:=0; 
     bshp:=150; 
     myij(ix); 
     now(30); 
end; 

begin 
     welcome; 
     main; 
end.