Advertisement
niepok

skoczek

Jan 25th, 2015
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 3.71 KB | None | 0 0
  1. (* Lab11 - skoczek szachowy *)
  2.  
  3. program skoczek;
  4. uses crt;
  5.  
  6. var tab : array[1..20] of array[1..20] of boolean;  // true - był, false - nie był
  7. var moves : array[1..8] of array[1..2] of integer;  //Możliwe ruchy konia szachowego
  8.  
  9. var x, y : integer;  // Pozycja skoczka
  10. var size : integer;  // Rozmiar szachownicy
  11. var visited : integer;  // Jeżeli wyniesie size^2, to znaczy, że wszyskie pola obskoczył.
  12. var i, j : integer;
  13. var calls : int64;
  14.  
  15. function canMove(moveType : integer) : boolean;
  16. var res : boolean;
  17. begin
  18.     res := true;
  19.     if (x+moves[moveType, 1] > size) or (x+moves[moveType, 1] < 1) then  // Wyjedzie z planszy w X
  20.     begin
  21.         res := false;
  22.     end
  23.     else if (y+moves[moveType, 2] > size) or (y+moves[moveType, 2] < 1) then  // Wyjedzie z planszy w Y
  24.     begin
  25.         res := false;
  26.     end
  27.     else if(tab[x+moves[moveType, 1], y+moves[moveType, 2]] = true) then
  28.     begin
  29.         res := false;
  30.     end;
  31.  
  32.     canMove := res;
  33. end;
  34.  
  35. function tryMove(moveType : integer) : boolean;
  36. var finished : boolean;
  37. var k : integer;
  38. begin
  39.     calls := calls+1;
  40.     finished := false;
  41.  
  42.     // Rusz się
  43.     x := x + moves[moveType, 1];
  44.     y := y + moves[moveType, 2];
  45.     visited := visited+1;
  46.     tab[x, y] := true;
  47.  
  48.     if visited = size * size then  //Obszedł wszystkie pola, jest OK.
  49.     begin
  50.         finished := true;
  51.     end;
  52.  
  53.     clrscr;
  54.     writeln('Pozycja: ', x, ', ', y);
  55.     writeln('Odwiedzono pól: ', visited);
  56.     writeln('Wywolan: ', calls);
  57.     for i := 1 to size do
  58.     begin
  59.         for j := 1 to size do
  60.         begin
  61.             if tab[i, j] then
  62.             begin
  63.                 write('X');
  64.             end
  65.             else
  66.             begin
  67.                 write(' ');
  68.             end;
  69.         end;
  70.         writeln();
  71.     end;
  72.     if finished then
  73.     begin
  74.         writeln('Zrobione.');
  75.     end;
  76.     readln;
  77.  
  78.     // Spróbuj iść dalej...
  79.     if not finished then  //...oczywiście jeżeli trzeba.
  80.     begin
  81.         for k:=1 to 8 do
  82.         begin
  83.             if canMove(k) then  // Jeżeli może się gdzieś ruszyć
  84.             begin
  85.                 if tryMove(k) then
  86.                 begin
  87.                     finished := true;
  88.                 end;
  89.             end;
  90.         end;
  91.     end;
  92.  
  93.     // Wróć
  94.     if not finished then
  95.     begin
  96.         tab[x, y] := false;
  97.         visited := visited-1;
  98.         x := x - moves[moveType, 1];
  99.         y := y - moves[moveType, 2];
  100.  
  101.         clrscr;
  102.         writeln('Pozycja: ', x, ', ', y);
  103.         writeln('Odwiedzono pól: ', visited);
  104.         writeln('Wywolan: ', calls);
  105.     for i := 1 to size do
  106.     begin
  107.         for j := 1 to size do
  108.         begin
  109.             if tab[i, j] then
  110.             begin
  111.                 write('X');
  112.             end
  113.             else
  114.             begin
  115.                 write(' ');
  116.             end;
  117.         end;
  118.         writeln();
  119.     end;
  120.         readln;
  121.     end;
  122.     tryMove := finished;
  123. end;
  124.  
  125. begin
  126.     calls := 0;
  127.     // Ustawienie typów ruchów
  128.     moves[1, 1] := 1;
  129.     moves[1, 2] := 2;
  130.  
  131.     moves[2, 1] := 2;
  132.     moves[2, 2] := 1;
  133.  
  134.     moves[3, 1] := 2;
  135.     moves[3, 2] := -1;
  136.  
  137.     moves[4, 1] := 1;
  138.     moves[4, 2] := -2;
  139.  
  140.     moves[5, 1] := -1;
  141.     moves[5, 2] := -2;
  142.  
  143.     moves[6, 1] := -2;
  144.     moves[6, 2] := -1;
  145.  
  146.     moves[7, 1] := -2;
  147.     moves[7, 2] := 1;
  148.  
  149.     moves[8, 1] := -1;
  150.     moves[8, 2] := 2;
  151.  
  152.     repeat
  153.     begin
  154.         write('Podaj rozmiar szachownicy: ');
  155.         readln(size);
  156.     end
  157.     until (size >= 4) and (size <= 20);
  158.  
  159.     // Inicjalizacja szachownicy
  160.     for i := 1 to size do
  161.     begin
  162.         for j := 1 to size do
  163.         begin
  164.             tab[i, j] := false;
  165.         end;
  166.     end;
  167.  
  168.     repeat
  169.     begin
  170.         write('Podaj x skoczka: ');
  171.         readln(x);
  172.     end
  173.     until (x >= 1) and (x <= size);
  174.  
  175.     repeat
  176.     begin
  177.         write('Podaj y skoczka: ');
  178.         readln(y);
  179.     end
  180.     until (y >= 1) and (y <= size);
  181.  
  182.     visited := 1;  // Odwiedził pole, z którego startuje
  183.     tab[x, y] := true;
  184.  
  185.     // Zacznij próbować ruchy
  186.     for i:=1 to 8 do
  187.     begin
  188.         if canMove(i) then  // Jeżeli może się gdzieś ruszyć
  189.         begin
  190.             if tryMove(i) then
  191.             begin
  192.                 break;  // Jak skończył, przerwij pętlę.
  193.             end;
  194.         end;
  195.     end;
  196.  
  197.     writeln('Obskoczyl! ', calls);
  198. end.
  199.  
  200. (*Typy ruchów:
  201.    8 1
  202.   7   2
  203.     X
  204.   6   3
  205.    5 4
  206.    *)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement