<html> |
【保存ファイルの準備】 エディタ(メモ帳)とブラウザ(Internet Explorer)を使って基本のタグを書いたHTMLファイルを作成します。 |
| <html> <head> <title>九九しりとり</title> </head> <body> <h3>九九しりとり</h3> <hr> <p>ルール:九九の答えの一の位を使ってしりとりします。一の位が0になったり、同じ答えを出すと負けです。</p> </body> </html> |
【ゲームの説明】 ゲームを作る前にゲームのルールを理解しておかなければいけません。 九九を使ってのしりとりなので、九九の答えの一桁を次の九九の段にして、1〜9の数字を掛けて次の答えを出します。 「9×2=18」「8×6=48」「8×4=32」「2×2=4」「4×5=20」 そして、上記のように下一桁が0になると、続けられないため負けになります。 まずは、このルールを簡単に<body>に記述しましょう。 |
| <html> <head> <title>九九しりとり</title> </head> <body> <h3>九九しりとり</h3> <hr> <p>ルール:九九の答えの一桁目を使ってしりとりします。一桁目が0になったり、同じ答えを出すと負けです。</p> <table border="0" cellspacing="2" cellpadding="2"> <tr><th></th></tr> <tr><th></th></tr> <tr><th></th></tr> <tr><th></th></tr> </table> </body> </html> |
【4つのテーブル枠】 画面上には4つの枠をテーブルタグで作ります。 1つ目は、九九の最初の段数を決める数字を表示します。これを親数と呼ぶことにします。 枠内のものが中央に来るようにタグは<th>を使っておきます。 |
| <html> <head> <title>九九しりとり</title> </head> <body> <h3>九九しりとり</h3> <hr> <p>ルール:九九の答えの一桁目を使ってしりとりします。一桁目が0になったり、同じ答えを出すと負けです。</p> <table border="0" cellspacing="2" cellpadding="2"> <tr><th><span id="oya"></span></th></tr> <tr><th></th></tr> <tr><th><span id="kotae"></span></th></tr> <tr><th></th></tr> </table> </body> </html> |
【親数の表示場所】 <span>タグを使って「oya」というIDの場所を作ります。 【答えのリストを表示する場所】 こちらも<span>タグを使って「kotae」というIDの場所を作ります。 |
| <html> <head> <title>九九しりとり</title> </head> <body> <h3>九九しりとり</h3> <hr> <p>ルール:九九の答えの一桁目を使ってしりとりします。一桁目が0になったり、同じ答えを出すと負けです。</p> <table border="0" cellspacing="2" cellpadding="2"> <tr><th><span id="oya"></span></th></tr> <tr><th><form> <input type="button" value=" 1 " onClick="keisan(1)"> <input type="button" value=" 2 " onClick="keisan(2)"> <input type="button" value=" 3 " onClick="keisan(3)"> <input type="button" value=" 4 " onClick="keisan(4)"> <input type="button" value=" 5 " onClick="keisan(5)"> <input type="button" value=" 6 " onClick="keisan(6)"> <input type="button" value=" 7 " onClick="keisan(7)"> <input type="button" value=" 8 " onClick="keisan(8)"> <input type="button" value=" 9 " onClick="keisan(9)"> </form></th></tr> <tr><th><span id="kotae"></span></th></tr> <tr><th><form> <input type="button" value="リセット" onClick="kotae_reset()"> </form></th></tr> </table> </body> </html> |
【子数の表示場所】 <form>とボタンを置きます。ボタンは9つ必要です。 ユーザー関数keisanで、親数と子数を掛け算する必要があるということが判ります。 【リセットボタン】 このリセットボタンは、フォームのリセットではなく、答えの表示を元に戻すので、通常のボタンを使います。
このリセットボタンからスクリプトを呼び出すため、これにも「onClick」で呼び出すスクリプトを決めておきます。 ユーザー関数kotae_resetが初期状態の表を表示するためのスクリプトになります。 |
<html> function kotae_reset() { } |
【最初のスクリプト】 それでは、スクリプトを作っていきます。 これはユーザー関数kotae_resetで予定している内容と同じなので、まずはそこから作っていきます。 流れとしては、スクリプトの最初にそのユーザー関数を呼び出して、あとはユーザー関数に任せます。 最初の流れなのでそのままスクリプトを書いても良いのですが、それではリセットボタンから同じ処理を呼び出すことができませんね。 このように同じ処理を繰り返す場合は、1つのユーザー関数にまとめてスクリプトを書くので、メインの流れからも呼び出して使います。 |
(省略) <script language="javascript"> function kotae_reset() { (省略) |
【親数の表示】 コメントアウトで説明書きも入れながらスクリプトを記入します。
乱数はまず、random()で発生します。このとき、0〜1の間にある小さな小数です。0や1にはなりません。その間の小数と考えてください。 乱数を発生させたら、次の行で「oya」に対して、変数num_oyaの数値を含む文字列を出力しています。 |
(省略) <script language="javascript"> function kotae_reset() { (省略) |
【答えのリストを作成】 配列変数kotae_listを利用して答えのリストを用意します。 配列の要素は1〜90まで用意して、各要素の配列に「0」を入れておきます。 リストの配列が準備できたら、テーブルを組んで表示します。 |
(省略) <script language="javascript"> function kotae_reset() { (省略) |
【答えのリストを表示】 ユーザー関数view_listを作ります。 テーブルの前後には<table>タグがあります。 この表を出力すると単純な数字の並びが出てきます。 複雑なことをしているように見えますが、行毎に<tr>タグを入れるために、このような手順が必要になってしまうのです。 |
(省略) <script language="javascript"> function kotae_reset() { (省略) |
【計算の実行】 ユーザー関数keisanを作ります。 ボタンから送られてくる数字を変数numで受け取ります。これが子数になります。 親数は変数num_oyaに入っていますので、親数と子数を掛けた答えを変数num_kotaeに入れます。 次に配列変数に答えの印を付けます。ここでは、答えの要素に対して1を足しています。これで「0」だった数値が「1」になりますので、数値が「1」ならば答えが一度出たことの印になります。 3行目で、ユーザー関数view_listを呼び出しています。 4行目では、答えの要素が「1」よりも大きい場合に、「OUT!!」というメッセージを画面に表示します。 4行目で、答えが「2」の場合としないことには意味があります。「1」より大きいということは「3」や「4」の場合も考えているのです。 |
(省略) function view_list() { (省略) |
【答えリストの変更】 ユーザー関数view_listに出た答えの数字に印を付けて表示するように変更を加えます。 数字の表示は「kotae_table += "<th>"+r+"</th>"」の部分で行っています。 最初のif文では、答えの要素に「2」以上の数値が入っていたときに、背景を赤、文字を白にします。 2つ目のif文には頭にelseも付けます。これは1つ目のif文が真でなかったときだけ判断されることになります。 元々あった枠の表示はelseの後に入れて、2つのif文がどちらも偽の場合に実行されることになります。 これで3つのパターンに処理が分岐されることになります。 |
(省略) function keisan(num) { (省略) |
【答えの一の位を引き継ぐ】 答えが出たら、その一の位を引き継いでしりとりにします。 そこでif文の続きとして、答えが2回目でなかったときの処理としてelseを使います。 その中に2行追加します。 1行目は、引き継ぐために変数num_oyaに一の位を取りだしています。 例えばこういうことが起こっています。 2行目では、その新しい親数を表示しています。 |
(省略) function keisan(num) { (省略) |
【親数が0になった場合】 さて、ここでもう1つのルールを確認します。 そこで、親数が「0」の場合には、「OUT!!」のメッセージを表示させます。 これでゲームとしては2つのルールを盛り込んで、スクリプトが完成したことになります。 |
(省略) function keisan(num) { (省略) |
【ゲームを続けられるように改良する】 このままでは「0」が出るとゲームを続けられなくなります。 一の位を変数num_oyaへ直接いれずに、一旦変数rに入れます。 次の変数num_oyaの表示は移動して、その次のif文が偽のときにだけ表示することにします。 また、最初の変更に合わせて、if文も変数num_oyaから変数rに変更します。 |
(省略) <table border="0" cellspacing="2" cellpadding="2"> (省略) |
【改良:大きさと色を付ける】 親数の表示を大きくし、色を付けて見やすくしたいと思います。 テーブルの1行目にある<span>タグで親数を表示しています。ここにタグを入れて、大きさと色を指定します。 |
(省略) function keisan(num) { (省略) |
【改良:計算式の表示(1)】 親数の表示だけだったのを、計算式の表示に変更します。 まず、表示用の変数view_textを用意して、そこに計算式を文字列にして入れます。 出力部分は変数num_oyaを変数view_textに入れ換えます。 これで子数を押した後、親数と子数を掛け算する式とその答えが画面に表示されるようになりました。 |
(省略) function keisan(num) { (省略) |
【改良:計算式の表示(2)】 もう1段階、表示の改良を進めましょう。 先に作った計算式の後ろに改行のための<br>タグを入れます。 |
(省略) function kotae_reset() { (省略) |
【改良:計算式の表示(3)】 上記の変更に合わせて、最初の表示も手直しします。 |
【完成】
九九しりとりはこれで完成です。
これなら一人でも遊べますし、複数でも交代でマウスを握って遊べます。
ウインドウを小さくして答えの表を見えなくすると更に難しくなります。
九九の学習として使う場合には、子数のボタンを押す前に声を出して九九の式と答えを言いましょう。
改良するとすれば、長く考えられないようにカウントダウンタイマーを取り付けたり、連続正解数の記録を表示するなど考えられます。
【ルール改善版】
オリジナル版のルールには5の段に問題点があります。5の段の答えには「0」か「5」しかありません。他の段に移動できないし、負けが見えています。これではゲーム性が損なわれるため、一の位が「0」の場合、十の位を取って継続するようにルールを変更します。
(省略) function keisan(num) { (省略) |
【5の段の問題を改善】 緑の部分を削除します。後ろから三行目の「}」も忘れずに削除してください。 新たに変数rが0の場合には、十の位を変数rに入れています。 ルールの説明文も「九九の答えの一の位を使ってしりとりします。一の位が0の場合は、十の位を使います。同じ答えを出すと負けです。」と変更しておきます。 |
(省略) <table border="0" cellspacing="2" cellpadding="2"> (省略) |
【得点表示の作成】 連続して答えを出すと得点が得られるようにします。 【得点の表示場所】 得点表示をするために、テーブルに一行加えて、「score」という表示場所を作ります。
|
(省略) function kotae_reset() { (省略) |
【得点の初期設定】 ユーザー関数kotae_resetに得点をカウントするための変数countを準備します。 |
(省略) function keisan(num) { (省略) |
【得点の計算と出力】 OUTの表示があった場合には、変数countから1を引いて、得点を減らします。 答えが被らなかったときは、変数countを1つ加算して得点を増やします。 最後に得点の表示をします。 |
(省略) function keisan(num) { (省略) |
【詰み状態の確認】 次の答えがない状態を詰み(チェックメイト)と言います。 詰み状態で無駄なクリックを続けても得点が減るばかりなので、その状態を気づかせるために確認を行います。 まず、親数に対して各子数を掛けて、配列変数kotae_listの答えの要素を調べます。「0」があればまだ答えが残っているいうことになりますので、その数を変数mに数えていきます。 では、「詰み状態の確認」とコメントアウトした次から見て行きましょう。 1行目で、変数mを初期化しています。 2行目のfor文で変数nに子数を1から9まで入れて、3行目の式を繰り返し調べます。 3行目は、親数と子数を掛けた答えの要素を調べ、「0」ならば真です。真ならば、一度出た答えなので、変数mに1を加算します。 5行目で、変数mが「0」かどうか調べています。真ならば「CHECKMATE」とメッセージを表示します。 |
(省略) function keisan(num) { (省略) |
【完全回答の確認】 今度は、詰みとは言っても、全部完全に答えが出た場合にもメッセージを表示することにしましょう。 答えは36通りですので、得点が最大の36点になったら完璧(パーフェクト)と言えます。 「完全回答の確認」のコメントアウトから下を見ていきます。 1行目でif文を使って、変数countが「36」か調べています。真ならば2行目を実行します。 2行目は、「PERFECT!!!」のメッセージを表示しています。 3行目のelseから、if文が偽の場合に詰み状態の確認を行うために、4行目から6行目を囲っています。 |