sugoroku.htmlから改良を加えましょう。 |
(省略) <h3>すごろく2</h3> (省略) |
【改良点:注意書きの表記】 テーブルの上に文字を入れて、名前を入力するようにしてもらいましましょう。 <p></p>は1つの段落であることを示しています。
|
(省略) <script language="javascript"> user_num = 0; restart(); function restart() { sai_reset(); (省略) |
【改良点:ゴールをしたあとのプレイヤーを変更する(1)】 ゴールをするとすごろくが初期化されます。 また、
同時に2つの問題も発生しています。 プレイヤーの順番を管理しているのは、変数user_numと変数pre_numです。 |
(省略) function getNum(num) { function sai_next() { (省略) |
【改良点:ゴールをしたあとのプレイヤーを変更する(2)】 先の処理だけでは、初期化はされませんが、ゴールをしたプレイヤーから新しいゲームが始まってしまいます。 user_num++; この処理をする必要がありますが、sai_next()の中にこれがあります。 緑の部分を削除して青の位置に移動します。 移動したらif文を手直しします。変数numはgetNum()の中でしか使えないローカル変数なので、そのままではエラーが発生します。 |
(省略) function goalin() { (省略) |
【問題点:ゴールの表示の不具合】 先の修正によって、goalin()にも修正が必要になります。 ここも変数pre_numに置き換えます。 |
(省略) function sai_next() { (省略) |
【問題点:ゴール後の不具合(1)】 プレイヤーが一人のときに、次の段が次のプレイヤーになってしまい、名前がないのにサイコロが回ってしまいます。 そこで、sai_next()の中を整理して、if文を1つにまとめます。名前が空欄(s == "")で現在と次のプレイヤーが同じでない(user_num != pre_num)ときに、もう一度sai_next()を実行し、それ以外のときにゴールの判定を行って、sai_reset()とgoalin()に分岐させます。 |
(省略) function goalin() { (省略) |
【問題点:ゴール後の不具合(2)】 ゴールの後、同じプレイヤーの順番にはなったが、サイコロが回転しません。 goalin()の中でrestart()に飛ぶ前に処理を入れましょう。
|
【イベントを発生させる方法を考える】 プレイヤーが止まった位置は配列変数komaで管理しているので、イベントを配列変数で用意してコマ毎にイベントの内容を書いておきましょう。コマ数を参照して、その位置にあるイベントを実行します。 まずはイベントを管理する変数を考えます。 次に各イベントの内容を考えます。 では、実際にはどのようにすると良いのでしょうか。 あと、イベントがないマスも必要になります。 |
(省略) <script language="javascript"> restart(); (省略) |
【改良点:イベントを発生させる(1)】 まずは変数goalを確認します。 数字を変更している場合は、「goal = 20」にします。 コマ数は、0がスタート、20がゴールになりますので、イベントが必要なのはその間にある19個のマスです。 配列変数evの初期設定で19個の数値をイベントとして「,」で区切って並べます。
イベントを呼び出すときの注意点を先に考えておきましょう。 1コマ進むと、1番目のマスに止まります。しかし、配列変数は0番から始まるので、「1番目のマス」は「0番目」と考えなければいけません。 具体的に考えると判りやすくなります。 これを1つにまとめて考えると「ev[koma[num]-1]が、コマ数に対応したイベントになります。変数numはプレイヤーの番号です。 |
(省略) function getNum(num) {
function move_koma { (省略) |
【改良点:イベントを発生させる(2)】 コマを進めるとイベントが発生するので、getNum()にその処理を追加したいと思います。 イベントを処理する前にコマを進めますが、イベントが発生すると、そのときもコマを進めなければなりません。 move_koma()を作って、青の部分を移動し、元の場所から呼び出します。呼び出した後は、続きの処理に戻ってきます。 move_koma()の中では変数numが使えませんので、ここも変数pre_numに書き換えます。
|
(省略) function getNum(num) { function check_event() { (省略) |
【改良点:イベントを発生させる(3)】 イベントを扱うユーザー関数check_eventを作ります。 まず、getNum()では、move_koma()とsai_next()の間から呼び出すようにします。 それでは、check_event()の内容を見ていきましょう。 1行目でロカール変数nに、コマ数に対応したイベントを取り出しています。 次に2つのif文で進むときと戻るときのイベントをメッセージで表示しています。 配列変数evが0のときは何もしない。 1つ目のif文は「n > 0」なので、正の数の場合です。 2つ目のif文は「n < 0」で、負の数の場合になっています。
if文でメッセージを表示したあと、イベントの分だけコマ数を足しています。 そして、もう一度move_koma()を呼び出して、コマの位置を書き換えます。
|
(省略) function check_event() { (省略) |
【問題点:ゴールしたときにエラーが発生】 ここで動作テストをすると、ゴールしたときにそれまでと違う現象が起こります。 「document.title = n」をcheck_event()の最後に入れてテストをしてみると、配列変数evが「undefined」となっていました。 配列変数evは最初に19個設定しました。そのため要素として指定できるのは「0」〜「18」になります。 そこで、if文を使って、変数nに正しく数字が入っているか判断させています。
|
(省略) <script language="javascript"> restart(); (省略) |
【改良点:コマ数を増やす】 コマ数を増やすにはどうすれば良いでしょうか。 配列変数evの初期設定で、要素を増やせば良いのです。 コマ数が増えると、それを数えてgoal位置を決めるのに非常に手間がかかってしまいます。 |
(省略) function check_event() { (省略) |
【改良点:スタートに戻る】 将来考えられる問題点として、コマ数を戻しすぎてマイナスになったときの対処を考えます。 現時点では、戻すイベントが発生した場合にコマ数がマイナスになってしまった場合、エラーが発生します。配列の要素は「0」から始まりますので、マイナスというものはありません。 まず、配列変数komaの足し算をメッセージよりも先に行います。青の位置に移動します。
|
(省略) //ev = new Array(0,0,2,0,5,0,-3,-5,0,3,0,-2,2,-5,0,-2,0,2,-2,0,3,-3,0,5,0,-3,-2,0,2,0,3,0,2,0,-3,2,0,-2,0,5,0,-3,0,-2,0,0,-3,0,0); (省略) |
【複数の設定を切り換える】 テストをする場合など、条件を替えて複数のパターンを検証したいときに、その度にデータや命令文を書き換えるのは面倒です。 そこで、コメントアウトの機能を使って、複数の設定を切り換えると便利です。
|
(省略) img = new Array("★","◆","●","■"); koma = new Array(); (省略) function move_koma() { (省略) |
【改良点:改良や修正をしやすくする工夫(1)】 さて、突然ですが、コマの移動跡には「.」を使っていますが、これを変更するにはどうすれば良いでしょうか? プログラムを沢山書いていると、細かな変更をするにも、それがどこにあるのか探すのは大変です。 コマの移動跡に使っている「.」はmove_koma()の中で設定しています。これを探すのはとても面倒ですが、これを変更するのはとても簡単です。 そこで、このような環境設定やユーザー設定の項目を初期設定の前に用意します。 そして、変数atoを用意して、ここに「.」を入れます。 「〜」「>」「_」「)」など、変数atoの中身を色々替えて遊んでみましょう。
|
(省略) //コマ (省略) |
【改良点:改良や修正をしやすくする工夫(2)】 もう1つ、コメントアウトを使って注釈を付けると、ソースの内容がとても判りやすくなります。 言葉で説明できるので、説明書を用意する必要もないくらい判りやすくできます。
|
(省略) function check_event() { (省略) |
【改良点:ダイアログに名前を追加】 ダイアログボックス(アラート)に対象のプレイヤーの名前を表示させましょう。 ユーザー関数check_event()にあるalert()でプレイヤーの名前を表示します。 alert()が3つありますので、ここに変数sを付け足します。 |
【完成】
今後の改良点として
・自動的にイベントを作成する
・参加人数を自由に選択できる
【おまけ】
(省略) function check_event() { (省略) |
【改良点:アラートの整理】 alert()が3ヶ所にありますので、これを1つにまとめてみましょう。 変数sを空で用意して、alert()の位置で文字列を入れます。
move_koma()は新しいif文の中に入れましたが、今まで通り外にあっても問題はありません。 |
(省略) function check_event() { function goalin() { (省略) |
【改良点:アラートにコマの表示を追加】 ダイアログボックスに名前を表示させましたが、コマも表示させましょう。 check_event()の先ほど名前を追加した部分の直前にコマの表示を入れます。 goalin()にもダイアログがありますので、こちらにもコマの表示を追加しましょう。 配列変数imgにはコマの絵柄が入っており、変数pre_numに直前のプレイヤーの番号が入っています。
|