@move_count = move_count
@teban = nil # black => true, white => false
@initial_moves = []
+ @move = nil
@ous = [nil, nil] # keep OU pieces of Sente and Gote
end
attr_accessor :array, :sente_hands, :gote_hands, :history, :sente_history, :gote_history, :teban
# moves.
attr_reader :initial_moves
+ # A move parsed by handle_one_move. If the move is not :normal, the board
+ # position may or may not be rolled back.
+ #
+ attr_reader :move
+
# See if self equals rhs, including a logical board position (i.e.
# not see object IDs) and sennichite stuff.
#
# - :uchifuzume
# - :oute_kaihimore
# - (:outori will not be returned)
+ # - :max_moves
#
def handle_one_move(str, sente=nil)
if (str =~ /^([\+\-])(\d)(\d)(\d)(\d)([A-Z]{2})/)
return :illegal # can't put on existing piece
end
- move = Move.new(x0, y0, x1, y1, name, sente)
- result = move_to(move)
+ @move = Move.new(x0, y0, x1, y1, name, sente)
+ result = move_to(@move)
if (result == :illegal)
# self is unchanged
return :illegal
end
if (checkmated?(sente))
- move_back(move)
+ move_back(@move)
return :oute_kaihimore
end
if ((x0 == 0) && (y0 == 0) && (name == "FU") && uchifuzume?(sente))
- move_back(move)
+ move_back(@move)
return :uchifuzume
end
update_sennichite(sente)
os_result = oute_sennichite?(sente)
if os_result # :oute_sennichite_sente_lose or :oute_sennichite_gote_lose
- move_back(move)
+ move_back(@move)
restore_sennichite_stuff(*sennichite_stuff)
return os_result
end
if sennichite?
- move_back(move)
+ move_back(@move)
restore_sennichite_stuff(*sennichite_stuff)
return :sennichite
end
+ # New rule that CSA introduced in November 2014.
+ # If a game with 256 plies does not end, make the game a draw.
+ # When running test cases $options might be nil.
+ if $options && $options["max-moves"] &&
+ $options["max-moves"] > 0 && @move_count >= $options["max-moves"]
+ return :max_moves
+ end
+
return :normal
end