From ff63db17c66da56061d49e18b937cac1c5a5d706 Mon Sep 17 00:00:00 2001 From: Gnieark Date: Mon, 20 Jun 2016 22:55:35 +0200 Subject: [PATCH] . --- connectfourLearn.php | 403 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 403 insertions(+) create mode 100644 connectfourLearn.php diff --git a/connectfourLearn.php b/connectfourLearn.php new file mode 100644 index 0000000..caba961 --- /dev/null +++ b/connectfourLearn.php @@ -0,0 +1,403 @@ + 0){ + if($isVertical){ + echo '{"play":'.$decalageX.'}'; + }else{ + echo '{"play":'.(can_win($line,$me,0)[0] + $decalageX).'}'; + } + die; + + } + + if (count(can_loose($line,$opponent,0)) > 0){ + + if($isVertical){ + $colForNoLose[] = $decalageX; + }else{ + $colForNoLose = array_merge_and_increment_rigth($colForNoLose ,can_loose($line,$opponent,0),$decalageX); + } + } + + + if (count(can_loose($line,$opponent,1)) > 0 ){ + if($isVertical){ + $colForNoLose1[] = $decalageX; + }else{ + $colForNoLose1 = array_merge_and_increment_rigth($colForNoLose1 ,can_loose($line,$opponent,1),$decalageX); + } + } + if(count(can_win($line,$opponent,1)) > 0){ + if($isVertical){ + $canWinDepth1[] = $decalageX; + }else{ + $canWinDepth1= array_merge_and_increment_rigth($canWinDepth1, can_win($line,$me,1), $decalageX); + } + } + + return array( + 'colForNoLose' => $colForNoLose, + 'colForNoLose1' => $colForNoLose1, + 'canWinDepth1' => $canWinDepth1 + ); + +} + + +function should_opponent_win_if_i_play_at($map,$me,$opponent,$colToPlay){ + //j'ouvre l'a possibilité à l'adversaire de jouer au dessus de mon pion + // est-ce une connerie? + + if(($map[4][$colToPlay] == $me) OR ($map[4][$colToPlay] == $opponent)){ + //top of the grid + return false; + } + + for($y = 0; (($map[$y][$colToPlay] <> "+") && ($map[$y][$colToPlay] <> "-")); $y++){ + } + + $map[$y][$colToPlay] = $me; + $map[$y +1][$colToPlay] = "$opponent"; + $y++; + if(isset($map[$y +1][$colToPlay])){ + $map[$y +1][$colToPlay] = "+"; + } + //tester les lignes qui passent pas $y+1,$colToPlay + + $loseStr = $opponent.$opponent.$opponent.$opponent; + //horizontale + $line=""; + for($x=0; $x < 7; $x++){ + $line.=$map[$y][$x]; + } + if(strpos($line,$loseStr) !== false){ + return true; + } + + //diagonal / + $line=""; + if($colToPlay > $y){ + $kx=$colToPlay - $y; + $ky = 0; + }else{ + $kx = 0; + $ky = $y - $colToPlay; + } + while(isset($map[$ky][$kx])){ + $line.=$map[$ky][$kx]; + $kx++; + $ky++; + } + if(strpos($line,$loseStr) !== false){ + return true; + } + + //diagional \ + $line = ""; + $kx = $colToPlay; + $ky = $y; + + while(isset($map[$ky -1][$kx +1])){ + $kx++; + $ky--; + } + + while(isset($map[$ky][$kx])){ + $line.=$map[$ky][$kx]; + $kx--; + $ky++; + } + if(strpos($line,$loseStr) !== false){ + return true; + } + return false; +} + + + +//replace "" by " ", it will simplify my code. +$in=str_replace('""','"-"',file_get_contents('php://input')); + +$params=json_decode($in, TRUE); +switch($params['action']){ + case "init": + echo '{"name":"Gnieark"}'; + break; + case "play-turn": + //find $opponent and clean grid + for($x = 0; $x < 7 ; $x++){ + for($y = 0; $y < 6 ; $y++){ + + //find opponent + if(($params['board'][$y][$x] <> "-" ) && ($params['board'][$y][$x] <> $params['you'] )){ + $opponent= $params['board'][$y][$x]; + } + + //tester si la case est jouable (s'il y a un support en dessous) + if ($params['board'][$y][$x] == "-" ){ + //AND (($y==0) OR ($params['board'][$y - 1][$x] !== "-")) + //){ + //la case est jouable, je la marque par un "+" + if($y == 0){ + $params['board'][$y][$x] = "+"; + }elseif(($params['board'][$y -1 ][$x] !== "-") AND ($params['board'][$y -1 ][$x] !== "+")){ + $params['board'][$y][$x] = "+"; + }else{} + } + } + } + if((!isset($opponent)) && ($params['you'] == "X")){ + $opponent="O"; + }elseif(!isset($opponent)){ + $opponent="X"; + } + + //transformer la grille en lignes horizontales, verticales et diagonales + + + + //verticales + for($x = 0; $x <7; $x ++){ + $colStr=""; + for($y = 0; $y <6; $y ++){ + $colStr.= $params['board'][$y][$x]; + } + $choice = analize($colStr,$params['you'],$opponent,true,$x); + } + + //horizontales + for($y = 0; $y <6; $y ++){ + $lnStr=""; + for($x = 0; $x <7; $x ++){ + $lnStr.= $params['board'][$y][$x]; + } + $choice = analize($lnStr,$params['you'],$opponent,false,0); + } + + //tester seulement les diagonales >= 4 cases + + for ($k = 0; $k < 4; $k ++){ + + //diagonale / + $diagStr=""; + for($x=$k , $y=0; isset($params['board'][$y][$x]); $x++, $y++){ + $diagStr.=$params['board'][$y][$x]; + } + $choice = analize($diagStr,$params['you'],$opponent,false,$k); + + //diagonale \ + $diagStr=""; + for($x=$k , $y=5; isset($params['board'][$y][$x]); $x++, $y--){ + $diagStr.=$params['board'][$y][$x]; + } + $choice = analize($diagStr,$params['you'],$opponent,false,$k); + + } + for ($k = 0; $k < 3; $k ++){ + //diagonale / + $diagStr=""; + for($x = 0, $y = $k ; isset($params['board'][$y][$x]); $x++, $y++){ + $diagStr.=$params['board'][$y][$x]; + } + $choice = analize($diagStr,$params['you'],$opponent,false,0); + } + for ($k = 3 ; $k < 6 ; $k++){ + + //diagonales \ + $diagStr=""; + for($x=0 , $y=$k; isset($params['board'][$y][$x]); $x++, $y--){ + $diagStr.=$params['board'][$y][$x]; + } + $choice = analize($diagStr,$params['you'],$opponent,false,0); + } +//print_r($choice); + + //si j'arrive là, je ne gagne pas à ce tour + + //liste des cases possible moins celles à éviter + + $colAvailable=array(); + for($i=0;$i<7;$i++){ + if((($params['board'][5][$i] == "+") OR ($params['board'][5][$i] == "-")) + AND (!should_opponent_win_if_i_play_at($params['board'],$params['you'],$opponent,$i))) + { + $colAvailable[]=$i; + } + } + if(count($colAvailable) == 0){ + //on risque de perdre au prochain tour + for($i=0;$i<7;$i++){ + if(($params['board'][5][$i] == "+") OR ($params['board'][5][$i] == "-")){ + $colAvailable[]=$i; + } + } + } + + + + + if(count($choice['colForNoLose']) > 0){ + + //intersection entre $choice['colForNoLose'] et $colAvailable + $intersection = array_intersect($choice['colForNoLose'],$colAvailable); + if(count($intersection) > 0){ + shuffle($intersection); + echo '{"play":'.$intersection[0].'}'; + die; + }else{ + //on pourra perdre au prochain tour, tant pis + shuffle($choice['colForNoLose']); + echo '{"play":'.$choice['colForNoLose'][0].'}'; + die; + } + + } + + + + $colForNoLose1 = array_unique($choice['colForNoLose1']); + $canWinDepth1 = array_unique($choice['canWinDepth1']); + + $intersection = array_intersect($colForNoLose1,$colAvailable,$canWinDepth1); + if(count($intersection) > 0){ + shuffle($intersection); + echo '{"play":'.$intersection[0].'}'; + die; + } + + $intersection = array_intersect($colForNoLose1,$colAvailable); + if(count($intersection) > 0){ + shuffle($intersection); + echo '{"play":'.$intersection[0].'}'; + die; + } + + $intersection = array_intersect($colForNoLose1,$canWinDepth1); + if(count($intersection) > 0){ + shuffle($intersection); + echo '{"play":'.$intersection[0].'}'; + die; + } + + //still there? random + + shuffle($colAvailable); + echo '{"play":'.$colAvailable[0].'}'; + + + break; + default: + break; +} + + +