zoukankan      html  css  js  c++  java
  • Pascal小游戏 打飞机

    一个经典的打飞机游戏(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.

            

     
    不要想你能为世界做什么,想想你该为世界做什么!
  • 相关阅读:
    SQLyog 使用笔记,自增主键数据冲突错误
    扫一扫的意义
    js 加法运算
    linux crontab执行shell脚本中包含相对路径的问题
    Nginx笔记总结十二:nginx版本号隐藏
    Nginx笔记总结十一:Nginx重写规则指南
    Nginx笔记总结十:Nginx日志切割
    Nginx笔记总结九:Nginx日志配置
    Nginx笔记总结八:ngx_http_core_module模块中的变量
    Nginx笔记总结七:root和alias文件路径配置
  • 原文地址:https://www.cnblogs.com/Chaobs/p/3837516.html
Copyright © 2011-2022 走看看