かんたん作成【HTML CSS JavaScript PHP CGI Perl Ruby Python .htaccess】

リバーシ(ボードゲーム)

#! /usr/local/bin/perl

loadForm();        #フォームデータ取り込み

loadData();        #データ処理

printData();        #HTML出力

exit;


#====================================================================#データ処理
sub    loadData
{
    my    ($i, $max, $no, $color);
    if($FORM{'lv'} eq "") {
        $FORM{'lv'} = "1";
    }
    if($FORM{'data'}) {
        $DATA = $FORM{'data'};
        if($FORM{'no'} eq "" or $FORM{'no'} eq "pass") {    #コンピュータの一手
            $NEXT = "use";
            if($FORM{'no'} eq "pass") {            #パスの場合 手詰りチェック
                for($i = 0 ; $i < length($DATA) ; $i++) {
                    if(substr($DATA, $i, 1) eq "0" and changeData($i, $FORM{'color'})) {
                        $MSG = "エラー:パスできません。";
                        return;
                    }
                }
            }
            if($FORM{'color'} eq "1") {
                $color = "2";
            }
            else {
                $color = "1";
            }
            for($i = 0 ; $i < length($DATA) ; $i++) {
                if(substr($DATA, $i, 1) eq "0") {    #反転枚数チェック
                    my    $count = changeData($i, $color);
                    if($count > 0) {
                        $count = checkLv($i, $color, $count);    #レベルごとの評価
                        $count += (rand 0.1);
                        if($count > $max) {    #反転枚数最大チェック
                            $max = $count;
                            $no = $i;
                        }
                    }
                }
            }
            if($no eq "") {                    #手詰りの場合 パス
                if($FORM{'no'} eq "pass") {
                    gameOver();            #互いにパスの場合 ゲームオーバー
                }
                else {
                    $MSG = "コンピュータ:パス";
                }
                return;
            }
            else {
                changeData($no, $color, 1);        #ひっくり返す
            }
        }
        else {                            #プレイヤーの一手
            $NEXT = "com";
            if(!changeData($FORM{'no'}, $FORM{'color'}, 1)) {    #ひっくり返す(枚数チェック)
                $NEXT = "use";                #0枚の場合 エラー
                $DATA = $FORM{'data'};
                $MSG = "エラー:手詰りの場合パスしてください。";
                return;
            }
        }
        if(!($DATA =~ /0/) or !($DATA =~ /1/) or !($DATA =~ /2/)) {
            gameOver();                    #ゲームオーバー
        }
    }
    else {                                #ゲームスタート
        $DATA =    "0000000000000000000000000001200000021000000000000000000000000000";
        $FORM{'color'} = int(rand 2) + 1;            #色を決める
        if($FORM{'color'} == 1) {                #2が先手(白)
            $NEXT = "com";
        }
        else {
            $NEXT = "use";
        }
    }
}

#====================================================================レベルごとの評価
sub    checkLv
{
    my    ($i, $j);
    my    @check = (    [0, 1, 8, 9],        [7, 6, 14, 15],
                [56, 48, 49, 57],    [63, 54, 55, 62]    );    #チェック箇所
    if($FORM{'lv'} eq "2" or $FORM{'lv'} eq "3") {    #レベル2・3
        for($i = 0 ; $i < @check ; $i++) {
            if($_[0] == $check[$i][0]) {
                $_[2] += 4;                #プラス評価
                return $_[2];
            }
            if($FORM{'lv'} eq "3") {    #レベル3
                for($j = 1 ; $check[$i][$j] ; $j++) {
                    if($_[0] == $check[$i][$j]) {
                        if(substr($DATA, $check[$i][0], 1) eq $_[1]) {
                            $_[2] += 3;    #プラス評価
                        }
                        elsif(substr($DATA, $check[$i][0], 1) eq "0") {
                            $_[2] /= 5;    #マイナス評価
                        }
                        else {
                            $_[2] /= 2;    #マイナス評価
                        }
                        return $_[2];
                    }
                }
            }
        }
    }
    return $_[2];
}

#====================================================================反転・枚数チェック
sub    changeData
{
    my    ($i, $n, $count);
    my    @check = (-9, -1, 7, 8, -8, -7, 1, 9);            #チェック箇所
    if($_[2]) {
        substr($DATA, $_[0], 1, $_[1]);                #反転
    }
    for($i = 0 ; $i < @check ; $i++) {                #反転箇所を探す
        for($n = $_[0] + $check[$i] ;; $n += $check[$i]) {
            if($i <= 2 and $n % 8 == 7) {
                last;
            }
            if($i >= 5 and $n % 8 == 0) {
                last;
            }
            if($n < 0 or $n >= length($DATA)) {
                last;
            }
            if(substr($DATA, $n, 1) eq "0") {
                last;
            }
            if(substr($DATA, $n, 1) eq $_[1]) {
                for($n -= $check[$i] ; $n != $_[0] ; $n -= $check[$i]) {
                    if($_[2]) {
                        substr($DATA, $n, 1, $_[1]);    #反転
                    }
                    $count++;            #反転枚数+1
                }
                last;
            }
        }
    }
    return $count;                            #反転枚数を返す
}

#====================================================================ゲームオーバー・点数集計
sub    gameOver
{
    my    ($i, $com, %point);
    my    $use = $FORM{'color'};
    $NEXT = "end";
    if($use eq "1") {
        $com = "2";
    }
    else {
        $com = "1";
    }
    for($i = 0 ; $i < length($DATA) ; $i++) {            #点数集計
        $point{substr($DATA, $i, 1)}++;
    }
    if($point{$use} > $point{$com}) {                #勝敗チェック
        $MSG = "WIN"
    }
    elsif($point{$use} < $point{$com}) {
        $MSG = "LOSE"
    }
    else {
        $MSG = "DRAW"
    }
    $MSG .= sprintf(" %d − %d", $point{$use}, $point{$com});
}

#====================================================================HTML出力
sub    printData
{
    if($FORM{'color'} eq "1") {
        $USE    = "●";
        $COM    = "<font color=\"#ffffff\">●</font>"; 
    }
    else {
        $USE    = "<font color=\"#ffffff\">●</font>";
        $COM    = "●"; 
    }
    print qq(Content-type: text/html; charset=Shift_JIS\n\n);
    print <<"    END";
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html>
        <head>
    END
    if($NEXT eq "com") {
        print <<"        END";
            <meta http-equiv="refresh"
             content="2;url=$ENV{'SCRIPT_NAME'}?data=$DATA&color=$FORM{'color'}&lv=$FORM{'lv'}">
        END
    }
    print <<"    END";
        <title>リバーシ</title>
        <style type="text/css">
        <!-- 
            table    { margin-bottom:10px; width:400px; background:#6c6; border:1px solid #666 }
            th    { padding:3px; background:#99f }
            td    { width:12%; height:50px; font-size:40px; text-align:center; border:1px solid #666 }
            td a    { width:100%; height:100% }
            a    { text-decoration:none }
            .msg    { padding:3px; color:red; font-size:25px; font-weight:bold; text-align:center }
        //-->
        </style>
        </head>
        <body>
        <table cellspacing="0" align="center">
        <tr>
        <th colspan="4" align="left"></th>
        <th colspan="4" align="right">
    END
    if($NEXT eq "com") {
        print <<"        END";
            <a href="$ENV{'SCRIPT_NAME'}?data=$DATA&color=$FORM{'color'}&lv=$FORM{'lv'}">コンピュータ</a>
        END
    }
    else {
        print <<"        END";
            コンピュータ
        END
    }
    print <<"    END";
            [ Lv$FORM{'lv'} ] $COM
        </th>
        </tr>
        </table>
        <table cellspacing="0" align="center">
    END
    for($i = 0 ; $i < length($DATA) ; $i++) {
        if($i % 8 == 0) {
            print qq(<tr>\n);
        }
        if(substr($DATA, $i, 1) eq "0") {
            if($NEXT eq "use") {
                print <<"                END";
                    <td>
                    <a href="$ENV{'SCRIPT_NAME'}?data=$DATA&color=$FORM{'color'}&lv=$FORM{'lv'}&no=$i"> </a>
                    </td>
                END
            }
            else {
                print <<"                END";
                    <td> </td>
                END
            }
        }
        elsif(substr($DATA, $i, 1) eq $FORM{'color'}) {
            print qq(<td>$USE</td>\n);
        }
        else {
            print qq(<td>$COM</td>\n);
        }
        if(($i + 1) % 8 == 0) {
            print qq(</tr>\n);
        }
    }
    print <<"    END";
        </table>
        <table cellspacing="0" align="center">
        <tr>
        <th colspan="4" align="left">$USE プレイヤー</th>
        <th colspan="4" align="right">
        [
    END
    if($NEXT eq "use") {
        print <<"        END";
            <a href="$ENV{'SCRIPT_NAME'}?data=$DATA&color=$FORM{'color'}&lv=$FORM{'lv'}&no=pass">
            パス
            </a>
        END
    }
    else {
        print <<"        END";
            パス
        END
    }
    print <<"    END";
        ]
        [再スタート
        <a href="$ENV{'SCRIPT_NAME'}">Lv1</a>
        <a href="$ENV{'SCRIPT_NAME'}?lv=2">Lv2</a>
        <a href="$ENV{'SCRIPT_NAME'}?lv=3">Lv3</a>
        ]
        </th>
        </tr>
        </table>
        <div class="msg">$MSG</div>
        </body>
        </html>
    END
}

#====================================================================フォームデータ取り込み
sub    loadForm
{
    my    ($query, $pair);
    if($ENV{'REQUEST_METHOD'} eq 'POST') {
        read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
    }
    else {
        $query = $ENV{'QUERY_STRING'};
    }
    foreach $pair (split(/&/, $query)) {
        my    ($key, $value) = split(/=/, $pair);
        $value =~ tr/+/ /;
        $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
        $FORM{$key} = $value;
    }
}
CGI(Perl)
Hello world ! ユーザーエージェント取得・表示($ENV{'HTTP_USER_AGENT'})
IPアドレス取得・表示($ENV{'REMOTE_ADDR'}) リンク元取得・表示($ENV{'HTTP_REFERER'})
URL取得・表示($ENV{'HTTP_HOST'}, $ENV{'REQUEST_URI'}) 環境変数を全て表示(%ENV)
ホスト名取得・表示(gethostbyaddr) 訪問者のプロバイダーを表示
訪問者の都道府県を取得・表示 日付を表示(localtime time)
日付を画像表示(localtime time, substr) アクセス日時を表示(localtime time)
指定の日までの日数を表示 曜日によって背景色を変える
日によって背景色を変える 月によって背景色を変える
見るたびに背景色を変える 見るたびに背景画像を変える
おみくじ(rand, int) カラーチャート
Shift_JIS文字コード表 UTF-8文字コード表
グラフ(横棒グラフ) アクセスカウンター
アクセスカウンター(画像) アクセスカウンター(今日・昨日)
訪問回数(クッキー, $ENV{'HTTP_COOKIE'}, Set-Cookie) アクセスログ保存
アクセスログ集計 パスワード認証
クッションページ($ENV{'QUERY_STRING'}) クッションページ($ENV{'PATH_INFO'})
フォーム入力内容をクッキーに保存 1つのCGIでフレームページを表示
IPアドレスからホスト名を取得(gethostbyaddr) ホスト名からIPアドレスを取得(gethostbyname)
IPアドレスからプロバイダーを取得 IPアドレスから都道府県を取得
文章中の文字列を別の文字列に一括変換 カレンダー
カレンダー(前月・次月へのリンク付) カレンダー(今年1月〜12月)
掲示板 掲示板(URL自動変換/連続改行・スペース削除)
掲示板(年齢・性別・都道府県選択) 画像アップロード掲示板
チャット Web日記
サイトマップ(ディレクトリ内のファイルを調べる) Webデータ取得(HTTPヘッダー, HTMLソース, use Socket)
Webデータ取得(HTTPヘッダー, HTMLソース, use HTTP::Request::Common) トラックバック受信
トラックバック送信 メール送信(メールフォーム, sendmail)
リバーシ(ボードゲーム) .htaccessユーザー認証用ユーザーファイル作成
リダイレクト 条件指定リダイレクト
言語振り分けリダイレクト 条件指定アクセス拒否(ステータスコードを返す)
HTMLファイル読み込み・表示 HTMLファイル読み込み・パスワード認証
HTMLファイル読み込み・条件指定アクセス拒否 HTMLファイル読み込み・条件指定リダイレクト
外部CGIファイル読み込み(require) 画像ファイル読み込み・表示
画像縮小・拡大・サイズ変更(Image::Magick, Resize) 画像切り出し(Image::Magick, Crop)
画像文字埋め込み(Image::Magick, Annotate) 画像合成(Image::Magick, Composite)
画像生成・保存(Image::Magick->new) 画像合成アクセスカウンター
かんたん作成【HTML CSS JavaScript PHP CGI Perl Ruby Python .htaccess】