## $Id$
## Copyright (C) 2004 NABEYA Kenichi (aka nanami@2ch)
-## Copyright (C) 2007-2008 Daigo Moriwaki (daigo at debian dot org)
+## Copyright (C) 2007-2012 Daigo Moriwaki (daigo at debian dot org)
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
require 'shogi_server/league/floodgate'
require 'shogi_server/game_result'
+require 'shogi_server/util'
module ShogiServer # for a namespace
@@mutex = Mutex.new
@@time = 0
+
+ # Decide an actual turn of each player according to their turn preferences.
+ # p2 is a rival player of the p1 player.
+ # p1_sente_string must be "*", "+" or "-".
+ # After this call, the sente value of each player is always true or false, not
+ # nil.
+ #
+ def Game.decide_turns(p1, p1_sente_string, p2)
+ if ((p1_sente_string == "*") && (p2.sente == nil))
+ if (rand(2) == 0)
+ p1.sente = true
+ p2.sente = false
+ else
+ p1.sente = false
+ p2.sente = true
+ end
+ elsif (p2.sente == true) # rival has higher priority
+ p1.sente = false
+ elsif (p2.sente == false)
+ p1.sente = true
+ elsif (p1_sente_string == "+")
+ p1.sente = true
+ p2.sente = false
+ elsif (p1_sente_string == "-")
+ p1.sente = false
+ p2.sente = true
+ else
+ ## never reached
+ end
+ end
+
+
def initialize(game_name, player0, player1, board)
@monitors = Array::new # array of MonitorHandler*
@game_name = game_name
@prepared_time.strftime("%Y"),
@prepared_time.strftime("%m"),
@prepared_time.strftime("%d"))
- FileUtils.mkdir_p(log_dir_name) unless File.exist?(log_dir_name)
@logfile = File.join(log_dir_name, @game_id + ".csa")
+ Mkdir.mkdir_for(@logfile)
$league.games[@game_id] = self
end
# class Game
- def handle_one_move(str, player)
+ def handle_one_move(str, player, end_time)
unless turn?(player)
return false if str == :timeout
end
finish_flag = true
- @end_time = Time::new
+ @end_time = end_time
t = [(@end_time - @start_time).floor, Least_Time_Per_Move].max
move_status = nil
@result.process if @result
finish() if finish_flag
@current_player, @next_player = @next_player, @current_player
- @start_time = Time::new
+ @start_time = Time.now
return finish_flag
end
@gote.write_safe(sprintf("START:%s\n", @game_id))
@sente.mytime = @total_time
@gote.mytime = @total_time
- @start_time = Time::new
+ @start_time = Time.now
end
def propose
@sente.write_safe(propose_message("+"))
@gote.write_safe(propose_message("-"))
- now = Time::new.strftime("%Y/%m/%d %H:%M:%S")
+ now = Time.now.strftime("%Y/%m/%d %H:%M:%S")
@fh.puts("$START_TIME:#{now}")
- @fh.print <<EOM
-P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
-P2 * -HI * * * * * -KA *
-P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
-P4 * * * * * * * * *
-P5 * * * * * * * * *
-P6 * * * * * * * * *
-P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
-P8 * +KA * * * * * +HI *
-P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
-+
-EOM
+ @fh.print(@board.initial_string)
if rated?
black_name = @sente.rated? ? @sente.player_id : @sente.name
white_name = @gote.rated? ? @gote.player_id : @gote.name
Least_Time_Per_Move:#{Least_Time_Per_Move}
END Time
BEGIN Position
-#{@board.to_s.chomp}
+#{@board.initial_string.chomp}
+#{@board.initial_moves.collect {|m| m + ",T1"}.join("\n")}
END Position
END Game_Summary
EOM
- return str
+ # An empty @board.initial_moves causes an empty line, which should be
+ # eliminated.
+ return str.gsub("\n\n", "\n")
end
def prepared_expire?
private
def issue_current_time
- time = Time::new.strftime("%Y%m%d%H%M%S").to_i
+ time = Time.now.strftime("%Y%m%d%H%M%S").to_i
@@mutex.synchronize do
while time <= @@time do
time += 1