Advertisement
Guest User

Untitled

a guest
Sep 25th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 3.72 KB | None | 0 0
  1. :- dynamic current_index/1.
  2. assert(current_index(0)).
  3.  
  4. listMove(List, Index, 0, Value) :-
  5.   !.
  6.  
  7. listMove(List, Index, Count, Value) :-
  8.   nth0(Index, List, Value),
  9.   writeln(Value),
  10.   NewIndex is Index + 1,
  11.   length(List, L),
  12.   CheckedIndex is NewIndex mod L,
  13.   NewCount is Count - 1,
  14.   listMove(List, CheckedIndex, NewCount, NewValue).
  15.  
  16. replace([_|T], 0, X, [X|T]).
  17. replace([H|T], I, X, [H|R]):- I > -1, NI is I-1, replace(T, NI, X, R), !.
  18. replace(L, _, _, L).
  19.  
  20. listUpdate(NewList, Index, 0, _, ListOut, IndexOut) :-
  21.   ListOut = NewList,
  22.   IndexOut is Index - 1,
  23.   !.
  24.  
  25. listUpdate(List, Index, Count, Value, ListOut, IndexOut) :-
  26.   nth0(Index, List, Value),
  27.   UpdatedValue is Value + 1,
  28.   /*write("New value: "),*/
  29.   /*writeln(UpdatedValue),*/
  30.   replace(List, Index, UpdatedValue, NewList),
  31.   NewIndex is Index + 1,
  32.   length(List, L),
  33.   CheckedIndex is NewIndex mod L,
  34.   NewCount is Count - 1,
  35.   listUpdate(NewList, CheckedIndex, NewCount, NewValue, ListOut, IndexOut).
  36.   /*writeln(NewList)*/
  37.  
  38. listClearElement(List, Index, ListOut) :-
  39.   replace(List, Index, 0, ListOut).
  40.  
  41. step(List, Index, ListOut, IndexOut) :-
  42.   nth0(Index, List, Count),
  43.   listClearElement(List, Index, ListCleared),
  44.   NewIndex is Index + 1,
  45.   listUpdate(ListCleared, NewIndex, Count, Value, ListOut, IndexOut),
  46.   /*writeln("step"),*/
  47.   /*writeln(ListOut),*/
  48.   !.
  49.  
  50. /*тотальный запуск*/
  51. launchgame(List, 4, ListOut, IndexOut):-
  52.   writeln("launch stop"),
  53.   /*fail,*/
  54.   !.
  55.  
  56. launchgame(List, Index, ListOut, IndexOut):-
  57.   /*writeln("launch"),  */
  58.   /*writeln(List),*/
  59.   /*writeln(Index),*/
  60.   /*writeln(ListOut),*/
  61.   /*writeln(IndexOut),*/
  62.   writeln("launch gogame"),  
  63.   get(A),/*костыль, чтобы не зацикливался*/
  64.   gogame(List, Index, ListOut, IndexOut, List, Index, 1).
  65.  
  66. /*если последний камушек в дом*/
  67. gogame(List, -1, ListOut, IndexOut, LastWorkedList, LastWorkedIndex, RestartFlag) :-
  68.   writeln("gogame -1"),
  69.   length(List, L),
  70.   NewL is L - 1,
  71.   nth0(NewL, List, Value),
  72.   writeln(Value),
  73.   (Value =:= 8 ->
  74.     false,
  75.     !;
  76.  
  77.     launchgame(List, 0, ListOut, IndexOut)
  78.     ).
  79.  
  80. /*запуск одной итерации, restart_flag для того чтобы не делать проверку что камушек попадал в пустую лунку, ибо был полный рестарт*/
  81. gogame(List, Index, ListOut, IndexOut, LastWorkedList, LastWorkedIndex, RestartFlag) :-
  82.   writeln("gogame standart"),
  83.   write("List - "),
  84.   writeln(List),
  85.   write("Index - "),
  86.   writeln(Index),
  87.   nth0(Index, List, IsEmpty),
  88.   /*если пытается взять из пустой*/
  89.   (IsEmpty =:= 0 ->
  90.     writeln("restart from empty"),
  91.     NewIndex is Index + 1,
  92.     launchgame(LastWorkedList, NewIndex, ListOut, IndexOut);
  93.  
  94.     (RestartFlag =:= 1 ->
  95.       IsEmptyElement is IsEmpty; /*если был рестарт, пофиг куда падал камушек в прошлый раз*/
  96.       IsEmptyElement is IsEmpty - 1),
  97.  
  98.     /*если последний камушек в пустую лунку*/
  99.  
  100.     /*IsEmptyTest is IsEmptyElement =:= 0,*/
  101.     /*RestartTest is RestartFlag =:= 1, */
  102.     /*TotalTest is IsEmptyTest + RestartTest,*/
  103.     /*writeln(IsEmptyElement),*/
  104.     (IsEmptyElement =:= 0 ->
  105.       writeln("restart becous of fail"),
  106.       NewIndex is Index + 1,
  107.       launchgame(LastWorkedList, NewIndex, ListOut, IndexOut);
  108.    
  109.       /*write("not empty"),*/
  110.       /*write(Index),*/
  111.       /*write("-"),*/
  112.       step(List, Index, ListOut, IndexOut),
  113.       gogame(ListOut, IndexOut, NewLst, NewIndex, LastWorkedList, LastWorkedIndex, 0)  
  114.     )
  115.   ).
  116.  
  117.  
  118.  
  119. start(List):-
  120.   launchgame(List, 0, ListOut, IndexOut),
  121.   writeln("exit").
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement