Advertisement
Guest User

Prolog ćw 7

a guest
Apr 1st, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 6.11 KB | None | 0 0
  1. board([ [w  ,w  ,w  ,w  ,w  ,w  ,w  ,w  ,w  ],
  2.         [w  ,a  ,a  ,c  ,c  ,x  ,i  ,j  ,w  ],
  3.         [w  ,a  ,a  ,x  ,d  ,d  ,x  ,j  ,w  ],
  4.         [w  ,x  ,x  ,x  ,e  ,f  ,x  ,k ,w  ],
  5.         [w  ,b  ,b  ,x  ,e  ,g  ,x  ,k  ,w  ],
  6.         [w  ,b  ,b  ,x  ,x  ,x  ,l  ,l  ,w  ],
  7.         [w  ,b  ,b  ,x  ,h  ,h  ,l  ,l  ,w  ],
  8.         [w  ,w  ,w  ,w  ,w  ,w  ,w  ,w  ,w  ]]).
  9.  
  10. %------------------
  11.     n_character(N, Chars, Char):-
  12.         string_chars(Chars, Str),
  13.         nth0(N, Str, Char).
  14. %------------------
  15.    
  16. %------------------
  17.     position(Board, Y, X, Character):-
  18.         nth0(Y, Board, Column),
  19.         nth0(X, Column, Character).
  20. %------------------
  21.  
  22.  
  23. %------------------
  24.     is_position_free(Board, Y, X):-
  25.         position(Board, Y, X, 'x').
  26. %------------------    
  27.  
  28. %------------------
  29.     is_position_wall(Board, Y, X):-
  30.         position(Board, Y, X, 'w').
  31. %------------------
  32.  
  33. %------------------
  34.     add_element(List, Element, [Element|List]).
  35. %------------------
  36.  
  37. %-----------------
  38.     loop_through_sequence([]).
  39.     loop_through_sequence([_|T]):-
  40.         loop_through_sequence(T).
  41. %------------------
  42.  
  43. %------------------
  44.     find_all_ids(Board, IDS):-
  45.         append(Board, IDS1),
  46.         sort(IDS1, IDS2),
  47.         delete(IDS2, 'w', IDS3),
  48.         delete(IDS3, 'x', IDS4),
  49.         delete(IDS4, 'a', IDS).        
  50. %------------------
  51.        
  52. %------------------
  53.     find_all_objects_unwrap([], ObjectsTemp, ObjectsTemp, _).    
  54.     find_all_objects_unwrap([H|T], ObjectsTemp, Objects, Character):-
  55.         n_character(_, H, Character),
  56.         add_element(ObjectsTemp, H, ObjectsTemp1),
  57.         find_all_objects_unwrap(T, ObjectsTemp1, Objects, Character),!.
  58.     find_all_objects_unwrap([_|T], ObjectsTemp, Objects, Character):-
  59.         find_all_objects_unwrap(T, ObjectsTemp, Objects, Character), !.
  60.     find_all_objects(Board, Objects, Character):-
  61.         append(Board, L),
  62.         find_all_objects_unwrap(L, [], Objects, Character).
  63. %------------------
  64.  
  65. %------------------
  66.     find_all_cords_of_block_unwrap(_, [], ListOfCords, ListOfCords).       
  67.     find_all_cords_of_block_unwrap(Board, [H|T], ListOfCordsTemp, ListOfCords):-
  68.          position(Board, Y, X, H),
  69.          insert_into_two_dimensional_array(Y, X, 'T', Board, NewBoard),
  70.          add_element(ListOfCordsTemp, [Y, X], ListOfCordsTemp1),
  71.          find_all_cords_of_block_unwrap(NewBoard, T, ListOfCordsTemp1, ListOfCords), !.    
  72.     find_all_cords_of_block(Board, Character, ListOfCords):-
  73.         n_character(0, Character, ID),
  74.         find_all_objects(Board, Objects, ID),
  75.         find_all_cords_of_block_unwrap(Board, Objects, [], ListOfCords).
  76.  
  77. %------------------
  78.     replace_cords_with_character(Board, Board, [], _).
  79.     replace_cords_with_character(Board, NewBoard, [H|T], BlockCharacter):-
  80.         unpack_two_element_list(H, Y, X),
  81.         insert_into_two_dimensional_array(Y, X, BlockCharacter, Board, Board1),
  82.         replace_cords_with_character(Board1, NewBoard, T, BlockCharacter).
  83. %------------------
  84.  
  85. %------------------
  86.     move_cordinates([], NewListOfCords, NewListOfCords , _, _).
  87.     move_cordinates([H|T], TemporaryListOfCords, NewListOfCords, Ydiff, Xdiff):-
  88.         unpack_two_element_list(H, Y, X),
  89.         Y1 is Y + Ydiff,
  90.         X1 is X + Xdiff,
  91.         add_element(TemporaryListOfCords, [Y1, X1], TemporaryListOfCords1),
  92.         move_cordinates(T, TemporaryListOfCords1, NewListOfCords, Ydiff, Xdiff).
  93. %------------------
  94.  
  95. %------------------
  96.     get_new_cords(ListOfCords, NewListOfCords, Direction):-
  97.         xydiff(Direction, Ydiff, Xdiff),
  98.         move_cordinates(ListOfCords, [], NewListOfCords, Ydiff, Xdiff).
  99. %------------------
  100.  
  101. %------------------    
  102.     move_block(Board, NewBoard, BlockCharacter, Direction):-
  103.         find_all_cords_of_block(Board, BlockCharacter, ListOfCords),
  104.         replace_cords_with_character(Board, Board1, ListOfCords, x),
  105.         get_new_cords(ListOfCords, ListOfCords1, Direction),
  106.         replace_cords_with_character(Board1, NewBoard, ListOfCords1, BlockCharacter).      
  107. %------------------
  108.  
  109. %------------------
  110.     can_single_cell_move(Board, Y, X, Ydiff, Xdiff):-
  111.         position(Board, Y, X, BlockCharacter),
  112.         n_character(0, BlockCharacter, FirstBlockCharacter),
  113.         Y1 is Y + Ydiff,
  114.         X1 is X + Xdiff,
  115.         position(Board, Y1, X1, CellCharacter),
  116.         n_character(0, CellCharacter, FirstCellCharacter),
  117.         (FirstCellCharacter = FirstBlockCharacter ; FirstCellCharacter = 'x').
  118. %------------------
  119.  
  120. %------------------
  121.     can_every_cell_move(_, [], _, _).
  122.     can_every_cell_move(Board, [H|T], Xdiff, Ydiff):-
  123.         unpack_two_element_list(H, Y, X),
  124.         can_single_cell_move(Board, Y, X, Xdiff, Ydiff),
  125.         can_every_cell_move(Board, T, Xdiff, Ydiff).
  126. %------------------
  127.  
  128. %------------------
  129.     can_block_move(Board, BlockCorner, Direction):-
  130.         xydiff(Direction, Ydiff, Xdiff),
  131.         find_all_cords_of_block(Board, BlockCorner, ListOfCords),
  132.         can_every_cell_move(Board, ListOfCords, Ydiff, Xdiff).
  133. %------------------
  134.  
  135.  
  136. %------------------      
  137.     xydiff(D, Y, X):-
  138.         D = 'left',
  139.         Y is 0,
  140.         X is -1.
  141.     xydiff(D, Y, X):-
  142.         D = 'right',
  143.         Y is 0,
  144.         X is 1.
  145.     xydiff(D, Y, X):-
  146.         D = 'up',
  147.         Y is -1,
  148.         X is 0.
  149.     xydiff(D, Y, X):-
  150.         D = 'down',
  151.         Y is 1,
  152.         X is 0.
  153. %------------------
  154.  
  155. %------------------
  156.     change_in_list(Index, Elem, [_|T], [Elem|T]):-
  157.         Index = 0,
  158.         !. 
  159.     change_in_list(Index, Elem, [H|T], [H|Out]):-
  160.         Index1 is Index - 1,
  161.         change_in_list(Index1, Elem, T, Out).
  162. %------------------
  163.  
  164. %------------------
  165.     insert_into_two_dimensional_array(Y, X, Object, Board, NewBoard):-
  166.         nth0(Y, Board, ColFrom),
  167.         change_in_list(X, Object, ColFrom, NewColFrom),
  168.         change_in_list(Y, NewColFrom, Board, NewBoard).
  169. %------------------
  170.  
  171. %------------------
  172.     unpack_one_element_list([H|_], H).
  173.     unpack_two_element_list([H|T], H, B):-
  174.         unpack_one_element_list(T, B).
  175.     unpack_three_element_list([H|T], H, B, C):-
  176.         unpack_two_element_list(T, B, C).
  177. %------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement