~ To be, or not to be, or to ask someone to be. ~ null-i.net |
タイピングゲーム | |
タイピングゲーム(2022-04-02) なんとなくトップページがタイピングゲームにりました。
タイピングゲーム†
となっています。 作りたい人に向けて†HTML と JavaScriptって、Webブラウザですぐに動かせるという点では最も身近なプログラミング言語だと思います。 基本の部分†メモ帳で以下を書いて、拡張子を「.txt」ではなく「.html」で保存します。 <html> <head> <script> alert("こんにちは"); </script> </head> <body> <div id=ID>Hello world!</div> </body> </html> 注意点としてファイルを保存する時に文字コードを「UTF-8」にする必要があります。*3 最初に動く処理†このスクリプトってスタート地点はどこなの? って話です。 <html> <head> <script> document.addEventListener("DOMContentLoaded", function(){ alert("読み込みが終わったらここが呼ばれます"); },false) window.addEventListener('load', function(){ alert("色々と読み込み順や方法に差はあるのですが、まずはお好みでどうぞ。"); },false); alert("ここだとbody本文の前に呼ばれます"); </script> </head> <body> <div id=ID1>Hello world!</div> </body> </html> まずは DOMContentLoaded などで最初にやりたい処理を書き込みます。 キーボード入力を拾う†タイピングゲームなら、キーボード入力を拾う必要があるわけです。 <html> <head> <script type="text/javascript"> document.addEventListener("DOMContentLoaded", function(){ function f(e){ var html = document.getElementById("ID1"); html.innerHTML = e.key; } document.addEventListener("keydown", f, false); },false) </script> </head> <body> <div id=ID1>Hello world!</div> </body> </html> 上の例では画面全体(document)に対してのキーボード入力(keydown)を拾っています。 タイマーを動かす†開始時の3秒間カウントダウンや、2秒間入力が無かった時にヒントを出すとかは以下のようなタイマー処理を利用しています。 <html> <head> <script type="text/javascript"> document.addEventListener("DOMContentLoaded", function(){ function f(e){ var html = document.getElementById("ID1"); html.innerHTML = i; i++; } i=0; setInterval(f, 1000); },false) </script> </head> <body> <div id=ID1>Hello world!</div> </body> </html> 何か時間の経過で動かしたいものがあればキーボードや画面タップのような(いわゆるイベント・ハンドラ)処理とは別に、タイマーを設定する必要があります。
…のように少しずつ複雑にしていきました。 問題文用の単語リストについて†問題文にするネタは 日本語はMozc辞書から、英語は SCOWL(Spell Checker Oriented Word Lists)から抜粋しています。*4 大量のデータを目視しないといけない人へ†不運にものっぴきならない事情で数千~数万行をいちいち目視でチェックしなければならない人に向けて… #!/usr/bin/perl -w use IO::Prompt; my $in_file = "./input.txt"; my $file_pre = ""; my $file_suf = ".txt"; my $out_dir = "./sample"; my $count = 0; open($IN, "< $in_file") or die "$! [$in_file]\n"; while(<$IN>){ $count++; // if($count < 10){ next; } // 作業を中断した場合に、10行目から再開とか $line = $_; chomp($line); while(1){ printf("%d:%s\n", $count, $line); my $key = prompt "[1/2/3で採用、除外候補はSPACE]>", -one_char => ''; my $fname = ""; if($key =~ /[ ]/){ $fname = $file_pre . "0" . $file_suf; printf(" -> 0へ[%s]\n", $fname); } elsif($key =~ /([123])/){ $fname = $file_pre . $1 . $file_suf; printf(" -> $1 %s\n", $fname); } if(length($fname) > 0){ my $out_file = $out_dir . "/" . $fname; open($OUT, ">> $out_file") or die "$! [$out_file]\n"; printf($OUT "%s\n", $line); close($OUT); last; } } } close($IN); 重要なのは入力手順を可能な限り減らすこと、です。 # ためしに一文字待って、すぐに echo してみるコマンド例 read -n 1 TEST && echo "#$TEST#" 作業量が多くなってしまった場合に、キー入力待ちでいちいちEnterキーを数千回たたくと指がもげるので、一文字でも入力を減らす(片手でも仕分け作業ができる)ようにする必要があります。 PukiWiki ユーザの方へ†なんでトップページでいきなりタイピングゲームが始まる仕様になっているのか? についてですが。 <?php if(strcmp($title, $defaultpage) == 0){ // ここにトップページだけでやらせたい処理を書く } else { // 通常の、トップページ以外の処理はこちら // echo $body; とか } ?> Wikiの中身って普段は「echo $body;」で書き込んでいますよね? ここをまるっと差し替えます。 |
|