Advertisement
Guest User

Untitled

a guest
Jun 26th, 2013
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 2.49 KB | None | 0 0
  1. -module(nz).
  2. -export([start_x/0, start_o/0, start_x_track_path/0,
  3.          start_o_track_path/0]).
  4.  
  5. -record(state, {field=[0,0,0, 0,0,0, 0,0,0],
  6.                 track_path=false}).
  7.  
  8. start_x() ->
  9.     place_mark(1, 2, false, #state{}).
  10.  
  11. start_x_track_path() ->
  12.     place_mark(1, 2, false, #state{track_path=true}).
  13.  
  14. start_o() ->
  15.     place_mark(2, 1, false, #state{}).
  16.  
  17. start_o_track_path() ->
  18.     place_mark(2, 1, false, #state{track_path=true}).
  19.  
  20.  
  21. game_finished([X,X,X, _,_,_, _,_,_]) when X =/= 0 ->
  22.     true;
  23. game_finished([_,_,_, X,X,X, _,_,_]) when X =/= 0 ->
  24.     true;
  25. game_finished([_,_,_, _,_,_, X,X,X]) when X =/= 0 ->
  26.     true;
  27. game_finished([X,_,_, X,_,_, X,_,_]) when X =/= 0 ->
  28.     true;
  29. game_finished([_,X,_, _,X,_, _,X,_]) when X =/= 0 ->
  30.     true;
  31. game_finished([_,_,X, _,_,X, _,_,X]) when X =/= 0 ->
  32.     true;
  33. game_finished([X,_,_, _,X,_, _,_,X]) when X =/= 0 ->
  34.     true;
  35. game_finished([_,_,X, _,X,_, X,_,_]) when X =/= 0 ->
  36.     true;
  37. game_finished(Field) ->
  38.     lists:all(fun(Cell) ->
  39.                       Cell =/= 0
  40.               end, Field).
  41.  
  42. updated(List, Idx, Value) ->
  43.     lists:sublist(List, Idx) ++
  44.         [Value] ++
  45.         lists:nthtail(Idx + 1, List).
  46.  
  47. place_mark(_CurrentMark, _NextMark, true, #state{field=Field}) ->
  48.     dump_field(Field);
  49. place_mark(CurrentMark, NextMark, _Finished, State = #state{field=Field,
  50.                                                             track_path=TrackPath}) ->
  51.     lists:foreach(fun(Idx) ->
  52.                           NewField = updated(Field, Idx, CurrentMark),
  53.                           case TrackPath of
  54.                               true -> dump_field(Field);
  55.                               false -> do_nothing
  56.                           end,
  57.                           place_mark(NextMark, CurrentMark, game_finished(NewField),
  58.                                      State#state{field = NewField})
  59.                   end, empty(Field)).
  60.  
  61. empty(Field) ->
  62.     [Idx || {Idx, Cell} <- lists:zip(lists:seq(0, 8), Field),
  63.             Cell =:= 0].
  64.  
  65. dump_field(Field) ->
  66.     lists:foreach(fun(Row) ->
  67.                           io:format("+-+-+-+~n", []),
  68.                           io:format("|~c|~c|~c|~n", lists:map(fun mark/1, Row))
  69.                   end, chunks(Field, 3)),
  70.     io:format("+-+-+-+~n~n", []).
  71.  
  72. chunks(List, Len) when length(List) =< Len ->
  73.     [List];
  74. chunks(List, Len) ->
  75.     {Pre, Suf} = lists:split(Len, List),
  76.     [Pre | chunks(Suf, Len)].
  77.  
  78. mark(Cell) ->
  79.     lists:nth(Cell + 1, " xo").
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement