#!/usr/local/bin/perl

#↑perlのパスを自分の環境に合わせて書き直します。
#大抵は、「#!/usr/bin/perl」　か　「#!/usr/local/bin/perl」です。
#解らない場合はサーバー管理者(もしくはプロバイダー)に
#確認してください。

require './jcode.pl';

##########################################################################
# Key-Boader Ver1.0 [キーボード早打ちタイムトライアル] (Since:2000/02/01)
#   (C) 2000 by yomi
#   Eメール: yomi@pekori.to
#   ホームページ: http://yomi.pekori.to/
##########################################################################


## ---[注意事項]------------------------------------------------------------+
## 1. このスクリプトはフリーソフトです。このスクリプトを使用したいかなる損害に
##    対して作者は一切の責任を負いません。
## 2. 設置に関する質問は掲示板にお願いいたします。メールによる質問には
##    お答えできません。
## 3. このスクリプトを使用した時点で利用規約(kiyaku.txt)を
##    承認したものとみなさせていただきます。
##    ご使用になる前に必ずお読みください。
## -------------------------------------------------------------------------+

#------------------↓ここから設定↓---------------------#

#スクリプト名（又はパス）
$script = 'key.cgi';

#戻るホームページ（URL又はパス）
$home = 'http://www2.freeweb.ne.jp/~magubbs/main.html';

#記録ログファイル名
$log1 = 'key1.log'; #レベル１用
$log2 = 'key2.log'; #レベル２用
$log3 = 'key3.log'; #レベル３用


#禁止ワード
#この中に記入してほしくない「名前」「タイトル」「URL」を記入してください。
#例にならっていくつでも増やすことができます。
@w_check = ("禁止ワード１","禁止ワード２","禁止ワード３");


#問題に出す文字(４６文字)
#46文字に固定していれば漢字などを使うこともできます。(ただし全角文字のみ)
#メタ文字(ソ,申,十,表,・・・などの文字化けを起こす文字)は使えません。

#レベル１
@moji = ("い","し","づ","か","た","け","だ","な","ざ","わ","や","ん","ほ","み","ょ","が","ず","ぁ","ぽ","さ","ま","こ","ば","と","く","ら","ゆ","も","り","て","る","を","ぞ","の","じ","な","が","げ","め","え","う","に","ぶ","ふ","ご","め");

#レベル２
@moji2 = ("石","塚","本","並","小","針","米","山","中","沢","林","武","田","北","澤","森","小","林","杉","山","山","田","高","木","吾","妻","池","端","岩","本","西","田","中","沢","桜","井","矢","野","飯","尾","長","田","野","田","広","長");

#レベル３
@moji3 = ("鉉","錫","瑠","偉","吾","妻","根","占","村","主","御","厨","前","園","明","神","鏑","慶","興","津","箕","輪","主","税","松","木","豪","隼","藤","川","輝","雄","菊","原","尾","崎","柱","谷","加","藤","真","弥","石","川","菊","地");

#ランキングを残す順位
#[例]15位まで残したければ「15」を入力します。
$rank_data = '20';


#------------------↑ここまで設定↑---------------------#
$times = time();
&form_decode;
if ($mode eq 'kaito') { &kaito; }
if ($mode eq 'play') { &play; }
&index_html;

sub index_html {
&header("Key-Boader");
print <<"EOM";
<table border bgcolor=white><tr><td><a href="$home">ホームに戻る</a></td></tr></table>
<center><img src="key.gif" width=307 height=115>
<br><br>
<table width="90%" bgcolor=white border>
<tr><td>
<ul><br>
<li> ２０個の漢字が出てきますので何秒で打つことができるかを競うゲームです。。
<li> 時間をかければ誰でも正解できますので解答時間がポイントになります。
<li> 【<b>主な効能\</b>】キーボードを打つのが速くなるかも(^^;
<li> ホームページアドレスも記入できますので良い成績を残せばいつまでも宣伝になります♪
<br>（このＵＲＬは自分のページでなくても結構\です。また記入も任意です。）
</ul>
</td>
</tr>
</table>
<br>
<table><tr><td>
<form action="$script" method=post>
お名前（ハンドルネーム可）：<input type=text name="r_name" size=15><input type=hidden name=mode value=play>
<br>ホームページのＵＲＬ：<input type=text name=url value="http://" size=30>[任意]<br>ホームページのタイトル：<input type=text name=title size=30>[任意]<br>
難易度：<select name=revel><option value=1>レベル1(やさしい)<option value=2>レベル2(ふつう)<option value=3>レベル3(むずかしい)<select><br>
<center><input type=submit value="ゲーム開始"></center>
</form>
</td></tr></table>
<br><br>
EOM
&rank;

&foot;

print "</body></html>";


}

sub play {
$new = "$FORM{'url'} $FORM{'title'} $FORM{'r_name'}";
&w_check("open");

&tane;
print "Content-type: text/html\n\n";
print <<"EOM";
<html><head><title>問題画面</title>
<STYLE TYPE="text/css">
<!--
a:link     { font-size: 10pt; text-decoration:underline; color:#003399 }
a:visited  { font-size: 10pt; text-decoration:underline; color:#003399 }
a:active   { font-size: 10pt; text-decoration:underline; color:#DD0000 }
a:hover    { font-size: 10pt; text-decoration:underline; color:#DD0000 }
body,tr,b { font-size: 10pt }
small,td      { font-size: 20pt }

-->
</STYLE>
<SCRIPT langage="JavaScript">
<!--
xx = 0;
function func() {
    xx++;
    document.form1.text1.value = xx;    setTimeout("func()", 1000);  }  
// -->
</SCRIPT>
</head>
<body bgcolor="#CDCDFF" onLoad="func()">
EOM

print <<"EOM";
EOM
print "<center><br><br><br><p><form action=\"$script\" method=post NAME=form1><input type=hidden name=r_name value=\"$FORM{'r_name'}\"><input type=hidden name=revel value=\"$FORM{'revel'}\"><input type=hidden name=title value=\"$FORM{'title'}\"><input type=hidden name=url value=\"$FORM{'url'}\"><input type=hidden name=time value=\"$times\"><input type=hidden name=pro value=\"$times\"><input type=hidden name=mode value=kaito><table width=\"90%\" border=3>";
$tr = 1; $ans_data = "";
foreach (1 .. 40) {
srand(time ^ ($t[$_] + ($$ << 14))); #ＡＢＣのランダム出力
$rand = int(rand(45));
if ($_ == 1 || $_ == 21) { $ans_format .= "<tr align=center>"; }

if ($FORM{'revel'} == 1) { $ans_format .= "<td>$moji[$rand]</td>"; }
elsif ($FORM{'revel'} == 2) { $ans_format .= "<td>$moji2[$rand]</td>"; }
else { $ans_format .= "<td>$moji3[$rand]</td>"; }

$ans_data .= "$rand" . "_";
if ($_ == 20 || $_ == 40) { $ans_format .= "</tr>"; }
}

print "<tr align=center bgcolor=\"#99ccff\"><td><b>1</b></td><td><b>2</b></td><td><b>3</b></td><td><b>4</b></td><td><b>5</b></td><td><b>6</b></td><td><b>7</b></td><td><b>8</b></td><td><b>9</b></td><td><b>10</b></td><td><b>11</b></td><td><b>12</b></td><td><b>13</b></td><td><b>14</b></td><td><b>15</b></td><td><b>16</b></td><td><b>17</b></td><td><b>18</b></td><td><b>19</b></td><td><b>20</b></td></tr>$ans_format";

print "<tr><td colspan=20 align=center>
<input type=hidden name=ans_data value=\"$ans_data\">
<input type=text name=ans size=60 style=\"font-size:10pt\"><input type=submit value=\"解答終了\" style=\"font-size:10pt\">
<font style=\"font-size:14pt\"> 【 時間：<INPUT readonly TYPE=text NAME=text1 size=3> 】
</td></tr>
</table><br><br><div align=right><table border bgcolor=white><tr><td><input type=reset value=\"リセット\" style=\"font-size:10pt\"></td><td><a href=\"$home\">ホームに戻る</a></td></tr></table></div></form><br><br></p></center>";
&foot;
print "</body></html>";
exit;
}

#答え合わせ
sub kaito {

$lost_time = $times - $FORM{'time'};
$pnt = 0;
$miss = "";
@ans_data = split(/_/,$FORM{'ans_data'});
@ans = split(//,$FORM{'ans'});

$yy1 = 0;
foreach (0 .. 39) {
$yy2 = $yy1 + 1;
$xx = $_ + 1;
$zz = "$ans[$yy1]" . "$ans[$yy2]";

if ($FORM{'revel'} == 1) {
 if ($moji[$ans_data[$_]] eq $zz) { $pnt++; }
 else { $miss .= "「$xx」"; }
}
elsif ($FORM{'revel'} == 2) {
 if ($moji2[$ans_data[$_]] eq $zz) { $pnt++; }
 else { $miss .= "「$xx」"; }
}
else {
 if ($moji3[$ans_data[$_]] eq $zz) { $pnt++; }
 else { $miss .= "「$xx」"; }
}


$yy1 = $yy1 + 2;
}

if ($pnt == 40) {
$ww = 0;
&date;
if ($FORM{'url'} eq "http://") { $FORM{'url'} = ""; }
if (!$FORM{'r_name'}) {
$xx = substr($times,-1,1);
if ($xx == 0) { $FORM{'r_name'} = "Dreamer"; }
elsif ($xx == 1) { $FORM{'r_name'} = "星のかけら"; }
elsif ($xx == 2) { $FORM{'r_name'} = "Your Love!"; }
elsif ($xx == 3) { $FORM{'r_name'} = "Free"; }
elsif ($xx == 4) { $FORM{'r_name'} = "days"; }
elsif ($xx == 5) { $FORM{'r_name'} = "風の旅人"; }
elsif ($xx == 6) { $FORM{'r_name'} = "True Force"; }
elsif ($xx == 7) { $FORM{'r_name'} = "Blave"; }
elsif ($xx == 8) { $FORM{'r_name'} = "Do yourself!"; }
else { $FORM{'r_name'} = "Do-RA"; }


}

&lock; #ロック
if ($FORM{'revel'} == 1) { $log = $log1; }
elsif ($FORM{'revel'} == 2) { $log = $log2; }
else { $log = $log3; }

open(IN,"$log");
while (<IN>) {
($aa,$bb,$cc,$pro,$url,$title,$date) = split(/<>/,$_);
if ($FORM{'pro'} eq $pro) { $mes = "同じプレイの２重記録はできません。"; $ww = 1; }
push(@log,$_);
}
close(IN);






if (!$ww) {
$new = "$lost_time<>$FORM{'r_name'}<>$FORM{'pro'}<>$FORM{'url'}<>$FORM{'title'}<>$date_now<>\n";
&w_check("lock");
push(@log,$new);
@log = sort {$a <=> $b} @log;
$ss = @log;
if ($ss > $rank_data) { $tmp = pop(@log); }
open(OUT,">$log");
print OUT @log;
close(OUT);
&unlock; #ロック解除
if ($tmp ne $new) { if (!$ww) { $mes = "おめでとうございます！あなたの成績はランクインされました♪"; } }
elsif ($tmp eq $new && $FORM{'pro'} ne $pro) { $mes = "今度はランクインできるように頑張りましょう♪"; }

}
}
else { if (!$ww) { $mes = "ブラウザのバックボタンで戻って解答を修正するか、<br>下のボタンでトップに戻ってください。"; } }
if ($miss) { $miss .= "文字めが間違っています。<br>"; }
&header("解答結果");

print <<"EOM";
<center><p>
</p>
<table border=4 width="60%">
<tr><td>
<p>
<br>所要時間：<b>$lost_time</b> 秒
<br>$miss $mes
</p>
</td></tr>
</table>
<br>
<form action="$script" method=post>
<input type=submit value="トップに戻る"></form>
<br><br>
EOM
&rank;

&foot;
print "</body></html>";
exit;
}

sub rank {

open(IN,"$log1");
@log1 = <IN>;
close(IN);
open(IN,"$log2");
@log2 = <IN>;
close(IN);
open(IN,"$log3");
@log3 = <IN>;
close(IN);
@log1 = sort {$a <=> $b} @log1;
@log2 = sort {$a <=> $b} @log2;
@log3 = sort {$a <=> $b} @log3;
print <<"EOM";
</center>
<a name=3>[<a href="#top">トップへ戻る</a>] [<b>レベル３</b>] [<a href="#2">レベル２</a>] [<a href="#1">レベル１</a>]</a><center>
<table width="80%" border=4>
<tr bgcolor="#ff99cc"><td colspan=5 align=center>レベル３(むずかしい)ランキング</td>
<tr bgcolor="#cc99ff"><td>順位</td><td>お名前</td><td>所要時間(秒)</td><td>ホームページ</td><td>プレイ日時</td></tr>
EOM
$bg_f = 1; $xx = 1;
foreach(@log3) {
if ($bg_f == 2) { $bg_f = 1; $bg = " bgcolor=\"#ccffff\""; }
else { $bg_f++; $bg = " bgcolor=\"#ccccff\""; }
($time,$name,$pro,$url,$title,$date) = split(/<>/,$_);

if ($url) { $url_go = "<a href=\"$url\" target=\"_blank\">$title</a>"; }
else { $url_go = "<center>-</center>"; }

print "<tr$bg><td>第$xx位</td><td>$name</td><td>$time</td><td>$url_go</td><td>$date</td></tr>";
$xx++;
}
print <<"EOM";
</table><br><br></center>
<a name=2>[<a href="#top">トップへ戻る</a>] [<a href="#3">レベル３</a>] [<b>レベル２</b>] [<a href="#1">レベル１</a>]</a><center>
<table width="80%" border=4>
<tr bgcolor="#ff99cc"><td colspan=5 align=center>レベル２(ふつう)ランキング</td>
<tr bgcolor="#cc99ff"><td>順位</td><td>お名前</td><td>所要時間(秒)</td><td>ホームページ</td><td>プレイ日時</td></tr>
EOM
$bg_f = 1; $xx = 1;
foreach(@log2) {
if ($bg_f == 2) { $bg_f = 1; $bg = " bgcolor=\"#ccffff\""; }
else { $bg_f++; $bg = " bgcolor=\"#ccccff\""; }
($time,$name,$pro,$url,$title,$date) = split(/<>/,$_);

if ($url) { $url_go = "<a href=\"$url\" target=\"_blank\">$title</a>"; }
else { $url_go = "<center>-</center>"; }

print "<tr$bg><td>第$xx位</td><td>$name</td><td>$time</td><td>$url_go</td><td>$date</td></tr>";
$xx++;
}
print <<"EOM";
</table><br><br></center>
<a name=1>[<a href="#top">トップへ戻る</a>] [<a href="#3">レベル３</a>] [<a href="#2">レベル２</a>] [<b>レベル１</b>]</a><center>
<table width="80%" border=4>
<tr bgcolor="#ff99cc"><td colspan=5 align=center>レベル１(やさしい)ランキング</td>
<tr bgcolor="#cc99ff"><td>順位</td><td>お名前</td><td>所要時間(秒)</td><td>ホームページ</td><td>プレイ日時</td></tr>
EOM
$bg_f = 1; $xx = 1;
foreach(@log1) {
if ($bg_f == 2) { $bg_f = 1; $bg = " bgcolor=\"#ccffff\""; }
else { $bg_f++; $bg = " bgcolor=\"#ccccff\""; }
($time,$name,$pro,$url,$title,$date) = split(/<>/,$_);

if ($url) { $url_go = "<a href=\"$url\" target=\"_blank\">$title</a>"; }
else { $url_go = "<center>-</center>"; }

print "<tr$bg><td>第$xx位</td><td>$name</td><td>$time</td><td>$url_go</td><td>$date</td></tr>";
$xx++;
}
print <<"EOM";
</table>
EOM


}

sub tane {
$t[0] = 1;
$t[1] = 131;
$t[2] = 607;
$t[3] = 807;
$t[4] = 617;
$t[5] = 302;
$t[6] = 647;
$t[7] = 207;
$t[8] = 317;
$t[9] = 152;
$t[10] = 85;
$t[11] = 97;
$t[12] = 67;
$t[13] = time;
$t[14] = 93;
$t[15] = 47;
$t[16] = 31;
$t[17] = 117;
$t[18] = 213;
$t[19] = 433;
$t[20] = 419;
$t[21] = 12;
$t[22] = 422;
$t[22] = 654;
$t[23] = 476;
$t[24] = 543;
$t[25] = 242;
$t[26] = 24;
$t[27] = 33;
$t[28] = 77;
$t[29] = 53;
$t[30] = 45;
$t[31] = 332;
$t[32] = 143;
$t[33] = 124;
$t[34] = 675;
$t[35] = 674;
$t[35] = 352;
$t[36] = 578;
$t[37] = 433;
$t[38] = 188;
$t[39] = 875;
$t[40] = 42;
}
sub header {
print "Content-type: text/html\n\n";
print <<"EOM";
<html><head><title>$_[0]</title>
<STYLE TYPE="text/css">
<!--
a:link     { font-size: 10pt; text-decoration:underline; color:#003399 }
a:visited  { font-size: 10pt; text-decoration:underline; color:#003399 }
a:active   { font-size: 10pt; text-decoration:underline; color:#DD0000 }
a:hover    { font-size: 10pt; text-decoration:underline; color:#DD0000 }
body,tr,td { font-size: 10pt }
small      { font-size: 20pt }

-->
</STYLE>
</head>
<body bgcolor="#CDCDFF"><a name=top></a>
EOM
}

#フォームデータのデコード
sub form_decode {
   if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $form, $ENV{'CONTENT_LENGTH'}); }
   else { $form = $ENV{'QUERY_STRING'}; }   @pairs = split(/&/,$form);
   foreach $pair (@pairs) {           ($name, $value) = split(/=/, $pair);
           $value =~ tr/+/ /;
           $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
           $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
           $value =~ s/>/&gt;/g;            $value =~ s/</&lt;/g;
           &jcode'convert(*value,'sjis');
           &jcode'convert(*name,'sjis');           $FORM{$name} = $value;

   } 
$mode = $FORM{'mode'};
}

#ワードチェック機能
sub w_check {
foreach (@w_check) {
if ($_) {
if (index($new,$_) >= 0) { $miss = "ワードチェックエラーです。"; 
if ($_[0] eq 'lock') { &unlock; }
&error("ワードチェックエラー");
}
}
}
}

#著作権表示（削除・変更しないでください）
sub foot {
print "<p><div align=right><table bgcolor=white border><tr><td><small><A HREF=\"http://yomi.pekori.to/\" TARGET=\"_blank\">Key-Boader Ver1.0</A></small></table></div></p>";
}

#エラー処理
sub error {

print "Content-type: text/html\n\n";

print "<html><head><title>$_[0]</title></head>\n";
print "<body><center><br><br>\n";
print "<br><br>\n";
print "<table bgcolor=white><tr><td><a href=\"$home\">ホーム</a></table><table bgcolor=lightblue border=1 width=90%><tr align=center bgcolor=#EEFFEE><td>$miss\n";
print "<br><form><input type=button value=\"　戻る　\" onClick=\"history.back()\"></form></table></center>";
print "</body></html>\n";

exit;
}


#ファイルのロック処理
sub lock { 
$lockfile = "key.loc";
## ロックファイル（open関数）

	$lflag = 0;
	foreach (1 .. 6) {
		unless (-e $lockfile) {
			open(LOCK,">$lockfile");
			close(LOCK);
			$lflag = 1;
			last;
		} else {
			sleep(1);
		}
	}
	if ($lflag == 0) { $miss = '現在、アクセスが集中しているためタイムアウトになりました。<br>ブラウザのバックボタンで戻ってからもう一度実行してみてください。<br>長期間に渡りこの状況が続く場合には管理人へお知らせください。<br>管理人さんは「$lockfile」を削除することで正常な状態に戻すことができます。'; &error; }

}

#ロック解除ルーチン
sub unlock {
unlink($lockfile);
}

sub date {
$youbi_en = 1;
# 日時の取得
$ENV{'TZ'} = "JST-9";
$times = time();
$times_now = time();
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($times);
$year = 1900 + $year;
$mon++;
if ($mon  < 10) { $mon  = "0$mon";  }
if ($mday < 10) { $mday = "0$mday"; }
if ($hour < 10) { $hour = "0$hour"; }
if ($min  < 10) { $min  = "0$min";  }
# 日時のフォーマット
if ($youbi_en) {
$youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday];
} else {
$youbi = ('日','月','火','水','木','金','土') [$wday];
}
$date_now = "$year/$mon/$mday($youbi) $hour:$min";
}
