[ List Earliest Comments Only For Pages | Games | Rated Pages | Rated Games | Subjects of Discussion ]
Single Comment
<P>Here is how the time controls will work. The time controls will have three parameters. These are $timelimit, $gracetime, and $bonustime. All of these will be measured in seconds. $timelimit is the total amount of time you will initially be given for making your moves during a game. Each time you move, the amount of time you have left will be calculated. At the beginning of the game, your time left will be equal to $timelimit. On the first move, the time difference between your first move and the creation of the log will be calculated, and for each subsequent move, the time difference between that move and the previous move will be calculated. This difference will then have $gracetime substracted from it. When this result is greater than zero, it will be subtracted from the amount of time left for the current player. When it is less than or equal to zero, the value of $bonustime will (assuming time has not already run out) be added to the amount of time left for that player. In this manner, the amount of time left for a player could grow greater than the value of $timelimit. Once time runs out for a player, that player will lose the game and be unable to increase his time left.</P>
<P>Here are the values I propose for the time control parameters:</P>
<PRE>
$timelimit = 2073600; // 24 days
$gracetime = 86400; // 24 hours
$bonustime = 21600; // 6 hours
</PRE>
<P>And here is the code I've written for enforcing time controls:</P>
<PRE>
// Check time
// The parameters used for time controls are $timelimit, $gracetime, and $bonustime. A record of the times
// when the game begins and when each player moves are stored in $timeline. $timestamps is an array of the
// values in $timeline, and $timeleft is an array of how much time is left for each player. The values for
// both these arrays are calculated fresh each time and are not stored in the log.
if ($timelimit > 0) {
if ($submit == 'Send') {
$now = time();
$timeline .= ' {$now}'; // $timeline was previously initialized to the log's creation time
}
$timestamps = explode(' ', $timeline);
// 1 = odd number, used for first player
// 0 = even number, used for second player
$timeleft[0] = $timeleft[1] = $timelimit;
for ($i = 1; $i < count($timestamps); $i++) {
$timeused = ($timestamps[$i] - $timestamps[$i-1]) - $gracetime;
$timeleft[$i & 1] -= $timeused;
if (($timeleft[$i & 1] < 0) && ($submit == 'Send')) {
// First player has run out of time && it is first player's turn := opponent wins
// First player has run out of time && it is second player's turn := player wins
// Second player has run out of time && it is first player's turn := player wins
// Second player has run out of time && it is second player's turn := opponent wins
$status = sprintf ('%s has won.', (($i & 1) ^ ($side != $first)) ? $opponent : $player);
break;
}
if (($timeleft[$i & 1] >= 0) && ($timeused <= 0))
$timeleft[$i & 1] += $bonustime;
}
}
</PRE>