| | |||||||
| |||||||
| |||||||
|
|
|
|
|
|
|
This is from Zombie's, copy and replace this over Zombie's judge.php You can set the time-out from the GUI. VERY important, that I found out the hard way: since your script is being included (and not executed as the real contest will be done), do NOT use global in your functions, as that looks for global variables in judge.php's global scope and NOT your capture.php's global scope. By : webhappy <?php /* *\ project: Capture The Flag: php competition on codewalkers.com file: judge.php: script that plays a match between robots author: zombie: Tomica Jovanovic <tomica00@mail.com> disclaimer: this script is distributed in the hope that it will be useful, but it is provided "AS IS" and WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. more info: see the README file for more info... \* */ // this function is colled only on first turn of the mach... if it doesn't find white // and red robot script dirs, it goes back to the start page, WITHOUT any msg... sorry ;) function start($white, $red) { if (!file_exists($white) or !file_exists($red)) die(header('Location: start.php')); $w=array('n'=>$white, 'x'=>0, 'y'=>1, 'i'=>'STARTWHITE', 's'=>array(), 'd'=>0, 't'=>-1, 'l'=>0); $r=array('n'=>$red, 'x'=>29, 'y'=>27, 'i'=>'STARTRED', 's'=>array(), 'd'=>0, 't'=>-1, 'l'=>0); @unlink("$w[n]/data.txt"); @unlink("$r[n]/data.txt"); return array('w'=>$w, 'r'=>$r, 'c'=>'w', 'b'=>array(93=>'lime', 806=>'lime')); } // this function is colled to execute the robot scripts. include is placed in the separate // function so that robot scripts don't mess up our variables. if u want to run the scripts // from the command line (like the rules say) change include() line into smth like example // NOTE: u must NOT use die() in ur robot scripts if u don't change include() to exec() function run() { include('capture.php'); // exec("/path/to/php capture.php"); } // checks if position ($x, $y) is on the grid function valid($x, $y) { return $x>=0 and $x<30 and $y>=0 and $y<30; } // it returns 1 if there is a sticky trap on $k ($k=$x+30*$y), // 2 if there is a teleport trap on $k, and nothing if there is not a trap on $k function trap($w, $r, $k) { if (in_array($k, $w['s']) or in_array($k, $r['s'])) return 1; if ($k==$w['t'] or $k==$r['t']) return 2; } // it sets the global var $winner to the text that say that smb wins function winner($c, $p) { global $winner; $winner="<hr /><b><big><font color=".($c=='w'?'black':'red')."> $p[n] WINS!"; } // this is the main logic function... it processes one move from move.txt... function process($w, $r, $c, $n, $b, $p, $m) { $mx=array('T'=>0, 'U'=>0, 'L'=>-1, 'R'=>+1, 'D'=>0); $my=array('T'=>0, 'U'=>-1, 'L'=>0, 'R'=>0, 'D'=>+1); switch ($m[0]) { case 'M': $p['i']='MOVEBAD'; if (valid($i=$p['x']+$mx[$m[1]], $j=$p['y']+$my[$m[1]])) { $p['x']=$i; $p['y']=$j; $p['i']='MOVEOK'; if (trap($w, $r, $k=$i+30*$j)==1) $p['i']='STUCK1'; if (trap($w, $r, $k)==2) { $p['x']=rand(0, 29); $p['y']=rand(0, 29); $p['i']="T$p[x],$p[y]"; } if ($c=='w' and $k==806 or $c=='r' and $k==93) winner($c, $p); } break; case 'R': $p['i']='MOVEOK'; break; case 'T': $p['i']='TRAPBAD'; $k=(($i=$p['x']+$mx[$m[1]])+30*($j=$p['y']+$my[$m[1]])); if ($m[1]!='T' and valid($i, $j) and !trap($w, $r, $k) and count($p['s'])<7 and $k!=93 and $k!=806) { $p['i']='TRAPOK'; $p['s'][]=$k; $b[$k]='yellow'; } if ($m[1]=='T' and valid($i, $j) and !trap($w, $r, $k) and $p['t']==-1 and $k!=93 and $k!=806) { $p['i']='TRAPOK'; $p['t']=$k; $b[$k]='blue'; } break; case 'L': $p['i']='LBAD'; if ($p['l']<5) { $i=$$n; $p['i']="L$i[x],$i[y]"; $p['l']++; } break; case 'D': $p['i']='DEATHMISSED'; if ($p['d']<1) { $k=$$n; if (!valid(($i=$p['x'])+$mx[$m[1]], ($j=$p['y'])+$my[$m[1]])) winner($n, $$n); while (valid($i+=$mx[$m[1]], $j+=$my[$m[1]])) if ($k['x']==$i and $k['y']==$j) winner($c, $p); $p['d']++; } break; } return array('w'=>$w, 'r'=>$r, 'c'=>$c, 'n'=>$n, 'b'=>$b, 'p'=>$p); } // this function returns javascript that changes colors on the grid, and moves teams around... function grid($b, $f, $p='') { foreach ($b as $k=>$v) $p.="parent.grid.document.getElementById('c$k').style.background='$v';\n"; foreach ($f as $k=>$v) $p.="parent.grid.document.i$k.src='$v.gif';\n"; return "<script language='javascript'>\n$p\n</script>\n"; } // outputs all the info u see in the right frame, and some controls (check box and a button) function control($w, $r, $c, $p, $m) { global $winner, $timeOut; if ( !isset($timeOut) )$timeOut = 250; return "<link href='global.css' rel='stylesheet' type='text/css' /> <form name=forma> <input type='checkbox' name=next ".((!isset($_GET['next']) or @$winner)?'':'checked')." /> auto <input type=textfield name=timeOut value=$timeOut>Auto Time-out <input type='submit' value='next' /></form><hr />\n<script language='javascript'> setTimeout('if (document.forma.next.checked) document.forma.submit() ', document.forma.timeOut.value);\n</script> <table border=1 cellspacing=1 cellpadding=1 bordercolor=white width='100%'> <tr><td class=meta> <td class=white><b>$w[n]<td class=red><b>$r[n] <tr><td class=meta>location<td class=white>$w[x],$w[y]<td class=red>$r[x],$r[y] <tr><td class=meta>sticky<td class=white>".count($w['s'])."<td class=red>".count($r['s'])." <tr><td class=meta>teleport<td class=white>".($w['t']>=0?1:0)."<td class=red>".($r['t']>=0?1:0)." <tr><td class=meta>death.ray<td class=white>$w[d]<td class=red>$r[d] <tr><td class=meta>locators<td class=white>$w[l]<td class=red>$r[l] <tr><td class=meta>move.txt<td class=white>".($c=='w'?$m:'.')."<td class=red>".($c=='r'?$m:'.')." <tr><td class=meta>input.txt<td colspan=2 class=".($c=='w'?'white':'red').">$p[i]</table>".(@$winner); } // main() function ;)) function main() { if (isset($_POST['white'])) { extract(start($_POST['white'], $_POST['red'])); } else { extract(unserialize(fread(fopen('data.txt', 'r'), 999))); } $n=(($c=='w')?'r':'w'); $p=$$c; if ($p['i']=='STUCK1') { $p['i']='STUCK'; $$c=$p; $m='??'; } else { chdir($p['n']); fwrite(fopen('input.txt', 'w'), "$p[i]\n"); run(); $m=fread(fopen('move.txt', 'r'), 99); chdir(".."); $i=array('w'=>$w['x']+30*$w['y'], 'r'=>$r['x']+30*$r['y']); extract(process($w, $r, $c, $n, $b, $p, $m)); $$c=$p; $f=array($i['w']=>'blank', $i['r']=>'blank', $w['x']+30*$w['y']=>'white', $r['x']+30*$r['y']=>'red'); echo grid($b, $f); } echo control($w, $r, $c, $$c, $m); fwrite(fopen('data.txt', 'w'), serialize(array('w'=>$w, 'r'=>$r, 'c'=>$n, 'b'=>array()))); } main(); ?>
More Contest Code Articles |
| |
| |