<html> |
すごろく用に「sugoroku.html」を作成して、保存します。 |
<html> |
【表示場所の準備】 4×4枠のテーブルを作成します。 それぞれフォームの部品には名前を付け、表示場所にはIDを付けておきます。 見た目のデザインに凝ると、プログラムも非常に複雑で難しくなりますので、今回は単純に1つの枠にコマの進み具合を表示します。 また、本当のすごろくのように止まった場所でイベントが発生するという仕組みは、次の段階で考えたいと思います。 |
<script language="javascript"> sai_start(); function sai_start() { |
【サイコロの処理】 プレイヤーの順番を管理するために変数user_numを用意します。 初期設定の最後で「sai_start()」を呼び出します。 ユーザー関数sai_start()では、サイコロの出目がクルクル回ります。
|
<script language="javascript"> sai_reset(); function sai_reset() {
function sai_start() { |
【使わないボタンを使えなくする】 ボタンが押されると、サイコロが振られ、次の人に順番が変わるようにしようと考えています。 順番が変わったとき、次の順番の人だけがボタンだけを押せるようにしたいと思います。 一旦全部のボタンを使えなくしてから、変数user_numを参照して、ボタンを1つだけ使えるようにしています。 sai_start()とsai_reset()を分けているのは、タイマーの影響を受ける部分を切り分けるためです。 初期設定の呼び出しもsai_reset()に変更し、その中からsai_start()を呼び出すようにしています。 |
<script language="javascript"> sai_reset(); function getNum(num) {
(省略) |
【ボタンを押した時の処理(1)】 ボタンを押して、サイコロの出目が決定される処理を作ります。 既にフォームでは、ボタンを押すとgetNum()が呼び出されるようになっていますので、ユーザー関数getNum()を作ります。 まずタイマーを止めます。ここで変数timerを使っています。
|
<script language="javascript"> sai_reset(); function getNum(num) { (省略) |
【ボタンを押した時の処理(2)】 一旦タイマーを止めて、サイコロの出目を止めました。 次の人に順番を替えるため、変数user_numに1を足します。 最後にsai_reset()を呼び出して、次のプレイヤーのための初期化をし、サイコロが回ります。 |
<script language="javascript"> sai_reset(); function getNum(num) { function sai_reset() { function sai_start() { |
【改良点:順番が過ぎたら赤い出目を黒くする】 サイコロの出目が決まったときは赤くしました。次々にサイコロを振るとどれも数字は赤くなります。 現在の出目とは別に、1つ前の人とその出目を覚えておく必要がありますので、初期設定に2つの関数を使います。 getNum()でタイマーが止まった直後に、1つ前の出目(変数pre_r)を書き換えます。
表示の次には、現在のプレイヤーの番号(変数num)を変数pre_numに移し替えます。 更にその次では、現在の出目(変数r)を変数pre_rに入れ換えています。 |
(省略) function sai_next() { (省略) |
【改良点:参加人に合わせた対応(1)】 参加人数は常に4人とは限らない。一人でやりたい場合もあるだろうし、人数に応じてサイコロを振れるようにしたいと思います。 新しくユーザー関数sai_nexst()を作ってみましょう。 1行目ではローカル変数sに、次の人の名前を入れます。変数user_numは、この前の段階であるgetNum()でとりあえず次の番号に替えられていますから、予定のプレイヤー名が変数sに入ります。 2行目のif文は最後の行まで続いていて、間に「else」が入っています。書式としては「if (条件式) {真} else {偽}」となっています。
このif文の条件式では「!=」という比較式が使われています。これは「==」の反対です。「s == ""」ならば、変数sが「""」(空っぽ)のときは真です。「s != ""」ですから、変数sが「""」でないときに真となります。
変数sはプレイヤーの名前ですから、これが空っぽでないときというのは、名前があるときということです。そのときは、処理を次のsai_reset()に進めます。 変数sが空っぽのときは、条件式が偽となりますので、else以降の処理が行われます。
|
(省略) function getNum(num) { (省略) |
【改良点:参加人に合わせた対応(2)】 getNum()の次にsai_reset()を実行していましたが、これをsai_next()に変更します。 |
(省略) <table border="0" cellspacing="5" cellpadding="5"> (省略) |
【改良点:プレイヤー名を初期表示する】 最初プレイヤーの名前が入っていないため、この状態でサイコロボタンを押すと、「Out of Memory」というエラーが発生します。 まずは単純な対策として、一人目の名前を自動的に入れておきます。 でも、これでは根本的な解決ではありませんので、あとで解決しなくてはなりません。 |
(省略) function sai_start() { (省略) |
【問題点:プレイヤーが一人の場合の不具合】 現時点で2つの問題が発生しています。 まずは、プレイヤーが一人の場合の問題点を修正しましょう。 プレイヤーが一人ということはどうやって判断できるのだろうか。現在のプレイヤーが変数user_numで、次のプレイヤーが変数pre_numに番号で入っていますので、これが同じならばプレイヤーは一人ということになります。 サイコロの出目を回しているのはsai_start()の中です。 |
(省略) function sai_start() { (省略) |
【問題点:最初のサイコロが回転しない】 また新たな問題が起きてしまいました。 先ほど、プレイヤーが一人の場合にサイコロを止めたことが原因です。 変数pre_rは初期設定では「0」になっていますが、一度でもサイコロが振られると、出目である「1」〜「6」の数値が入ります。 2つ目の条件式は「pre_r == 0」になります。
|
(省略) function sai_next() { (省略) |
【問題点:プレイヤーがいない場合の不具合】 次は、一人しかいないプレイヤーの名前を消してしまった場合のことを考えます。 次のプレイヤーを調べて、また同じプレイヤーになったら、そこで、探すのを止めることにしましょう。 sai_next()内で処理を繰り返すために再びsai_next()を呼び出しています。
|
(省略) function getNum(num) { function sai_next() { (省略) |
【改良点:同じ処理を整理する】 getNum()とsai_next()に同じ処理があります。 user_num++; この部分です。これを1つにして整理します。 getNum()にある緑の部分は削除して、sai_next()の中で実行することにします。 新しい位置で実行すれば、sai_reset()に行く前に1回は実行されることに違いはありません。 |
(省略) <script language="javascript"> sai_reset(); (省略) |
【すごろくのコマを用意】 サイコロの処理、プレイヤーの順番の処理ができたので、次はコマを動かす処理を作っていきます。 まずは、コマを用意する必要があります。
|
(省略) <script language="javascript"> restart(); function restart() { sai_reset(); (省略) |
【初期設定をユーザー関数に移し替え】 ゴールしたときに初期設定に戻す必要があるので、初期設定をユーザー関数「restart()」の中で行います。 restart()の中に初期設定の大部分を移し替えます。 これにより、起動時の流れは、restart()→sai_reset()→sai_start()となります。 |
(省略) <script language="javascript"> restart(); function restart() { sai_reset(); (省略) |
【コマの初期表示】 restart()の中で、コマを表示させましょう。 for文を使って、配列変数imgで用意したコマを順番に取り出して表示します。 |
(省略) <script language="javascript"> restart(); function restart() { sai_reset();
(省略) |
【コマの位置を記録する準備】 次に、コマの進み具合を記録するために配列変数komaを用意します。 最初は配列変数だけを宣言しておきます。 |
(省略) function getNum(num) {
(省略) |
【出目に応じてコマを進める】 getNum()でサイコロの出目を表示した後に、コマを進める部分を作りましょう。 出目を表示した次に処理を追加します。 次にローカル宣言した変数sを用意しています。
変数sにコマ数だけの「.」が入ったら、後ろにコマを付けて、画面に表示しています。
|
(省略) <script language="javascript"> restart(); function getNum(num) {
(省略) |
【ゴールの判定を行う】 ゴールを20コマとしてみましょう。 ゴールは途中で変わることがないので、初期設定で「goal = 20」としておきます。 あとはgetNum()の最後にゴールに達したかどうかを判断させます。
|
(省略) function goalin() { (省略) |
【ゴールの表示】 一人がゴールしたら終わりとするのか、全員ゴールするまで続けるのかで仕組みは変わりますが、このゲームでは一人がゴールした時点で終わりとします。 ゴールをしたら、alert()を使ってダイアログボックスを表示します。
ダイアログはOKボタンが押されると消えます。
|
【完成】
これでひとまず完成とする。
次には止まったマス目でイベント(ハプニング)が発生するところを作ってみたい。
その他、改良点として考えられるもの:
・ゴールの位置を判るようにする
・サイコロの目を画像で表示する
・コマを画像で表示する
・コマを選択できるようにする