KazankovMarch

veryinterestinggame

Apr 18th, 2019
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 12.39 KB | None | 0 0
  1.  
  2. program VERYINTERESTINGGAME_rip_PrO100AnRuWka1337;
  3. uses crt;
  4. //паскаль охуенен)
  5. const
  6.   dy = 65;
  7.   nmax=15;
  8.   mmax=21;
  9.   tmax=10;
  10.   start_health=3;
  11.   you = '&';
  12.   wall = '█';
  13.   trap = '*';
  14.   star = '$';
  15.   emp = ' ';
  16.   t  = '@';
  17.   heart = '¤';
  18. Type Tfield = array[0..nmax+1,0..mmax+1] of char;
  19. Type Tteleports = array[1..tmax] of record
  20.   f:record
  21.     x:integer;
  22.     y:integer;
  23.   end;
  24.   t:record
  25.     x:integer;
  26.     y:integer;
  27.   end;
  28. end;      
  29. var buf:char; teleports:Tteleports; stars_on_field,health,youx,youy:integer;
  30. procedure set_vertical_wall(var field:Tfield; x,y,length:integer);
  31.   var i:integer;
  32.   begin
  33.       i:=x;
  34.       while (i<=nmax)and(i<x+length) do
  35.       begin
  36.         field[i,y]:=wall;
  37.         inc(i);
  38.       end;
  39.   end;
  40. procedure set_horizontal_wall(var field:Tfield; x,y,length:integer);
  41.   var j:integer;
  42.   begin
  43.       j:=y;
  44.       while (j<=mmax)and(j<y+length) do
  45.       begin
  46.         field[x,j]:=wall;
  47.         inc(j);
  48.       end;
  49.   end;
  50. procedure add_tp(var field:Tfield; var teleports:Tteleports; x1,y1,x2,y2:integer);
  51.   var i:integer;
  52.   begin
  53.     i:=tmax;
  54.     while (i>0)and(teleports[i].f.x=0) do
  55.       dec(i);
  56.     inc(i);
  57.     teleports[i].f.x:=x1;
  58.     teleports[i].f.y:=y1;
  59.     teleports[i].t.x:=x2;
  60.     teleports[i].t.y:=y2;  
  61.     field[x1,y1]:=t;
  62.     field[x2,y2]:=t;
  63.     teleports[i+1].t.x:=x1;
  64.     teleports[i+1].t.y:=y1;
  65.     teleports[i+1].f.x:=x2;
  66.     teleports[i+1].f.y:=y2;  
  67.   end;  
  68. procedure set_you(var field:Tfield; x,y:integer);
  69.   begin
  70.     field[x,y]:=you;
  71.     youx:=x;
  72.     youy:=y;
  73.   end;
  74. procedure add_star(var field:Tfield; x,y:integer);
  75.   begin
  76.     if field[x,y]<>star then
  77.     begin
  78.       field[x,y]:=star;
  79.       inc(stars_on_field);
  80.     end;
  81.   end;
  82. procedure init_tp;
  83.   var i:integer;
  84.   begin
  85.     for i:=1 to tmax do
  86.     begin
  87.       teleports[i].f.x:=0;
  88.       teleports[i].f.y:=0;
  89.     end;
  90.   end;
  91. procedure init(var field:Tfield; var stars:integer);
  92.   var i,j:integer;
  93.   begin
  94.     stars_on_field:=-1;
  95.     health:=start_health;
  96.     buf:=emp;
  97.     init_tp;
  98.     for i:=1 to nmax do
  99.       for j:=1 to mmax do
  100.         field[i,j]:=' ';
  101.     for i:=0 to nmax+1 do
  102.     begin
  103.       field[i,0]:=wall;
  104.       field[i,mmax+1]:=wall;
  105.     end;
  106.     for j:=0 to mmax+1 do
  107.     begin
  108.       field[0,j]:=wall;
  109.       field[nmax+1,j]:=wall;
  110.     end;
  111.    
  112.     set_horizontal_wall(field,1,11,7);
  113.     set_horizontal_wall(field,2,9,3);
  114.     field[3,11]:=wall;
  115.     set_vertical_wall(field,1,13,3);
  116.     field[2,18]:=wall;
  117.     field[3,19]:=wall;
  118.     field[4,20]:=wall;
  119.     j:=2;
  120.     for i:=12 downto 5 do
  121.     begin
  122.         field[i,j]:=wall;
  123.         inc(j);
  124.     end;
  125.     j:=2;
  126.         for i:=12 to 15 do
  127.     begin
  128.         field[i,j]:=wall;
  129.         inc(j);
  130.     end;
  131.     set_horizontal_wall(field,15,5,7);
  132.     field[3,3]:=wall;
  133.     field[3,5]:=wall;
  134.     set_horizontal_wall(field,4,2,5);
  135.     field[5,2]:=wall;
  136.     field[5,6]:=wall;
  137.     field[6,3]:=wall;
  138.     field[6,5]:=wall;
  139.     field[7,4]:=wall;
  140.     field[9,1]:=wall;
  141.     field[4,9]:=wall;
  142.     j:=19;
  143.     for i:=5 to 11 do
  144.     begin
  145.         field[i,j]:=wall;
  146.         dec(j);
  147.     end;
  148.     field[12,13]:=wall;
  149.     set_vertical_wall(field,5,12,5);
  150.     set_vertical_wall(field,7,10,5);
  151.     set_vertical_wall(field,7,9,3);
  152.     set_vertical_wall(field,7,13,3);
  153.     set_vertical_wall(field,10,7,3);
  154.     field[11,6]:=wall;
  155.     field[11,8]:=wall;
  156.     set_vertical_wall(field,4,15,3);
  157.     field[5,14]:=wall;
  158.     field[5,16]:=wall;
  159.     set_vertical_wall(field,13,9,2);
  160.     set_vertical_wall(field,13,11,2);
  161.     field[14,12]:=wall;
  162.     field[14,13]:=wall;
  163.     set_horizontal_wall(field,11,16,5);
  164.     field[10,17]:=wall;
  165.     field[10,19]:=wall;
  166.     field[12,16]:=wall;
  167.     field[12,20]:=wall;
  168.     field[13,17]:=wall;
  169.     field[13,19]:=wall;
  170.     field[14,18]:=wall;
  171.     field[8,21]:=wall;
  172.     for i:=2 to 9 do
  173.     begin
  174.         add_star(field,1,i);
  175.         if i<9 then add_star(field,i,1);
  176.     end;
  177.     for i:=14 downto 9 do
  178.       add_star(field,i,21);
  179.     for i:=19 downto 13 do
  180.        add_star(field,15,i);
  181.     for i:=1 to 4 do
  182.       add_star(field,15,i);
  183.     for i:=18 to 21 do
  184.       add_star(field,1,i);
  185.     for i:=10 to 12 do
  186.       add_star(field,4,i);
  187.     add_star(field,5,10);
  188.     for i:=9 to 11 do
  189.       add_star(field,6,i);
  190.     add_star(field,7,11);
  191.     add_star(field,8,10);
  192.     add_star(field,8,12);
  193.     add_star(field,9,11);
  194.     add_star(field,7,6);
  195.     add_star(field,9,4);
  196.     add_star(field,2,8);
  197.     add_star(field,10,5);
  198.     add_star(field,9,7);
  199.     add_star(field,5,4);
  200.     add_star(field,2,12);
  201.     add_star(field,14,10);
  202.     add_star(field,12,10);
  203.     add_star(field,11,11);
  204.     add_star(field,10,13);
  205.     add_star(field,7,16);
  206.     add_star(field,6,17);
  207.     add_star(field,3,18);
  208.     add_star(field,9,16);
  209.     add_star(field,7,18);
  210.     add_star(field,6,19);
  211.     add_star(field,5,20);
  212.     add_star(field,14,14);
  213.     add_star(field,12,18);
  214.     field[1,1]:=trap;
  215.     for i:=7 to 9 do
  216.       field[i,2]:=trap;
  217.     field[11,2]:=trap;
  218.     field[14,2]:=trap;
  219.     field[11,5]:=trap;
  220.     field[5,11]:=trap;
  221.     field[7,12]:=trap;
  222.     field[9,10]:=trap;
  223.     field[3,16]:=trap;
  224.     field[6,17]:=trap;
  225.     field[3,20]:=trap;
  226.     field[6,20]:=trap;
  227.     for i:=8 to 10 do
  228.       field[i,20]:=trap;
  229.     field[11,18]:=trap;
  230.     field[4,4]:=trap;
  231.     field[2,14]:=heart;
  232.     field[14,8]:=heart;
  233.     add_tp(field,teleports,9,1,8,21);
  234.     add_tp(field,teleports,1,10,6,4);
  235.     add_tp(field,teleports,13,18,15,12);
  236.     set_you(field,8,11);
  237.   end;
  238. function decode(s:string):string;
  239.   var i:integer;
  240.   begin
  241.     result:='';
  242.     for i:=1 to length(s) do
  243.       result:=result+chr(ord(s[i])-17);
  244.   end;
  245. function find_stars_on_field(field:tfield):integer;
  246.   var i,j:integer;
  247.   begin
  248.     result:=0;
  249.     for i:=1 to nmax do
  250.       for j:=1 to mmax do
  251.         if field[i,j]=star then
  252.           inc(result);
  253.   end;
  254. procedure write_field(field:Tfield);
  255.   var i,j:integer;
  256.   begin
  257.     for i:=0 to nmax+1 do
  258.     begin
  259.       for j:=0 to mmax+1 do
  260.         write(field[i,j]);
  261.       writeln();
  262.     end;
  263.     writeln('  ',star,' осталось: ', stars_on_field);
  264.     writeln;
  265.     writeln('    здоровье: ', health);
  266.   end;
  267.  
  268. procedure clean;
  269.   begin
  270.       clrscr;
  271.       writeln('                    KEK_GAME   ');
  272.       writeln;
  273.   end;
  274. procedure show_start_dialog;
  275.   var ok:char;
  276.   begin
  277.     writeln('                    KEK_GAME   ');
  278.     writeln('  привет, Настя! Эта топовая игра для тебя :D');
  279.     writeln('Управление через WASD: w - вверх, a - влево, s - вниз, d - вправо');
  280.     writeln('             === Правила ===');
  281.     writeln('    ',trap,' = минус нога (с)');
  282.     writeln('    нужно собрать все ',star);
  283.     writeln('    ',heart,' = "плюс нога" :D');
  284.     writeln('    можно пользоваться порталами ',t);
  285.     writeln('                 ты - ',you,'            ');
  286.     writeln('             ===============' );
  287.     writeln('         для старта нажми W ');
  288.     writeln('   (возможно нужно поменять раскладку) ');
  289.     ok:=readKey;
  290.     while ok<>'w' do
  291.       ok:=ReadKey;
  292.   end;
  293. procedure show_lose_dialog(var surr:Boolean);
  294. var s:char; i:integer;
  295.   begin
  296.     writeln;
  297.     writeln;
  298.     writeln('    ты проиграла :)');
  299.     writeln('        поробуй еще,нажми  W  ');
  300.     s:=readkey;
  301.     i:=1;
  302.     while (s<>'w')and(i<30) do
  303.     begin
  304.       inc(i);
  305.       s:=ReadKey;
  306.     end;
  307.     if i=30 then
  308.           surr:=true;
  309.     clean;
  310.   end;
  311. procedure show_win_dialog;
  312.   var s:string; c:char; i:integer;
  313.   begin //+17
  314.     writeln;
  315.     write('       ');
  316.     for i:=1 to 65 do
  317.     begin
  318.         write(wall);
  319.         delay(10);
  320.     end;
  321.     clean;
  322.     writeln('');
  323.     write('      ');
  324.     s:=('ЮсђѓѠ=1ѓќ1ыёєѓсѠ1KU1р1тќ1яјцюѝ1іяѓць1єшюсѓѝ1ѓцтѠ1ѐятьщчц?1Хсусъ1уђѓёцѓщэђѠ1щ1ѐяфєьѠцэ1ѐяђьц1ѓуяцфя1ўышсэцюсP1K:');
  325.     s:=decode(s);
  326.     for i:=1 to 17 do
  327.     begin
  328.       write(s[i]);
  329.       delay(dy);
  330.     end;  
  331.     write(s[18],s[19]);
  332.     delay(300);
  333.     for i:=20 to 57 do
  334.     begin
  335.       write(s[i]);
  336.       delay(dy);
  337.     end;
  338.     delay(100);
  339.     writeln;
  340.     write('                 ');
  341.     for i:=58 to s.Length-2 do
  342.     begin
  343.       write(s[i]);
  344.       delay(dy);
  345.     end;
  346.     write(s[i+1],s[i+2]);
  347.     writeln('');
  348.     writeln('_______________________$$_____$$$$$$$$$$$_______$$$_____$$¬______');
  349.     writeln('________________________$_______________$$_______$$_______$______');
  350.     writeln('________________________$_______________$$______$$$$$$$$$$$______');
  351.     writeln('________________________$_______________$$_____$$$$$$$_____$_____');
  352.     writeln('________________________$$_______________$$____$$$$$$$_____$_____');
  353.     writeln('________________________$$________________$$$$$$$$$$$$_____$_____');
  354.     writeln('_______________________$$________________________$$$$_____$______');
  355.     writeln('_______________________$$___________________________$$___$$______');
  356.     writeln('______________________$$______________________________$$$__$_____');
  357.     writeln('______________________$$___________________________________$$____');
  358.     writeln('______________________$$__________________________________$$$$$$$');
  359.     writeln('__________________$$$$$$$______$$$________________$$$______$_____');
  360.     writeln('______________________$$_______$$$________________$$$_____$$_____');
  361.     writeln('_______________________$$______$$$______$$$$______$$$______$$$$$_');
  362.     writeln('____________________$$$$$$$____________$$$$$$____________$$$_____');
  363.     writeln('_________________________$$$______________________________$$_____');
  364.     writeln('________________________$$_$$___________________________$$__$$___');
  365.     writeln('______________________$$_____$$______________________$$$$¬_______');
  366.     writeln('______________________________$$$$$$____________$$$$$$___________');
  367.     write('____________________________________$$$$$$$______________________');
  368.     delay(5500);
  369.     c:=readkey;
  370.    end;
  371. procedure find_you(field:Tfield; var x,y:integer);
  372.   var i,j:integer; found:boolean;
  373.   begin
  374.       found:=false;
  375.       i:=1;
  376.       while (not found)and(i<=nmax) do
  377.       begin
  378.         j:=1;
  379.         while (not found)and(j<=mmax) do
  380.         begin
  381.           if field[i,j]=you then
  382.           begin
  383.             found:=true;
  384.             x:=i;
  385.             y:=j;
  386.           end;
  387.           inc(j);
  388.         end;
  389.         inc(i);
  390.       end;
  391.   end;
  392. procedure tp(var field:Tfield; {'from' changes to 'to':}var x,y:integer);
  393. var i:integer; found:Boolean;
  394.   begin
  395.     i:=1;
  396.     while not found do
  397.     begin
  398.       found:=(teleports[i].f.x=x)and(teleports[i].f.y=y);
  399.       inc(i);
  400.     end;
  401.     dec(i);
  402.     x:=teleports[i].t.x;
  403.     y:=teleports[i].t.y;
  404.   end;
  405. procedure move(var field:Tfield; step:char);
  406.   var x,y,newx,newy:integer;
  407.   begin
  408.     x:=youx;
  409.     y:=youy;
  410.     newx:=x;
  411.     newy:=y;
  412.     case step of
  413.     'w': if x>1 then
  414.             dec(newx);
  415.     'a': if y>1 then
  416.             dec(newy);
  417.     's': if x<nmax then
  418.             inc(newx);
  419.     'd': if y<mmax then
  420.             inc(newy);
  421.     end;
  422.     if field[newx,newy]<>wall then
  423.     begin
  424.       field[youx,youy]:=buf;
  425.       if (field[newx,newy]=trap)or(field[newx,newy]=t) then
  426.           buf:=field[newx,newy]
  427.       else
  428.           buf:=emp;
  429.       case field[newx,newy] of
  430.         heart: begin inc(health); end;
  431.         trap: begin dec(health); end;
  432.         star: begin dec(stars_on_field); end;
  433.         t: begin tp(field,newx,newy) end;
  434.       end;
  435.       set_you(field, newx,newy);
  436.       clean;
  437.       write_field(field);
  438.     end;
  439.   end;
  440. procedure play;
  441.   var win,dead,surr:Boolean; step:char; field:Tfield; stars,collected_stars:integer;
  442.   begin
  443.     while (not surr)and(not win) do
  444.       begin
  445.       win:=false;
  446.       dead:=false;
  447.       collected_stars:=0;
  448.       init(field,stars);
  449.       write_field(field);
  450.       while (not win)and(not dead) do
  451.       begin
  452.           step:=readkey;
  453.           move(field,step);
  454.           win:=stars_on_field=0;
  455.           dead:=health=0;
  456.       end;
  457.       clean;
  458.       if win then
  459.         show_win_dialog
  460.       else
  461.         show_lose_dialog(surr);
  462.     end;
  463.   end;
  464. begin
  465.   show_start_dialog;
  466.   clean;
  467.   play;
  468. end.
Advertisement
Add Comment
Please, Sign In to add comment