Facebook
From Marek, 4 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 999
  1. %przykładowe testy
  2. %przem(c,4,c,3)
  3. %przem(a,1,b,1)
  4. %przem(a,6,d,6)
  5. %
  6. %przem(a,1,X,Y) - brak optymalnego dobierania rozwiazania, problem wykonuje sie zbyt dlugo, dla tak duzej planszy
  7.  
  8.  
  9.  
  10. board([ [w  ,w  ,w  ,w  ,w  ,w  ,w  ,w  ,w  ],
  11.         [w  ,a  ,a  ,c  ,c  ,x  ,i  ,l  ,w  ],
  12.         [w  ,a  ,a  ,x  ,d  ,d  ,x  ,l  ,w  ],
  13.         [w  ,x  ,x  ,x  ,e  ,h  ,x  ,k  ,w  ],
  14.         [w  ,b  ,b  ,x  ,e  ,g  ,x  ,k  ,w  ],
  15.         [w  ,b  ,b  ,x  ,x  ,x  ,j  ,j  ,w  ],
  16.         [w  ,b  ,b  ,x  ,f  ,f  ,j  ,j  ,w  ],
  17.         [w  ,w  ,w  ,w  ,w  ,w  ,w  ,w  ,w  ]]).
  18.  
  19.  
  20. steps(2).
  21. steps(4).
  22. steps(8).
  23. steps(16).
  24. steps(32).
  25.  
  26.  
  27.  
  28. direction(down).
  29. direction(right).
  30. direction(up).
  31. direction(left).
  32.  
  33. height(a, X):- X is 1.
  34. height(b, X):- X is 2.
  35. height(c, X):- X is 3.
  36. height(d, X):- X is 4.
  37. height(e, X):- X is 5.
  38. height(f, X):- X is 6.
  39.  
  40.  
  41. height(a).
  42. height(b).
  43. height(c).
  44. height(d).
  45. height(e).
  46. height(f).
  47.  
  48. width(1).
  49. width(2).
  50. width(3).
  51. width(4).
  52. width(5).
  53. width(6).
  54. width(7).
  55.  
  56.  
  57.  
  58. xydiff(D, Y, X):-
  59.     D = 'left',
  60.     Y is 0,
  61.     X is -1.
  62. xydiff(D, Y, X):-
  63.     D = 'right',
  64.     Y is 0,
  65.     X is 1.
  66. xydiff(D, Y, X):-
  67.     D = 'up',
  68.     Y is -1,
  69.     X is 0.    
  70. xydiff(D, Y, X):-
  71.     D = 'down',
  72.     Y is 1,
  73.     X is 0.
  74.  
  75.  
  76. % PREDICATS
  77.  
  78. %------------------
  79.         max_steps(MaxSteps):-
  80.         board(Board),
  81.         find_all_objects(Board, Objects, 'x'),
  82.         length(Objects, MaxSteps).
  83. %------------------
  84.  
  85.  
  86. %------------------
  87.     n_character(N, Chars, Char):-
  88.         string_chars(Chars, Str),
  89.         nth0(N, Str, Char).    
  90. %------------------    
  91.  
  92.  
  93. %------------------
  94.         position(Board, Y, X, Character):-
  95.         nth0(Y, Board, Column),
  96.         nth0(X, Column, Character).
  97. %------------------
  98.  
  99.  
  100. %------------------
  101.         find_corner(Board, Y, X, Character):-
  102.         position(Board, Y, X, Character), !.
  103. %------------------    
  104.  
  105.  
  106. %------------------
  107.         is_position_free(Board, Y, X):-
  108.         position(Board, Y, X, 'x').
  109. %------------------    
  110.  
  111.  
  112. %------------------
  113.     is_position_wall(Board, Y, X):-
  114.         position(Board, Y, X, 'w').
  115. %------------------
  116.  
  117.        
  118. %------------------
  119.     add_element(List, Element, [Element|List]).
  120. %------------------
  121.  
  122.  
  123. %------------------
  124.     change_in_list(Index, Elem, [_|T], [Elem|T]):-
  125.         Index = 0,
  126.         !.
  127.        
  128.     change_in_list(Index, Elem, [H|T], [H|Out]):-
  129.         Index1 is Index - 1,
  130.         change_in_list(Index1, Elem, T, Out).
  131. %------------------
  132.  
  133.  
  134. %------------------
  135.         insert_into_two_dimensional_array(Y, X, Object, Board, NewBoard):-
  136.         nth0(Y, Board, ColFrom),
  137.         change_in_list(X, Object, ColFrom, NewColFrom),
  138.         change_in_list(Y, NewColFrom, Board, NewBoard).
  139. %------------------
  140.  
  141.  
  142. %------------------
  143.     unpack_one_element_list([H|_], H).
  144.  
  145.  
  146.     unpack_two_element_list([H|T], H, B):-
  147.         unpack_one_element_list(T, B).
  148.  
  149.  
  150.         unpack_three_element_list([H|T], H, B, C):-
  151.         unpack_two_element_list(T, B, C).
  152. %------------------
  153.  
  154.  
  155. %------------------
  156.         find_all_objects(Board, Objects, Character):-
  157.         append(Board, L),
  158.         find_all_objects_unwrap(L, [], Objects, Character).
  159.        
  160.         find_all_objects_unwrap([], ObjectsTemp, ObjectsTemp, _).
  161.    
  162.     find_all_objects_unwrap([H|T], ObjectsTemp, Objects, Character):-
  163.         n_character(_, H, Character),
  164.         add_element(ObjectsTemp, H, ObjectsTemp1),
  165.         find_all_objects_unwrap(T, ObjectsTemp1, Objects, Character),!.
  166.  
  167.     find_all_objects_unwrap([_|T], ObjectsTemp, Objects, Character):-
  168.                 find_all_objects_unwrap(T, ObjectsTemp, Objects, Character), !.
  169.  
  170. %------------------    
  171.  
  172.  
  173.  
  174. %------------------
  175.     find_all_cords_of_block_unwrap(_, [], ListOfCords, ListOfCords).   
  176.        
  177.     find_all_cords_of_block_unwrap(Board, [H|T], ListOfCordsTemp, ListOfCords):-
  178.          position(Board, Y, X, H),
  179.          insert_into_two_dimensional_array(Y, X, 'T', Board, NewBoard),
  180.          add_element(ListOfCordsTemp, [Y, X], ListOfCordsTemp1),
  181.          find_all_cords_of_block_unwrap(NewBoard, T, ListOfCordsTemp1, ListOfCords), !.
  182.    
  183.         find_all_cords_of_block(Board, Character, ListOfCords):-
  184.         find_all_objects(Board, Objects, Character),
  185.         find_all_cords_of_block_unwrap(Board, Objects, [], ListOfCords).
  186. %------------------
  187.  
  188.  
  189. %------------------
  190.     replace_cords_with_character(Board, Board, [], _).
  191.         replace_cords_with_character(Board, NewBoard, [H|T], BlockCharacter):-
  192.         unpack_two_element_list(H, Y, X),
  193.         insert_into_two_dimensional_array(Y, X, BlockCharacter, Board, Board1),
  194.         replace_cords_with_character(Board1, NewBoard, T, BlockCharacter).
  195. %------------------
  196.  
  197.  
  198. %------------------
  199.         move_cordinates([], NewListOfCords, NewListOfCords , _, _).
  200.         move_cordinates([H|T], TemporaryListOfCords, NewListOfCords, Ydiff, Xdiff):-
  201.         unpack_two_element_list(H, Y, X),
  202.         Y1 is Y + Ydiff,
  203.         X1 is X + Xdiff,
  204.         add_element(TemporaryListOfCords, [Y1, X1], TemporaryListOfCords1),
  205.         move_cordinates(T, TemporaryListOfCords1, NewListOfCords, Ydiff, Xdiff).
  206. %------------------
  207.  
  208. %------------------
  209.         get_new_cords(ListOfCords, NewListOfCords, Direction):-
  210.         xydiff(Direction, Ydiff, Xdiff),
  211.         move_cordinates(ListOfCords, [], NewListOfCords, Ydiff, Xdiff).
  212. %------------------
  213.  
  214.  
  215. %------------------
  216.     can_single_cell_move(Board, Y, X, Ydiff, Xdiff):-
  217.         position(Board, Y, X, BlockCharacter),
  218.         Y1 is Y + Ydiff,
  219.         X1 is X + Xdiff,
  220.         position(Board, Y1, X1, CellCharacter),
  221.         (CellCharacter = BlockCharacter ; CellCharacter = 'x').
  222. %------------------
  223.  
  224.  
  225. %------------------    
  226.         can_every_cell_move(_, [], _, _).
  227.         can_every_cell_move(Board, [H|T], Xdiff, Ydiff):-
  228.         unpack_two_element_list(H, Y, X),
  229.         can_single_cell_move(Board, Y, X, Xdiff, Ydiff),
  230.         can_every_cell_move(Board, T, Xdiff, Ydiff).
  231. %------------------
  232.  
  233.  
  234. %------------------
  235.     can_block_move(Board, Direction, ListOfCords):-
  236.         xydiff(Direction, Ydiff, Xdiff),
  237.         can_every_cell_move(Board, ListOfCords, Ydiff, Xdiff).
  238. %------------------
  239.  
  240.  
  241.  
  242. %------------------    
  243.         move_block(Board, BlockCharacter, Direction, NewBoard):-
  244.         find_all_cords_of_block(Board, BlockCharacter, ListOfCords),
  245.         can_block_move(Board, Direction, ListOfCords),
  246.         replace_cords_with_character(Board, Board1, ListOfCords, x),
  247.         get_new_cords(ListOfCords, ListOfCords1, Direction),
  248.         replace_cords_with_character(Board1, NewBoard, ListOfCords1, BlockCharacter).
  249. %------------------
  250.  
  251.  
  252. %------------------
  253.         %best move for the game
  254.         one_step(Board, NewBoard):-
  255.        move_block(Board, a, right, NewBoard), !.
  256.        
  257.         %random  move
  258.         one_step(Board, NewBoard):-
  259.        direction(Dir),
  260.        block(BlockCharacter),
  261.        move_block(Board, BlockCharacter, Dir, NewBoard).
  262. %------------------
  263.        
  264.  
  265. %------------------
  266.         make_move(Board, Board, Steps, MaxSteps, Final_Y, Final_X, []):-
  267.         not(Steps > MaxSteps),
  268.         find_corner(Board, Y, X, a),
  269.         Y is Final_Y,
  270.         X is Final_X,
  271.         !.
  272.         make_move(Board, NewBoard, Steps, MaxSteps,  Final_Y, Final_X, MOVES):-
  273.         not(Steps > MaxSteps),
  274.         one_step(Board, BoardT),
  275.         IncSteps is Steps + 1,
  276.         make_move(BoardT, NewBoard, IncSteps, MaxSteps, Final_Y, Final_X, MOVEST),
  277.         MOVES = [BoardT | MOVEST],
  278.         !.
  279. %------------------
  280.  
  281.  
  282. %------------------
  283.  
  284.         rozwiaz(FinalY, FinalX, FinalBoard, MOVES):-
  285.         height(FinalY, Y),
  286.         board(B),
  287.         steps(MaxSteps),
  288.         make_move(B, FinalBoard, 0, MaxSteps, Y, FinalX, MOVES), !.
  289.        
  290. %------------------
  291.  
  292. max_height_width(MaxHeight, MaxWidth):-
  293.     board(B),
  294.     last(B, Row),
  295.     length(B, Height),
  296.     length(Row, Width),
  297.     MaxHeight is Height - 2,
  298.     MaxWidth is Width - 2.
  299.  
  300. walidate_cords(StartY, StartX, EndY, EndX):-
  301.     height(EndY),
  302.     width(EndX),
  303.     height(StartY),
  304.     width(StartX).
  305.    
  306. translate_cords(StartY, EndY, SY, EY):-
  307.     height(StartY, SY),
  308.     height(EndY, EY).
  309.  
  310. %------------------    
  311.         przem(StartY, StartX, EndY, EndX):-
  312.         walidate_cords(StartY, StartX, EndY, EndX),    
  313.                 translate_cords(StartY, EndY, SY, EY),    
  314.         max_steps(MaxSteps),
  315.         board(B),
  316.         przem_unwrap(B, SY, StartX, EY, EndX, 0, MaxSteps).
  317.        
  318.         przem_unwrap(_, StartY, StartX, EndY, EndX, Steps, MaxSteps):-
  319.         not(Steps > MaxSteps),
  320.         StartX = EndX,
  321.         StartY = EndY,!.
  322.  
  323.         przem_unwrap(Board, StartY, StartX, EndY, EndX, Steps, MaxSteps):-
  324.         not(Steps > MaxSteps),
  325.         position(Board, StartY, StartX,  Char),
  326.         direction(Dir),
  327.         move_block(Board, Char, Dir, NewBoard),
  328.         position(NewBoard, TempY, TempX, Char),
  329.         IncSteps = Steps + 1,
  330.         przem_unwrap(NewBoard, TempY, TempX, EndY, EndX, IncSteps, MaxSteps).
  331. %------------------

Replies to Untitled rss

Title Name Language When
Prolog test 2 - przem Marek text 4 Years ago.