PHP REVERSI

PHP REVERSI(オセロもどきゲーム)のプログラムを公開します。
ふと、PHPでオセロもどきのゲームを作成しようと思い、突貫で作ったのがこのプログラムです(メインの部分は週末1日で作成完了)。
ユーザー定義関数やオブジェクトを一切使用しておらず、コードを書いてはコピペ&一部変更の繰り返しという、パワープレイ的なプログラムになってしまいました。
あと、コンピューターは「手の先読み」は一切せず、盤面の優先順位でしか制御を行っていません。
ですので、コンピューターはあまり強くないです。

【ご注意】
・本プログラムの動作等に関する質問にはお答えできません。
・本プログラムの使用により、何らかの障害が発生した場合にも、当方は一切の責任を負いません。
・本プログラムの転載、二次配布を禁止します。

トップページに戻る

スポンサードリンク


<?php
//クエリーから盤面の石配置の取得
$loc = $_GET[LOC];

//クエリーからハンデの取得(数字はコーナーに置く石の数)
$han = $_GET[HAN];    
if (($han == 1)||($han == 2)||($han == 3)||($han == 4)){
} else {
    $han = 0; //取得ハンデ1、2、3、4以外の場合にはゼロ(エラー回避)
}
    
//クエリーからモードの取得(0は2人プレイヤー、1は黒コンピューター&白プレイヤー、2は黒プレイヤー&白コンピューター)
$mode = $_GET[MOD];
if (($mode != 1)&&($mode != 2)) {
    $mode = 0;
    $p1 = 'プレイヤー1';
    $p2 = 'プレイヤー2';
} elseif ($mode == 1) {
    $p1 = 'コンピューター';
    $p2 = 'プレイヤー';    
} else {
    $p1 = 'プレイヤー';
    $p2 = 'コンピューター';
}

//クエリーから順番の取得(1は黒の順番、2は白の順番)
$junban = $_GET[JUN];
if($junban == '') { //順番が取得できない場合には、プレイ開始直後と判断
    
    if ($han > 0) { //ハンデありの場合には白先手
        $junban = 2;
    }
    
}
if($junban != 2) { //順番の指定が1でも2でもない場合には、強制的に順番の数字を1に設定する(エラー回避)
    $junban = 1;
}

//次の順番の石(1は黒、2は白)
$junban_next = 3 - $junban;
    
//クエリーからパスの累積取得
$pass_his = $_GET[PAS];
if ($pass_his != 1) { //パスの累積が1以外は強制的に0にする(エラー回避)
    $pass_his = 0;
}
    
//パス用フラグ(0はパス、1以上はパスしない。後に置く所があると判定されれば1以上に変更される)
$pass_not = 0;

//スコア初期設定
$score[1] = 0; //黒の石の数
$score[2] = 0; //白の石の数
    
//石配置を配列に変換 → $dimh(表示用配列)、$dimi(実際の配置用配列)、$dimn(次の手の配置用配列)
if ($loc == "") { //クエリーデータがない場合の石配置初期設定
    $loc = '0000000000000000000000000002100000012000000000000000000000000000';
}
$loc_len = strlen($loc) - 1; //文字列の長さ取得(ループ用に-1)(エラー回避用)

for ($i=0; $i<=63; $i++) { //盤面の石配置データ分ループ
    if ($i <= $loc_len) { //キーの値が文字列の長さ以下なら該当文字をゲット
        $tempdim = substr($loc,$i,1);
    } else { //キーの値が文字列の長さを超える場合にはゼロを配列に入れる
        $tempdim = 0;
    }
    if (($tempdim >= 0)&&($tempdim <= 6)){ //数字0〜6の場合のみ配列変数に数字を代入
        $dimh[$i] = $tempdim;
        if (($dimh[$i] == 1)||($dimh[$i] == 3)||($dimh[$i] == 5)){ //数字1,3,5の場合には実際の石は1(黒)(3,5はアニメGIF処理用)
            $dimi[$i] = 1;
        } elseif (($dimh[$i] == 2)||($dimh[$i] == 4)||($dimh[$i] == 6)) { //数字2,4,6の場合には実際の石は2(白)(4,6はアニメGIF処理用)
            $dimi[$i] = 2;
        } else { //数字0の場合には空白
            $dimi[$i] = 0;
        }
        
    } else { //数字0〜6以外の場合は0を代入(エラー回避用)
        $dimh[$i] = 0;
        $dimi[$i] = 0;
    }
    
    $score[$dimi[$i]] = $score[$dimi[$i]] + 1; //各石の数の合計値計算
}

//石を置ける置けないの判定、石を置ける場合には次の手のリンクを作成
for ($i=0; $i<=63; $i++) { //盤面の石配置データ分ループ
    //その場所に石があるかチェック、あれば石を置けるかどうかの判定処理をしない、なければ判定処理をする
    if ($dimi[$i] == 0) {
        //次の手の配置用の配列変数セット
        $dimn = array_values($dimi);
        $count = 0; //めくれる石の数(カウント)をリセット
        
        //左上に向けて石チェック
        $count_temp = 0; //チェックする列のめくれる石の数(一時カウント)をリセット
        for ($j=$i; $j>=0; $j-=9){
            if ($dimi[$j] == $junban_next) { //他の色があれば一時カウントする
                $count_temp += 1;
            }
            if (($j != $i)&&($dimi[$j] == 0)) { //空白の場合には一時カウントゼロでループ抜ける
                $count_temp = 0;
                break;
            }
            if (($j < 8)||(($j % 8) == 0)){ //上端もしくは左端に到達の場合は一時カウントゼロでループ抜ける(同じ色の場合には一時カウント保持)
                if (($dimi[$j] == $junban)&&($count_temp>0)) { //同じ色で一時カウントが1つ以上ある場合には石をめくる処理
                    for ($k=$j+9; $k<$i; $k+=9){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                } else { //違う色もしくは空白もしくは一時カウントゼロの場合には一時カウントゼロでループ抜ける
                    $count_temp = 0;
                    break;
                }
            }            
            if (($j != $i)&&($dimi[$j] == $junban)){ //同じ色の場合
                if ($count_temp == 0){ //一時カウントゼロの場合にはそのままループ抜ける
                    break;                    
                } else { //一時カウントありの場合には石をめくる処理
                    for ($k=$j+9; $k<$i; $k+=9){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                }
            }
        }
        $count = $count + $count_temp; //一時カウントをカウントに追加
        
        //上に向けて石チェック
        $count_temp = 0; //チェックする列のめくれる石の数(一時カウント)をリセット
        for ($j=$i; $j>=0; $j-=8){
            if ($dimi[$j] == $junban_next) { //他の色があれば一時カウントする
                $count_temp += 1;
            }
            if (($j != $i)&&($dimi[$j] == 0)) { //空白の場合には一時カウントゼロでループ抜ける
                $count_temp = 0;
                break;
            }
            if ($j < 8){ //上端の場合は一時カウントゼロでループ抜ける(同じ色の場合にはカウントする)
                if (($dimi[$j] == $junban)&&($count_temp>0)) { //同じ色で一時カウントが1つ以上ある場合には石をめくる処理
                    for ($k=$j+8; $k<$i; $k+=8){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                } else { //違う色もしくは空白もしくは一時カウントゼロの場合には一時カウントゼロでループ抜ける
                    $count_temp = 0;
                    break;
                }
            }            
            if (($j != $i)&&($dimi[$j] == $junban)){ //同じ色の場合
                if ($count_temp == 0){ //一時カウントゼロの場合にはそのままループ抜ける
                    break;                    
                } else { //一時カウントありの場合には石をめくる処理
                    for ($k=$j+8; $k<$i; $k+=8){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                }
            }
        }
        $count = $count + $count_temp; //一時カウントをカウントに追加

        //右上に向けて石チェック
        $count_temp = 0; //チェックする列のめくれる石の数(一時カウント)をリセット
        for ($j=$i; $j>=0; $j-=7){
            if ($dimi[$j] == $junban_next) { //他の色があれば一時カウントする
                $count_temp += 1;
            }
            if (($j != $i)&&($dimi[$j] == 0)) { //空白の場合には一時カウントゼロでループ抜ける
                $count_temp = 0;
                break;
            }
            if (($j < 8)||(($j % 8) == 7)){ //上端もしくは右端に到達の場合は一時カウントゼロでループ抜ける(同じ色の場合には一時カウント保持)
                if (($dimi[$j] == $junban)&&($count_temp>0)) { //同じ色で一時カウントが1つ以上ある場合には石をめくる処理
                    for ($k=$j+7; $k<$i; $k+=7){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                } else { //違う色もしくは空白もしくは一時カウントゼロの場合には一時カウントゼロでループ抜ける
                    $count_temp = 0;
                    break;
                }
            }            
            if (($j != $i)&&($dimi[$j] == $junban)){ //同じ色の場合
                if ($count_temp == 0){ //一時カウントゼロの場合にはそのままループ抜ける
                    break;                    
                } else { //一時カウントありの場合には石をめくる処理
                    for ($k=$j+7; $k<$i; $k+=7){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                }
            }
        }
        $count = $count + $count_temp; //一時カウントをカウントに追加

        //右に向けて石チェック
        $count_temp = 0; //チェックする列のめくれる石の数(一時カウント)をリセット
        for ($j=$i; $j<=63; $j+=1){
            if ($dimi[$j] == $junban_next) { //他の色があれば一時カウントする
                $count_temp += 1;
            }
            if (($j != $i)&&($dimi[$j] == 0)) { //空白の場合には一時カウントゼロでループ抜ける
                $count_temp = 0;
                break;
            }
            if (($j % 8) == 7){ //右端に到達の場合は一時カウントゼロでループ抜ける(同じ色の場合には一時カウント保持)
                if (($dimi[$j] == $junban)&&($count_temp>0)) { //同じ色で一時カウントが1つ以上ある場合には石をめくる処理
                    for ($k=$j-1; $k>$i; $k-=1){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                } else { //違う色もしくは空白もしくは一時カウントゼロの場合には一時カウントゼロでループ抜ける
                    $count_temp = 0;
                    break;
                }
            }            
            if (($j != $i)&&($dimi[$j] == $junban)){ //同じ色の場合
                if ($count_temp == 0){ //一時カウントゼロの場合にはそのままループ抜ける
                    break;                    
                } else { //一時カウントありの場合には石をめくる処理
                    for ($k=$j-1; $k>$i; $k-=1){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                }
            }
        }
        $count = $count + $count_temp; //一時カウントをカウントに追加  
        
        //右下に向けて石チェック
        $count_temp = 0; //チェックする列のめくれる石の数(一時カウント)をリセット
        for ($j=$i; $j<=63; $j+=9){
            if ($dimi[$j] == $junban_next) { //他の色があれば一時カウントする
                $count_temp += 1;
            }
            if (($j != $i)&&($dimi[$j] == 0)) { //空白の場合には一時カウントゼロでループ抜ける
                $count_temp = 0;
                break;
            }
            if (($j >= 56)||(($j % 8) == 7)){ //下端もしくは右端に到達の場合は一時カウントゼロでループ抜ける(同じ色の場合には一時カウント保持)
                if (($dimi[$j] == $junban)&&($count_temp>0)) { //同じ色で一時カウントが1つ以上ある場合には石をめくる処理
                    for ($k=$j-9; $k>$i; $k-=9){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                } else { //違う色もしくは空白もしくは一時カウントゼロの場合には一時カウントゼロでループ抜ける
                    $count_temp = 0;
                    break;
                }
            }            
            if (($j != $i)&&($dimi[$j] == $junban)){ //同じ色の場合
                if ($count_temp == 0){ //一時カウントゼロの場合にはそのままループ抜ける
                    break;                    
                } else { //一時カウントありの場合には石をめくる処理
                    for ($k=$j-9; $k>$i; $k-=9){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                }
            }
        }
        $count = $count + $count_temp; //一時カウントをカウントに追加
        
        //下に向けて石チェック
        $count_temp = 0; //チェックする列のめくれる石の数(一時カウント)をリセット
        for ($j=$i; $j<=63; $j+=8){
            if ($dimi[$j] == $junban_next) { //他の色があれば一時カウントする
                $count_temp += 1;
            }
            if (($j != $i)&&($dimi[$j] == 0)) { //空白の場合には一時カウントゼロでループ抜ける
                $count_temp = 0;
                break;
            }
            if ($j >= 56){ //下端に到達の場合は一時カウントゼロでループ抜ける(同じ色の場合には一時カウント保持)
                if (($dimi[$j] == $junban)&&($count_temp>0)) { //同じ色で一時カウントが1つ以上ある場合には石をめくる処理
                    for ($k=$j-8; $k>$i; $k-=8){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                } else { //違う色もしくは空白もしくは一時カウントゼロの場合には一時カウントゼロでループ抜ける
                    $count_temp = 0;
                    break;
                }
            }            
            if (($j != $i)&&($dimi[$j] == $junban)){ //同じ色の場合
                if ($count_temp == 0){ //一時カウントゼロの場合にはそのままループ抜ける
                    break;                    
                } else { //一時カウントありの場合には石をめくる処理
                    for ($k=$j-8; $k>$i; $k-=8){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                }
            }
        }
        $count = $count + $count_temp; //一時カウントをカウントに追加     

        //左下に向けて石チェック
        $count_temp = 0; //チェックする列のめくれる石の数(一時カウント)をリセット
        for ($j=$i; $j<=63; $j+=7){
            if ($dimi[$j] == $junban_next) { //他の色があれば一時カウントする
                $count_temp += 1;
            }
            if (($j != $i)&&($dimi[$j] == 0)) { //空白の場合には一時カウントゼロでループ抜ける
                $count_temp = 0;
                break;
            }
            if (($j >= 56)||(($j % 8) == 0)){ //下端もしくは左端に到達の場合は一時カウントゼロでループ抜ける(同じ色の場合には一時カウント保持)
                if (($dimi[$j] == $junban)&&($count_temp>0)) { //同じ色で一時カウントが1つ以上ある場合には石をめくる処理
                    for ($k=$j-7; $k>$i; $k-=7){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                } else { //違う色もしくは空白もしくは一時カウントゼロの場合には一時カウントゼロでループ抜ける
                    $count_temp = 0;
                    break;
                }
            }            
            if (($j != $i)&&($dimi[$j] == $junban)){ //同じ色の場合
                if ($count_temp == 0){ //一時カウントゼロの場合にはそのままループ抜ける
                    break;                    
                } else { //一時カウントありの場合には石をめくる処理
                    for ($k=$j-7; $k>$i; $k-=7){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                }
            }
        }
        $count = $count + $count_temp; //一時カウントをカウントに追加

        //左に向けて石チェック
        $count_temp = 0; //チェックする列のめくれる石の数(一時カウント)をリセット
        for ($j=$i; $j<=63; $j-=1){
            if ($dimi[$j] == $junban_next) { //他の色があれば一時カウントする
                $count_temp += 1;
            }
            if (($j != $i)&&($dimi[$j] == 0)) { //空白の場合には一時カウントゼロでループ抜ける
                $count_temp = 0;
                break;
            }
            if (($j % 8) == 0){ //左端に到達の場合は一時カウントゼロでループ抜ける(同じ色の場合には一時カウント保持)
                if (($dimi[$j] == $junban)&&($count_temp>0)) { //同じ色で一時カウントが1つ以上ある場合には石をめくる処理
                    for ($k=$j+1; $k<$i; $k+=1){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                } else { //違う色もしくは空白もしくは一時カウントゼロの場合には一時カウントゼロでループ抜ける
                    $count_temp = 0;
                    break;
                }
            }            
            if (($j != $i)&&($dimi[$j] == $junban)){ //同じ色の場合
                if ($count_temp == 0){ //一時カウントゼロの場合にはそのままループ抜ける
                    break;                    
                } else { //一時カウントありの場合には石をめくる処理
                    for ($k=$j+1; $k<$i; $k+=1){ //$j終了の1つ前からスタートして逆に進行
                        $dimn[$k] = $junban + 4; //この場所を石をめくるGIFアニメに設定
                    }
                    break;
                }
            }
        }
        $count = $count + $count_temp; //一時カウントをカウントに追加          
        
        //石を置ける場合の最終判定
        if ($count >0) { //1つ以上石が置ける場合には、置けるフラグを立たせる
            $pass_not += 1; //この局ではパスしなくてよいフラグ(置ける場所の数)
            $okeru[$i] = $count; //ここの場所に石をいくつ置けるか
            $dimn[$i] = $junban + 2; //この場所を石を置くGIFアニメに設定
            for ($j=0; $j<=63; $j++) {
                $loc_next[$i] = $loc_next[$i].$dimn[$j]; //次の手の盤面の石配置クエリー作成
            }
        }
    }
}

//コメント表示(勝敗、順番、パスなど)
if ((($score[1] + $score[2]) == 64)||($score[1] == 0)||($score[2] == 0)) { //盤が埋まったら、もしくはどちらかの石がゼロなら終了
    print $p1.' 黒(●)'.$score[1].'個、'.$p2.' 白(○)'.$score[2].'個で、';
    if ($score[1] > $score[2]) {
        print $p1.' 黒(●)の勝ちです!<br>
        ';
    } elseif ($score[1] < $score[2]) {
        print $p2.' 白(○)の勝ちです!<br>
        ';
    } else {
        print '引き分けです!<br>
        ';  
    }
    
    print '<br>
    →<a href="index.html">トップページに戻る</a><br>
    <br>';
    
} else { //盤が埋まっていない場合
    
    if ($pass_not > 0) { //石を置ける場所がある場合
        if ($junban == 1) {
            print $p1.' 黒(●)の順番です。<br>
            ';
        } else {
            print $p2.' 白(○)の順番です。<br>
            ';
        }
    } else { //石を置ける場所がない場合
        for ($i=0; $i<=63; $i++) {
            $loc2 = $loc2.$dimi[$i]; //パス用の石配置作成(アニメGIFを解除)
        }
        if ($junban == 1) {
            print $p1.' 黒(●)の順番ですが<span style="color: red;">置ける場所がありません。</span>
            ';
            if ($pass_his < 1) { //パスが連続でなければクエリーにパス1回目の情報を入れる
                print '<a href="game.php?LOC='.$loc2.'&JUN='.$junban_next.'&MOD='.$mode.'&HAN='.$han.'&PAS=1">パス</a><br>
                '; 
            } else {
                $pass_his = 2; //パスの累積2回、両者手詰まり
            }
        } else {
            print $p2.' 白(○)の順番ですが<span style="color: red;">置ける場所がありません。</span>
            ';
            if ($pass_his < 1) { //パスが連続でなければクエリーにパス1回目の情報を入れる
                print '<a href="game.php?LOC='.$loc2.'&JUN='.$junban_next.'&MOD='.$mode.'&HAN='.$han.'&PAS=1">パス</a><br>
                ';
            } else {
                $pass_his = 2; //パスの累積2回、両者手詰まり
            }
        }   
    }
}

if ($pass_his == 2) { //パス累積2回。両者手詰まりの表示。
    print '<span style="color: red;">両者手詰まりです。</span><br>
    ';
    print $p1.' 黒(●)'.$score[1].'個、'.$p2.' 白(○)'.$score[2].'個で、';
    if ($score[1] > $score[2]) {
        print $p1.' 黒(●)の勝ちです!<br>
        ';
    } elseif ($score[1] < $score[2]) {
        print $p2.' 白(○)の勝ちです!<br>
        ';
    } else {
        print '引き分けです!<br>
        ';  
    }

    print '<br>
    →<a href="index.html">トップページに戻る</a><br>
    <br>';
    
}
    
//盤面と石を表示
$gazo_loc = array(0,0,0); //画像表示用キー定義1(アニメ無し画像はキー0固定)
for ($j=3; $j<=6; $j++) {
    $gazo_loc[$j] = time(); //画像表示用キー定義1(アニメあり画像はキーをタイムタンプ。毎回読み込みでアニメ非動作を防ぐ)
}
for ($i=0; $i<=63; $i++) {
    if (($okeru[$i] > 0)&&($mode <> $junban)) { //石を置ける場合にはリンクあり、そうでない場合にはリンクなし(コンピューターの順番の場合はリンクなし)
            print '<a href="game.php?LOC='.$loc_next[$i].'&JUN='.$junban_next.'&MOD='.$mode.'&HAN='.$han.'"><img src="'.$dimh[$i].'.gif?'.$gazo_loc[$dimh[$i]].'" class="location_okeru"></a>';
    } else {
            print '<img src="'.$dimh[$i].'.gif?'.$gazo_loc[$dimh[$i]].'" class="location">';
    }
    
    if (($i % 8) == 7) { //右端の場合、つまりキーの値を8で割って余り7の場合には改行
        print '<br>
        ';
    }
}

//コンピューター思考(石を置ける所がある場合)
if (($mode == $junban)&&($pass_not > 0)) {
    print '<br>コンピューター思考中…<br>
    ';

    //石を置く優先順位ブロック
    $y1 = array(0,7,56,63); //優先順位1配置(4コーナー)
    $y2 = array(2,5,16,23,40,47,58,61); //優先順位2配置(4辺でコーナーの隣の隣)
    $y3 = array(3,4,24,31,32,39,59,60); //優先順位3配置(4辺でその他の場所)
    $y4 = array(18,19,20,21,26,29,34,37,42,43,44,45); //優先順位4配置(端から3つ目の列)
    $y5 = array(27,28,35,36); //優先順位5配置(中心の4マス-通常は使用されない)
    $y6 = array(10,11,12,13,17,22,25,30,33,38,41,46,50,51,52,53); //優先順位6配置(端から2つ目の列)
    $y71 = array(1,8,9); //優先順位7-1配置(左上コーナーの隣)
    $y72 = array(6,15,14); //優先順位7-2配置(右上コーナーの隣)
    $y73 = array(48,57,49); //優先順位7-3配置(左下コーナーの隣)
    $y74 = array(55,62,54); //優先順位7-4配置(右下コーナーの隣)
    
    $yuusen = array_values($y1); //優先順位用配列定義
    
    //4コーナーのいずれかに自石がある場合には、コーナー隣の優先順位を切り替える
    
    //左上に自石がある場合
    if ($dimi[0] == $junban) {
        $yuusen = array_merge($yuusen,$y71); //コーナー隣を優先
    }
    
    //右上に自石がある場合
    if ($dimi[7] == $junban) {
        $yuusen = array_merge($yuusen,$y72); //コーナー隣を優先
    }  
     
    //左下に自石がある場合
    if ($dimi[56] == $junban) {
        $yuusen = array_merge($yuusen,$y73); //コーナー隣を優先
    }     
    
    //右下に自石がある場合
    if ($dimi[63] == $junban) {
        $yuusen = array_merge($yuusen,$y74); //コーナー隣を優先
    }      

    $yuusen = array_merge($yuusen,$y2,$y3,$y4,$y5,$y6);   
    
    //左上に自石がない場合
    if ($dimi[0] != $junban) {
        $yuusen = array_merge($yuusen,$y71);
    }
    
    //右上に自石がない場合
    if ($dimi[7] != $junban) {
        $yuusen = array_merge($yuusen,$y72);
    }  
     
    //左下に自石がない場合
    if ($dimi[56] != $junban) {
        $yuusen = array_merge($yuusen,$y73);
    }     
    
    //右下に自石がない場合
    if ($dimi[63] != $junban) {
        $yuusen = array_merge($yuusen,$y74);
    } 
    
    $max_key = 0; //めくれる石最大値の場所
    $max_value = 0; //めくれる石最大値
    for ($i=0; $i<=63; $i++) {
    	if ($okeru[$i] > $max_value) { //めくれる石の数が最大値を超えた場合に最大値を更新
    		$max_key = $i;
    		$max_value = $okeru[$i];
    	}
    }

    //コーナーを容易に取られるような斜め石めくりをできるだけ防ぐ(コーナーが空白、コーナーの隣の隣がそれぞれ自石と空白、コーナー斜め隣が敵石の場合、コーナーの隣の隣にできるだけ置かない)
    //左上コーナー
    if(($dimi[0] == 0)&&($dimi[16] == $junban)&&($dimi[9] == $junban_next)) { 
        $location_low = 2; //特定のマス指定
        $key_low = array_search($location_low,$yuusen); //特定のマスの優先順位キー検索
        array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
        array_splice($yuusen,51,0,$location_low); //特定のマスの優先順位下位割り込み
    }
    if(($dimi[0] == 0)&&($dimi[2] == $junban)&&($dimi[9] == $junban_next)) { 
        $location_low = 16; //特定のマス指定
        $key_low = array_search($location_low,$yuusen); //特定のマスの優先順位キー検索
        array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
        array_splice($yuusen,51,0,$location_low); //特定のマスの優先順位下位割り込み
    }
    //右上コーナー
    if(($dimi[7] == 0)&&($dimi[5] == $junban)&&($dimi[14] == $junban_next)) { 
        $location_low = 23; //特定のマス指定
        $key_low = array_search($location_low,$yuusen); //特定のマスの優先順位キー検索
        array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
        array_splice($yuusen,51,0,$location_low); //特定のマスの優先順位下位割り込み
    }
    if(($dimi[7] == 0)&&($dimi[23] == $junban)&&($dimi[14] == $junban_next)) { 
        $location_low = 5; //特定のマス指定
        $key_low = array_search($location_low,$yuusen); //特定のマスの優先順位キー検索
        array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
        array_splice($yuusen,51,0,$location_low); //特定のマスの優先順位下位割り込み
    }
    //左下コーナー
    if(($dimi[56] == 0)&&($dimi[40] == $junban)&&($dimi[49] == $junban_next)) { 
        $location_low = 58; //特定のマス指定
        $key_low = array_search($location_low,$yuusen); //特定のマスの優先順位キー検索
        array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
        array_splice($yuusen,51,0,$location_low); //特定のマスの優先順位下位割り込み
    }
    if(($dimi[56] == 0)&&($dimi[58] == $junban)&&($dimi[49] == $junban_next)) { 
        $location_low = 40; //特定のマス指定
        $key_low = array_search($location_low,$yuusen); //特定のマスの優先順位キー検索
        array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
        array_splice($yuusen,51,0,$location_low); //特定のマスの優先順位下位割り込み
    }
    //右下コーナー
    if(($dimi[63] == 0)&&($dimi[47] == $junban)&&($dimi[54] == $junban_next)) { 
        $location_low = 61; //特定のマス指定
        $key_low = array_search($location_low,$yuusen); //特定のマスの優先順位キー検索
        array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
        array_splice($yuusen,51,0,$location_low); //特定のマスの優先順位下位割り込み
    }
    if(($dimi[63] == 0)&&($dimi[61] == $junban)&&($dimi[54] == $junban_next)) { 
        $location_low = 47; //特定のマス指定
        $key_low = array_search($location_low,$yuusen); //特定のマスの優先順位キー検索
        array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
        array_splice($yuusen,51,0,$location_low); //特定のマスの優先順位下位割り込み
    }
    
    //辺に置けるところであっても、自石と敵石の間には不用意に打たないようにする
    for ($i=2; $i<=5; $i++){ //上辺
        if (($dimi[$i-1]+$dimi[$i+1] == 3)&&($dimi[0]+$dimi[1]+$dimi[2]+$dimi[3]+$dimi[4]+$dimi[5]+$dimi[6]+$dimi[7] == 3)){
            $key_low = array_search($i,$yuusen); //特定のマスの優先順位キー検索
            array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
            array_splice($yuusen,51,0,$i); //特定のマスの優先順位下位割り込み   
        }
    }
    for ($i=58; $i<=61; $i++){ //下辺
        if (($dimi[$i-1]+$dimi[$i+1] == 3)&&($dimi[56]+$dimi[57]+$dimi[58]+$dimi[59]+$dimi[60]+$dimi[61]+$dimi[62]+$dimi[73] == 3)){
            $key_low = array_search($i,$yuusen); //特定のマスの優先順位キー検索
            array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
            array_splice($yuusen,51,0,$i); //特定のマスの優先順位下位割り込み   
        }
    }
    for ($i=16; $i<=40; $i+=8){ //左辺
        if (($dimi[$i-8]+$dimi[$i+8] == 3)&&($dimi[0]+$dimi[8]+$dimi[16]+$dimi[24]+$dimi[32]+$dimi[40]+$dimi[48]+$dimi[56] == 3)){
            $key_low = array_search($i,$yuusen); //特定のマスの優先順位キー検索
            array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
            array_splice($yuusen,51,0,$i); //特定のマスの優先順位下位割り込み   
        }
    }
    for ($i=23; $i<=47; $i+=8){ //右辺
        if (($dimi[$i-8]+$dimi[$i+8] == 3)&&($dimi[7]+$dimi[15]+$dimi[23]+$dimi[31]+$dimi[39]+$dimi[47]+$dimi[55]+$dimi[63] == 3)){
            $key_low = array_search($i,$yuusen); //特定のマスの優先順位キー検索
            array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
            array_splice($yuusen,51,0,$i); //特定のマスの優先順位下位割り込み   
        }
    }    
    
    //コーナーに石が無くても、端一列を全て同じ色にめくれる場合には、コーナー隣を優先する
    if ($dimi[0] == 0){ //左上コーナー
        if (($dimi[1] == 0)&&($dimi[2] == $junban_next)) { //コーナーすぐ右が空白でその右が敵石の場合にループ開始
            $status = 0; //状態フラグ(0.フラグ足りず優先順位変更なし、1.優先順位変更あり、2.優先順位変更あり、3.フラグオーバー優先順位変更なし)
            for ($i=3; $i<=7; $i+=1) { //右方向にループ
                if ($status == 2) { //状態2の場合
                    if ($dimi[$i] > 0){ //空白でない場合状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 1) { //状態1の場合
                    if ($dimi[$i] == 0){ //空白の場合状態を2にする
                        $status = 2;
                    }
                    if ($dimi[$i] == $junban_next){ //敵石なら状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 0){ //状態0の場合
                    if ($dimi[$i] == 0){ //空白ならループ抜ける
                        break;
                    }
                    if ($dimi[$i] == $junban){ //自石なら状態1に変更
                        $status = 1;
                    }               
                }
            }
            if (($status == 1)||($status ==2)) {
                $yuusen[4] = 1; //優先順位の割り込み(コーナーの次に優先)  
            }
            
        }
        if (($dimi[8] == 0)&&($dimi[16] == $junban_next)) { //コーナーすぐ下が空白でその下が敵石の場合にループ開始
            $status = 0; //状態フラグ(0.フラグ足りず優先順位変更なし、1.優先順位変更あり、2.優先順位変更あり、3.フラグオーバー優先順位変更なし)
            for ($i=24; $i<=56; $i+=8) { //下方向にループ
                if ($status == 2) { //状態2の場合
                    if ($dimi[$i] > 0){ //空白でない場合状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 1) { //状態1の場合
                    if ($dimi[$i] == 0){ //空白の場合状態を2にする
                        $status = 2;
                    }
                    if ($dimi[$i] == $junban_next){ //敵石なら状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 0){ //状態0の場合
                    if ($dimi[$i] == 0){ //空白ならループ抜ける
                        break;
                    }
                    if ($dimi[$i] == $junban){ //自石なら状態1に変更
                        $status = 1;
                    }               
                }
            }
            if (($status == 1)||($status ==2)) {
                $yuusen[4] = 8; //優先順位の割り込み(コーナーの次に優先)
            }
            
        }
    }
    if ($dimi[7] == 0){ //右上コーナー
        if (($dimi[6] == 0)&&($dimi[5] == $junban_next)) { //コーナーすぐ左が空白でその左が敵石の場合にループ開始
            $status = 0; //状態フラグ(0.フラグ足りず優先順位変更なし、1.優先順位変更あり、2.優先順位変更あり、3.フラグオーバー優先順位変更なし)
            for ($i=4; $i>=0; $i-=1) { //左方向にループ
                if ($status == 2) { //状態2の場合
                    if ($dimi[$i] > 0){ //空白でない場合状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 1) { //状態1の場合
                    if ($dimi[$i] == 0){ //空白の場合状態を2にする
                        $status = 2;
                    }
                    if ($dimi[$i] == $junban_next){ //敵石なら状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 0){ //状態0の場合
                    if ($dimi[$i] == 0){ //空白ならループ抜ける
                        break;
                    }
                    if ($dimi[$i] == $junban){ //自石なら状態1に変更
                        $status = 1;
                    }               
                }
            }
            if (($status == 1)||($status == 2)) {
                $yuusen[4] = 6; //優先順位の割り込み(コーナーの次に優先)  
            }
            
        }
        if (($dimi[15] == 0)&&($dimi[23] == $junban_next)) { //コーナーすぐ下が空白でその下が敵石の場合にループ開始
            $status = 0; //状態フラグ(0.フラグ足りず優先順位変更なし、1.優先順位変更あり、2.優先順位変更あり、3.フラグオーバー優先順位変更なし)
            for ($i=31; $i<=63; $i+=8) { //下方向にループ
                if ($status == 2) { //状態2の場合
                    if ($dimi[$i] > 0){ //空白でない場合状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 1) { //状態1の場合
                    if ($dimi[$i] == 0){ //空白の場合状態を2にする
                        $status = 2;
                    }
                    if ($dimi[$i] == $junban_next){ //敵石なら状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 0){ //状態0の場合
                    if ($dimi[$i] == 0){ //空白ならループ抜ける
                        break;
                    }
                    if ($dimi[$i] == $junban){ //自石なら状態1に変更
                        $status = 1;
                    }               
                }
            }
            if (($status == 1)||($status == 2)) {
                $yuusen[4] = 15; //優先順位の割り込み(コーナーの次に優先)  
            }
            
        }
    }
    if ($dimi[56] == 0){ //左下コーナー
        if (($dimi[57] == 0)&&($dimi[58] == $junban_next)) { //コーナーすぐ右が空白でその右が敵石の場合にループ開始
            $status = 0; //状態フラグ(0.フラグ足りず優先順位変更なし、1.優先順位変更あり、2.優先順位変更あり、3.フラグオーバー優先順位変更なし)
            for ($i=59; $i<=63; $i+=1) { //右方向にループ
                if ($status == 2) { //状態2の場合
                    if ($dimi[$i] > 0){ //空白でない場合状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 1) { //状態1の場合
                    if ($dimi[$i] == 0){ //空白の場合状態を2にする
                        $status = 2;
                    }
                    if ($dimi[$i] == $junban_next){ //敵石なら状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 0){ //状態0の場合
                    if ($dimi[$i] == 0){ //空白ならループ抜ける
                        break;
                    }
                    if ($dimi[$i] == $junban){ //自石なら状態1に変更
                        $status = 1;
                    }               
                }
            }
            if (($status == 1)||($status ==2)) {
                $yuusen[4] = 57; //優先順位の割り込み(コーナーの次に優先)  
            }
            
        }
        if (($dimi[48] == 0)&&($dimi[40] == $junban_next)) { //コーナーすぐ上が空白でその上が敵石の場合にループ開始
            $status = 0; //状態フラグ(0.フラグ足りず優先順位変更なし、1.優先順位変更あり、2.優先順位変更あり、3.フラグオーバー優先順位変更なし)
            for ($i=32; $i>=0; $i-=8) { //上方向にループ
                if ($status == 2) { //状態2の場合
                    if ($dimi[$i] > 0){ //空白でない場合状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 1) { //状態1の場合
                    if ($dimi[$i] == 0){ //空白の場合状態を2にする
                        $status = 2;
                    }
                    if ($dimi[$i] == $junban_next){ //敵石なら状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 0){ //状態0の場合
                    if ($dimi[$i] == 0){ //空白ならループ抜ける
                        break;
                    }
                    if ($dimi[$i] == $junban){ //自石なら状態1に変更
                        $status = 1;
                    }               
                }
            }
            if (($status == 1)||($status ==2)) {
                $yuusen[4] = 48; //優先順位の割り込み(コーナーの次に優先)
            }
            
        }
    }
    if ($dimi[63] == 0){ //右下コーナー
        if (($dimi[62] == 0)&&($dimi[61] == $junban_next)) { //コーナーすぐ左が空白でその左が敵石の場合にループ開始
            $status = 0; //状態フラグ(0.フラグ足りず優先順位変更なし、1.優先順位変更あり、2.優先順位変更あり、3.フラグオーバー優先順位変更なし)
            for ($i=60; $i>=56; $i-=1) { //左方向にループ
                if ($status == 2) { //状態2の場合
                    if ($dimi[$i] > 0){ //空白でない場合状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 1) { //状態1の場合
                    if ($dimi[$i] == 0){ //空白の場合状態を2にする
                        $status = 2;
                    }
                    if ($dimi[$i] == $junban_next){ //敵石なら状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 0){ //状態0の場合
                    if ($dimi[$i] == 0){ //空白ならループ抜ける
                        break;
                    }
                    if ($dimi[$i] == $junban){ //自石なら状態1に変更
                        $status = 1;
                    }               
                }
            }
            if (($status == 1)||($status == 2)) {
                $yuusen[4] = 62; //優先順位の割り込み(コーナーの次に優先)  
            }
            
        }
        if (($dimi[55] == 0)&&($dimi[47] == $junban_next)) { //コーナーすぐ上が空白でその上が敵石の場合にループ開始
            $status = 0; //状態フラグ(0.フラグ足りず優先順位変更なし、1.優先順位変更あり、2.優先順位変更あり、3.フラグオーバー優先順位変更なし)
            for ($i=39; $i>=7; $i-=8) { //上方向にループ
                if ($status == 2) { //状態2の場合
                    if ($dimi[$i] > 0){ //空白でない場合状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 1) { //状態1の場合
                    if ($dimi[$i] == 0){ //空白の場合状態を2にする
                        $status = 2;
                    }
                    if ($dimi[$i] == $junban_next){ //敵石なら状態3にしてループ抜ける
                        $status = 3;
                        break;
                    }  
                }
                if ($status == 0){ //状態0の場合
                    if ($dimi[$i] == 0){ //空白ならループ抜ける
                        break;
                    }
                    if ($dimi[$i] == $junban){ //自石なら状態1に変更
                        $status = 1;
                    }               
                }
            }
            if (($status == 1)||($status == 2)) {
                $yuusen[4] = 55; //優先順位の割り込み(コーナーの次に優先)  
            }
            
        }
    }
    
    //最後3マスでは石をより多くめくれる場所を優先する
    if (($score[1] + $score[2]) >= 61) {
		if ($max_value > 0) { //優先順位の割り込み(コーナーの次に優先)
			$yuusen[4] = $max_key;
        }
	}
    
    //最後の1枚になってしまった場合に、次の手で全てめくられてしまうような所には極力置かない
    if ($score[$junban] == 1) {
        for ($i=0; $i<=63; $i++) { //最後の1枚の場所チェック
            if ($dimi[$i] == $junban) {
                $saigo_place = $i; //最後の1枚の場所代入
                break;
            } 
        }
        //左上に向けてチェック
        $checker = 0; //チェッカー
        if (($saigo_place>7)||($saigo_place<56)||($saigo_place % 8 == 0)||($saigo_place % 8 == 7)) { //端でなければ、打たないべきかのチェック
            if ($dimi[$saigo_place+9] == $junban_next){ //反対側に敵石あればフラグ+1
                $checker = $checker + 1;
            }        
            for ($i=$saigo_place; $i>=0; $i=$i-9) {
                if ($dimi[$i] == 0) { //空白が見つかった場合
                    if ($i == $saigo_place - 9) { //自石のすぐ左上に空白があった場合はループ抜ける
                        $checker = 0;
                        break; 
                    } else {
                        if ($dimi[$i-9] == $junban_next) { //さらにそのすぐ左上に敵石があればフラグ+1
                            $checker = $checker + 1;
                            break;
                        } else{
                            break;    
                        }
                    }
                } elseif (($i <= 7)||($i % 8 == 0)) { //左または上の端まで空白が無い場合にはフラグ2(優先下げる処理しない)
                    $checker = 2;
                    break;
                }
            }
            if ($checker == 1) { //めくった後、片側の端にのみ敵石があり、反対側に空白があるような場合には、めくった後に全てめくり返されるので、優先順位を一番下に下げる。
                $key_low = array_search($i,$yuusen); //特定のマスの優先順位キー検索
                array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
                array_splice($yuusen,63,0,$i); //特定のマスの優先順位下位割り込み                
            }
            
        }
        //上に向けてチェック
        $checker = 0; //チェッカー
        if (($saigo_place>7)||($saigo_place<56)) { //一番上か一番下の行でなければ、打たないべきかのチェック
            if ($dimi[$saigo_place+8] == $junban_next){ //反対側に敵石あればフラグ+1
                $checker = $checker + 1;
            }        
            for ($i=$saigo_place; $i>=0; $i=$i-8) {
                if ($dimi[$i] == 0) { //空白が見つかった場合
                    if ($i == $saigo_place - 8) { //自石のすぐ上に空白があった場合はループ抜ける
                        $checker = 0;
                        break; 
                    } else {
                        if ($dimi[$i-8] == $junban_next) { //さらにそのすぐ上に敵石があればフラグ+1
                            $checker = $checker + 1;
                            break;
                        } else{
                            break;    
                        }
                    }
                } elseif ($i <= 7) { //上の端まで空白が無い場合にはフラグ2(優先下げる処理しない)
                    $checker = 2;
                    break;
                }
            }
            if ($checker == 1) { //めくった後、片側の端にのみ敵石があり、反対側に空白があるような場合には、めくった後に全てめくり返されるので、優先順位を一番下に下げる。
                $key_low = array_search($i,$yuusen); //特定のマスの優先順位キー検索
                array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
                array_splice($yuusen,63,0,$i); //特定のマスの優先順位下位割り込み                
            }
            
        }
        //右上に向けてチェック
        $checker = 0; //チェッカー
        if (($saigo_place>7)||($saigo_place<56)||($saigo_place % 8 == 0)||($saigo_place % 8 == 7)) { //端でなければ、打たないべきかのチェック
            if ($dimi[$saigo_place+7] == $junban_next){ //反対側に敵石あればフラグ+1
                $checker = $checker + 1;
            }        
            for ($i=$saigo_place; $i>=0; $i=$i-7) {
                if ($dimi[$i] == 0) { //空白が見つかった場合
                    if ($i == $saigo_place - 7) { //自石のすぐ右上に空白があった場合はループ抜ける
                        $checker = 0;
                        break; 
                    } else {
                        if ($dimi[$i-7] == $junban_next) { //さらにそのすぐ右上に敵石があればフラグ+1
                            $checker = $checker + 1;
                            break;
                        } else{
                            break;    
                        }
                    }
                } elseif (($i <= 7)||($i % 8 == 7)) { //右または下の端まで空白が無い場合にはフラグ2(優先下げる処理しない)
                    $checker = 2;
                    break;
                }
            }
            if ($checker == 1) { //めくった後、片側の端にのみ敵石があり、反対側に空白があるような場合には、めくった後に全てめくり返されるので、優先順位を一番下に下げる。
                $key_low = array_search($i,$yuusen); //特定のマスの優先順位キー検索
                array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
                array_splice($yuusen,63,0,$i); //特定のマスの優先順位下位割り込み                
            }
            
        }
        //右に向けてチェック
        $checker = 0; //チェッカー
        if (($saigo_place % 8 == 0)||($saigo_place % 8 == 7)) { //一番左か一番右の列でなければ、打たないべきかのチェック
            if ($dimi[$saigo_place-1] == $junban_next){ //反対側に敵石あればフラグ+1
                $checker = $checker + 1;
            }        
            for ($i=$saigo_place; $i<=63; $i=$i+1) {
                if ($dimi[$i] == 0) { //空白が見つかった場合
                    if ($i == $saigo_place + 1) { //自石のすぐ右に空白があった場合はループ抜ける
                        $checker = 0;
                        break; 
                    } else {
                        if ($dimi[$i+1] == $junban_next) { //さらにそのすぐ右に敵石があればフラグ+1
                            $checker = $checker + 1;
                            break;
                        } else{
                            break;    
                        }
                    }
                } elseif ($i % 8 == 7) { //右の端まで空白が無い場合にはフラグ2(優先下げる処理しない)
                    $checker = 2;
                    break;
                }
            }
            if ($checker == 1) { //めくった後、片側の端にのみ敵石があり、反対側に空白があるような場合には、めくった後に全てめくり返されるので、優先順位を一番下に下げる。
                $key_low = array_search($i,$yuusen); //特定のマスの優先順位キー検索
                array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
                array_splice($yuusen,63,0,$i); //特定のマスの優先順位下位割り込み                
            }
            
        }
        //右下に向けてチェック
        $checker = 0; //チェッカー
        if (($saigo_place>7)||($saigo_place<56)||($saigo_place % 8 == 0)||($saigo_place % 8 == 7)) { //端でなければ、打たないべきかのチェック
            if ($dimi[$saigo_place-9] == $junban_next){ //反対側に敵石あればフラグ+1
                $checker = $checker + 1;
            }        
            for ($i=$saigo_place; $i<=63; $i=$i+9) {
                if ($dimi[$i] == 0) { //空白が見つかった場合
                    if ($i == $saigo_place + 9) { //自石のすぐ右下に空白があった場合はループ抜ける
                        $checker = 0;
                        break; 
                    } else {
                        if ($dimi[$i+9] == $junban_next) { //さらにそのすぐ右下に敵石があればフラグ+1
                            $checker = $checker + 1;
                            break;
                        } else{
                            break;    
                        }
                    }
                } elseif (($i >= 56)||($i % 8 == 7)) { //右または下の端まで空白が無い場合にはフラグ2(優先下げる処理しない)
                    $checker = 2;
                    break;
                }
            }
            if ($checker == 1) { //めくった後、片側の端にのみ敵石があり、反対側に空白があるような場合には、めくった後に全てめくり返されるので、優先順位を一番下に下げる。
                $key_low = array_search($i,$yuusen); //特定のマスの優先順位キー検索
                array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
                array_splice($yuusen,63,0,$i); //特定のマスの優先順位下位割り込み                
            }
            
        }
        //下に向けてチェック
        $checker = 0; //チェッカー
        if (($saigo_place>7)||($saigo_place<56)) { //一番上か一番下の行でなければ、打たないべきかのチェック
            if ($dimi[$saigo_place-8] == $junban_next){ //反対側に敵石あればフラグ+1
                $checker = $checker + 1;
            }        
            for ($i=$saigo_place; $i<=63; $i=$i+8) {
                if ($dimi[$i] == 0) { //空白が見つかった場合
                    if ($i == $saigo_place + 8) { //自石のすぐ下に空白があった場合はループ抜ける
                        $checker = 0;
                        break; 
                    } else {
                        if ($dimi[$i+8] == $junban_next) { //さらにそのすぐ下に敵石があればフラグ+1
                            $checker = $checker + 1;
                            break;
                        } else{
                            break;    
                        }
                    }
                } elseif ($i >= 56) { //下の端まで空白が無い場合にはフラグ2(優先下げる処理しない)
                    $checker = 2;
                    break;
                }
            }
            if ($checker == 1) { //めくった後、片側の端にのみ敵石があり、反対側に空白があるような場合には、めくった後に全てめくり返されるので、優先順位を一番下に下げる。
                $key_low = array_search($i,$yuusen); //特定のマスの優先順位キー検索
                array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
                array_splice($yuusen,63,0,$i); //特定のマスの優先順位下位割り込み                
            }
            
        }
        //左下に向けてチェック
        $checker = 0; //チェッカー
        if (($saigo_place>7)||($saigo_place<56)||($saigo_place % 8 == 0)||($saigo_place % 8 == 7)) { //端でなければ、打たないべきかのチェック
            if ($dimi[$saigo_place-7] == $junban_next){ //反対側に敵石あればフラグ+1
                $checker = $checker + 1;
            }        
            for ($i=$saigo_place; $i<=63; $i=$i+7) {
                if ($dimi[$i] == 0) { //空白が見つかった場合
                    if ($i == $saigo_place + 7) { //自石のすぐ左下に空白があった場合はループ抜ける
                        $checker = 0;
                        break; 
                    } else {
                        if ($dimi[$i+7] == $junban_next) { //さらにそのすぐ左下に敵石があればフラグ+1
                            $checker = $checker + 1;
                            break;
                        } else{
                            break;    
                        }
                    }
                } elseif (($i >= 56)||($i % 8 == 0)) { //左または下の端まで空白が無い場合にはフラグ2(優先下げる処理しない)
                    $checker = 2;
                    break;
                }
            }
            if ($checker == 1) { //めくった後、片側の端にのみ敵石があり、反対側に空白があるような場合には、めくった後に全てめくり返されるので、優先順位を一番下に下げる。
                $key_low = array_search($i,$yuusen); //特定のマスの優先順位キー検索
                array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
                array_splice($yuusen,63,0,$i); //特定のマスの優先順位下位割り込み                
            }
            
        }
        //左に向けてチェック
        $checker = 0; //チェッカー
        if (($saigo_place % 8 == 0)||($saigo_place % 8 == 7)) { //一番左か一番右の列でなければ、打たないべきかのチェック
            if ($dimi[$saigo_place+1] == $junban_next){ //反対側に敵石あればフラグ+1
                $checker = $checker + 1;
            }        
            for ($i=$saigo_place; $i>=0; $i=$i-1) {
                if ($dimi[$i] == 0) { //空白が見つかった場合
                    if ($i == $saigo_place - 1) { //自石のすぐ左に空白があった場合はループ抜ける
                        $checker = 0;
                        break; 
                    } else {
                        if ($dimi[$i-1] == $junban_next) { //さらにそのすぐ左に敵石があればフラグ+1
                            $checker = $checker + 1;
                            break;
                        } else{
                            break;    
                        }
                    }
                } elseif ($i % 8 == 0) { //右の端まで空白が無い場合にはフラグ2(優先下げる処理しない)
                    $checker = 2;
                    break;
                }
            }
            if ($checker == 1) { //めくった後、片側の端にのみ敵石があり、反対側に空白があるような場合には、めくった後に全てめくり返されるので、優先順位を一番下に下げる。
                $key_low = array_search($i,$yuusen); //特定のマスの優先順位キー検索
                array_splice($yuusen,$key_low,1); //特定のマスの優先順位キー削除
                array_splice($yuusen,63,0,$i); //特定のマスの優先順位下位割り込み                
            }
            
        }
       
    }
    
    //相手の石を全てめくれる場合は、その場所を優先する
    if ($score[$junban_next] == $max_value) {
        if ($max_value > 0) { //優先順位の割り込み(最優先)
            $yuusen[0] = $max_key; 
        }
    }

    //コンピューターの次の手のリンク、もしくは次の手でページリフレッシュ
    for ($i=0; $i<=63; $i++) {
        if ($okeru[$yuusen[$i]] > 0) {
            print '※画面が切り替わらない場合には、<a href="game.php?LOC='.$loc_next[$yuusen[$i]].'&JUN='.$junban_next.'&MOD='.$mode.'&HAN='.$han.'">ここ</a>をクリック。<br><br>
            ';
            print '<meta http-equiv="refresh" content="3;URL=game.php?LOC='.$loc_next[$yuusen[$i]].'&JUN='.$junban_next.'&MOD='.$mode.'&HAN='.$han.'">
            ';
            break;
        }
    }
} 
    
?>

スポンサードリンク


トップページに戻る

PHP REVERSI』- 製作: 小川 邦久 / ご意見・ご感想 / プライバシーポリシー
Copyright (C) 2016 KUNISAN.JP. All Rights Reserved.