次へ進む  [目次]  [STEP0]  [STEP1]  [STEP2]  [STEP3]  [STEP4]  [STEP5]  [STEP6]  [STEP7]  [終わりに]

猫でも作れる神経衰弱♪

STEP5:人間同士の神経衰弱を作りますにゃ   STEP5−結果

 STEP5では、人間同士で遊ぶ神経衰弱を作りますにゃ。できあがるものはこれですにゃ。STEP4で作ったものに、いろいろ書き加えていくんですけど、その前に、プログラムが実行されている時のフラグの状態(変数flgの値)を決めておきましょにゃ。

・フラグ=0(変数flgの値が0) ゲーム開始前またはゲーム終了後の状態ですにゃ。
・フラグ=1(変数flgの値が1) 1枚目のカードがめくられるのを待ってる状態ですにゃ。より正確に言うと、1枚目のカードがめくられてから変数flgの値が2に書き換えられるまでの時間も含まれますにゃ。ここでは人間同士ですから1枚目のカードをクリックする前ってことになるんですけど、次のSTEP6ではコンピュータが考えている状態も含まれるようになりますにゃ。
・フラグ=2(変数flgの値が2) 1枚目のカードがめくられた後のウエイト状態ですにゃ。ウエイトっていうのは、ここでは、プログラムの処理はとっくに終わっているのに意図的に次の処理の実行を遅らせるっていうことですにゃ。本当は、人間同士で遊ぶ時はこのウエイトは必要にゃいんですけど、コンピュータがプレイする時に必要になってきますから、今のうちに作っておきますにゃ。何のために必要になるのかは、この後説明しますにゃ。
・フラグ=3(変数flgの値が3) 2枚目のカードがめくられるのを待っている状態ですにゃ。フラグ=1の時とおなじにゃんですけど、コンピュータがプレイしている時は、ちょっと事情が変わってきますにゃ。STEP6以降で出てくるコンピュータが考える処理は、実際には0.1秒かかるかどうかで終わってしまいますにゃ。でも、それだと見かけ上コンピュータが一瞬のうちに2枚のカードをめくったように見えてしまいますにゃ。そこで、あくまで見かけ上にゃんですけど、コンピュータが考えてカードを決めたように見せかけるために、フラグが3になる前にフラグ2の状態にして時間稼ぎをすることにしますにゃ。
・フラグ=4(変数flgの値が4) 2枚目のカードがめくられた後のウエイト状態ですにゃ。これは、人間同士で遊ぶ時にも必要なウエイトですにゃ。このウエイトがにゃいと…
 ・めくられた2枚のカードがおなじ時 神経衰弱のルールに従って、その2枚のカードは場から消える(実際にはcard-0.gif=何もにゃい画像に差し替えられる)ことになるんですけど、ウエイトを付けにゃいと2枚目のカードを表示した次の瞬間には2枚とも消えてしまうことになって、何が起こったのかわからにゃいうちにゲームが進んでしまいますにゃ。
 ・めくられた2枚のカードが違う時 神経衰弱のルールに従って、その2枚のカードは裏返しの状態に戻される(実際にはcard-10.gif=カードの裏の画像に差し替えられる)ことになるんですけど、ウエイトを付けにゃいと2枚目のカードを表示した次の瞬間には裏の画像に戻ってしまうことになって、これではカードを覚える暇がありませんにゃ。
・フラグ=5(変数flgの値が5) フラグ=4の状態が終わった後(2枚のカードが場から消えるか裏返しに戻された後)のウエイト状態ですにゃ。これは、次が人間の番の時には必要ありませんにゃ。次がコンピュータの番の時、このウエイトを付けにゃいと、フラグ=4の状態が終わった次の瞬間に1枚目にめくるカードが表示されることになってしまいますから、コンピュータが考えているように見せかけるためにちょっと時間稼ぎをしますにゃ。フラグ=5の状態が終わると、フラグ=1の状態に戻りますにゃ。
 ゲーム中は、フラグ=1〜フラグ=5の状態を繰り返すことになるんですけど、2枚のカードが揃ったかどうかの判定(揃った場合は得点を加算する等の処理)とまだ取れるカードがあるかどうかの判定は、フラグ=3の状態が終わる直前におこなわれますにゃ。具体的に言うと「まだ取れるカードがあればフラグ=4の状態にしてゲームを続ける」「もう取れるカードがにゃい時はフラグ=0の状態にしてゲーム終了処理に進む」ことになりますにゃ。

 ちょっと長くなりそうですから、3回に分けて作っていきますにゃ。まずは、人間のプレイヤーが最初の2枚をめくって、それが揃ったかどうかまで作りますにゃ。こういうものができると思いますにゃ。
function main()
{
※関係にゃい部分はちょっと省略しますにゃ
 document.hyoji.tm.value="0分0秒";
 teban=0;cardnum1=-1;cardnum2=-1;
 tims=0;times=0;flg=1;
}

// マウスクリック処理
function pic(n)
{
 if (flg==1)
 {
  h=charaput(n,p[n]);
 }
 if (flg==1 && player[teban]==0)
 {
  if (p[n]>0)
  {
   h=charaput(n,p[n]);
   cardnum1=n;
   flg=2;wait=0;
  }
 }
 if (flg==3 && player[teban]==0)
 {
  if (p[n]>0 && n!=cardnum1)
  {
   h=charaput(n,p[n]);
   cardnum2=n;
   h=hantei();
  }
 }
}

// カード獲得判定
function hantei()
{
 if (p[cardnum1]==p[cardnum2])
 {
  c="あたりにゃ♪";
 }
 else
 {
  c="はずれにゃ…";
 }
 document.hyoji.h1.value=c;
 flg=0;
}

// タイマー処理
function timerX()
{
 if (flg>=1)
 {
  tims=tims+1;
  if (tims%10==0)
  {
   times=times+1;
   a1=Math.floor(times/60);a2=times%60;
   document.hyoji.tm.value=""+a1+"分"+a2+"秒";
  }
 }
 if (flg==2)
 {
  wait=wait-1;
  if (wait<=0)
  {
   flg=3;
  }
 }
}
※この後はおなじですから省略しますにゃ

 「開始」をクリックした後、好きなカードを2枚クリックしてみてくださいにゃ。その2枚のカードがおなじなら「あたりにゃ♪」、違うカードだと「はずれにゃ…」と表示されますにゃ。当たってもはずれても、1回で終わりですにゃ。プログラム内でゲームが終了したと判断されて、時間が進まにゃくなりますにゃ。「開始」をクリックする前に「先攻」のプレイヤーとして「人間」以外を選択すると、プログラム内で「今はコンピュータの番」と判断されてカードをクリックしても何の反応もにゃい状態になりますにゃ。今までとおなじように、解説していきますにゃ。今までとおなじように、読み飛ばしてもかまいませんにゃ。
・「teban=0;cardnum1=-1;cardnum2=-1;」
 新しい変数を3つ使いますにゃ。変数tebanは、その時どっちの番かを表しますにゃ。0なら先攻の番、今はまだ使っていませんけど、1だと後攻の番ですにゃ。変数cardnum1は、1枚目のカードとしてめくられたのが何番目のカードにゃのかを表しますにゃ。ちょっとややこしいんですけど、その人(コンピュータも含む)が最初にめくったカードが、カード全体の何番目かってことですにゃ。今は「まだめくっていにゃい」という状態を表したいんですけど、ここで「cardnum1=0;」としてしまうと、困ったことになりますにゃ。カード全体は0枚目から数え始めるから、それだと0枚目(=左上角)のカードがすでにめくられたことになってしまいますにゃ。そこで、カードの番号としては存在しにゃい「-1」という値にしておきますにゃ。変数cardnum2は、2枚目のカードとしてめくったカードが何番目のカードにゃのかを表しますにゃ。あとはさっきとおなじですから説明は省略しますにゃ。
・「if (flg==1 && player[teban]==0)」「{」「}」
 条件にあてはまる時に{ }の中の命令を実行するっていう、例のあれですにゃ。今回は条件の書き方が違いますにゃ。順番に見ていきますにゃ。
・flg==1 これが1番目の条件で、「変数flgの値が1であるなら」っていう意味ですにゃ。これは、今までとおなじですにゃ。ここでは「ゲーム中の状態なら」っていうことになりますにゃ。
・&& これは、「かつ」という意味で、その前後にある2つの条件の両方ともにあてはまる時、全体として条件にあてはまることになりますにゃ。言い換えると、前後の条件のどちらか一方または両方に関して、それにあてはまらにゃい時は、全体として条件から外れるってことですにゃ。
※参考 それに対して「||」というものもあって、これは「または」という意味ですにゃ。前後の2つの条件の少なくともどちらか一方にあてはまる時、全体として条件にあてはまることになりますにゃ。「少なくとも」ですから、両方の条件を満たしている時も含まれますにゃ。わかりやすいかもしれにゃい例をあげてみますにゃ。
・新幹線に乗る時 「乗車券」と「特急券」の両方が必要ですにゃ。プログラムっぽく書くと「乗車券所持 && 特急券所持」になりますにゃ。両方の条件を満たすと新幹線に乗れますにゃ。
・路線バスに乗る時 その場で現金を払うこともできますし、前もって乗車券を買っておいても乗れますにゃ。プログラムっぽく書くと「現金所持 || 乗車券所持」になりますにゃ。どちらか一方を持っていればバスに乗れますし、もちろん両方とも持っていても乗れますにゃ。
・player[teban]==0 これが2番目の条件で、意味は「配列playerのteban番目の要素が0であるなら」にゃんですけど、わかりやすく言うと「先攻のプレイヤーが人間なら」ってことですにゃ。
 この2つの条件に関して両方ともそれにあてはまる時、わかりやすく言うと「ゲーム中で、先攻のプレイヤーが人間の時」に全体として条件にあてはまるから{ }の中の命令を実行することになりますにゃ。ちょっとややこしいんですけど、おわかりいただけましたかにゃ?
・「if (p[n]>0)」「{」「}」
 配列pのn番目の要素の値が0より大きい時に{ }の中の命令を実行しますにゃ。「>=」じゃにゃくて「>」ですから0は含まれませんにゃ。配列pの各要素はカードの中身を表していて、そのカードが取られて場から消えると0になるんですけど、まだその処理は作っていませんから、今のところこの条件から外れることはありませんにゃ。でも、後で必要になってきますから、今のうちに作っておきますにゃ。
・「h=charaput(n,p[n]);」
 STEP4で出てきたものとまったくおなじですにゃ。関数charaputを呼び出して、めくられたカードの画像を表示しますにゃ。
・「cardnum1=n;」
 変数nの値(=クリックしたカードの番号)を変数cardnum1に代入しますにゃ。わかりやすく言うと、最初にめくったカードが何番目だったか覚えておくってことですにゃ。
・「flg=2;wait=0;」
 これで、フラグ=1の状態(1枚目のカードがめくられるのを待っている状態)は終わりましたから、次の状態に移行するために変数flgの値を2にしますにゃ。ここで、さっき説明したウエイトを設定するんですけど、今は人間の番で、次にカードをめくるのも人間ですから、ウエイトは必要ありませんにゃ。でも、「必要にゃいから何も設定しにゃい」だと後で都合の悪いことになりますから、便宜上0という値を設定しておきますにゃ。
・「if (flg==3 && player[teban]==0)」「{」「}」
 さっきとおなじにゃんですけど、もう1回さらっと説明しますにゃ。2つの条件に関して、両方ともそれにあてはまる時、全体として条件にあてはまることになって、{ }の中の命令を実行しますにゃ。この場合は、「変数flgの値が3で、かつ、配列playerのteban番目の要素が0であるなら」わかりやすく言うと2枚目のカードがめくられるのを待っている状態で、その時のプレイヤーが人間であるなら{ }の中の命令を実行するってことですにゃ。さっき、フラグ=1の状態が終わってフラグ=2の状態に移行する命令を書きましたにゃ。フラグ=2からフラグ=3に移行する命令は、後で出てきますにゃ。
・「p[n]>0 && n!=cardnum1」「{」「}」
 1枚目の時はひとつだった条件が、ここでは2つになっていますにゃ。最初の条件はおなじで、配列pのn番目の要素の値が0より大きいなら、わかりやすく言うとそのカードがまだ場にあるならってことにゃんですけど、カードが取られる処理はまだ作っていませんから、今のところこの条件から外れることはありませんにゃ。ここで大事なのは2番目の条件で、「変数nの値が変数cardnum1の値と違っていたら」わかりやすく言うと最初にクリックしたカードとは別のカードをクリックしたらっていう条件ですにゃ。これがにゃいと、おなじカードを2回続けてクリックした時に、2枚(実際にはおなじ1枚)の数字がおなじ=当たりにゃ♪ ってことになってしまいますにゃ。それを避けるために、2つの条件に関して両方ともそれにあてはまる時に…ってことにしてるんですにゃ。「!=」は「そうではにゃい」または「左の値と右の値は違う」っていう意味の記号で、「==」と反対の意味ですにゃ。「!」をキーボードから入力する時は、「Shift」を押しにゃがら数字の「1」(テンキーは不可)を押すと出ますにゃ。
・「h=charaput(n,p[n]);」
 さっきとおなじですにゃ。関数charaptを呼び出して、2枚目としてめくったカードの画像を表示しますにゃ。
・「cardnum2=n;」
 これもさっきとおなじで、2枚目としてめくったカードの番号を変数cardnum2の値として覚えますにゃ。
・「h=hantei();」
 関数hanteiを呼び出して実行しますにゃ。そこでにゃにをするのかは、このあと説明しますにゃ。
・「function hantei()」「{」「}」
 hanteiという名前の関数の始まりと終わりですにゃ。この中でめくられた2枚のカードがおなじかどうか判定して、他にもいろいろ処理しますにゃ。
・「if (p[cardnum1]==p[cardnum2])」「{」「}」「else」「{」「}」
 配列pのcardnum1番目の要素の値と配列pのcardnum2番目の値がおなじであるなら{ }の中の命令を、そうでにゃい場合はelseの後の{ }の中の命令を実行しますにゃ。わかりやすく言うとめくられた2枚のカードがおなじかどうかで実行する命令が変わるってことですにゃ。
・「c="あたりにゃ♪";」
 条件にあてはまる(2枚のカードがおなじ)場合は、変数cに「あたりにゃ♪」という文字列を代入しますにゃ。そうでにゃい場合もおなじことですから説明は省略しますにゃ。
・「document.hyoji.h1.value=c;」
 変数cの値(文字列)を表示しますにゃ。どういう時にどっちの文字列が表示されるのか、もう説明しにゃくてもわかりますにゃ?
・「flg=0;」
 フラグを0にして、ゲームが終わった状態に移行しますにゃ。ここでは1回だけのゲームということでこうなっていますけど、実際にはまだゲームが続いてフラグ=4の状態に移行することもありますにゃ。その判定と処理は、あとで作りますにゃ。
・「if (flg==2)」「{」「}」
 ここから先は、関数timerXの中にある命令ですから、0.1秒ごとに自動的に実行されますにゃ。フラグ=2の状態(1枚目のカードをめくった後のウエイトの状態)の時、{ }の中の命令を実行しますにゃ。
・「wait=wait-1;」
 変数waitの値を1減らしますにゃ。今のところ、フラグが1から2に移行した時、変数waitの値は0ですにゃ。「今のところ」ですから、そのうち「そうではにゃい場合」も出てくるってことですにゃ。
・「if (wait<=0)」「{」「}」
 変数waitの値が0以下であるなら、{ }の中の命令を実行しますにゃ。今のところ、この時点で変数waitの値は-1ですにゃ(わかりますかにゃ?)だから、この条件には必ずあてはまることになりますにゃ。そのうち「そうではにゃい場合」も出てきますにゃ。
・「flg=3;」
 変数flgの値を3にすることで、フラグ=3(2枚目のカードがめくられるのを待っている状態)に移行しますにゃ。
 こうやって文章で説明すると長く感じるかもしれにゃいんですけど、ここではウエイトを使っていませんから実際には0.1秒未満でここまで終わることになって、神業的なスピードで2枚のカードを続けてクリックしたとしても、ちゃんと動作するはずですにゃ。

 次に、「ひとり神経衰弱」で遊べるところまで作りますにゃ。(1)神経衰弱のルールに従って、2枚のカードが揃ったらそのカードが場から消えて1点が加算される(2)2枚のカードが揃わにゃかった時はその2枚が裏返しに戻される(3)取れるカードがなくなったら終わり ここまで作りますにゃ。くるくるカードとラッキーカードは、今のところ、普通のカードとおなじように扱われますにゃ。こういうものができると思いますにゃ。
<html>
<head>
<title>神経衰弱♪</title>
<script language="JavaScript">
<!--
tims=0;times=0;flg=0;
var player=new Array(2);var p=new Array(30);var score=new Array(2);
var gz=new Array(11);
for (i=0;i<=10;i++) {gz[i]=new Image(48,60);}
for (i=0;i<=10;i++) {gz[i].src="./card-"+i+".gif";}

// メイン
function main()
{
※関係にゃい部分はちょっと省略しますにゃ
 document.hyoji.tm.value="0分0秒";
 document.hyoji.sc1.value="0点";document.hyoji.sc2.value="0点";
 document.hyoji.h1.value="【先攻】の番ですにゃ";
 if (player[0]==0) {c="1枚目のカードをクリックしてくださいにゃ";} else {c="";}
 document.hyoji.h2.value=c;
 if (gametype<=1) {cardkazu=30;} else {cardkazu=28;}
 teban=0;cardnum1=-1;cardnum2=-1;score[0]=0;score[1]=0;
 tims=0;times=0;flg=1;
}

// カード獲得判定
function hantei()
{
 if (p[cardnum1]==p[cardnum2])
 {
  c="あたりにゃ♪";
  score[teban]=score[teban]+1;
  document.hyoji.sc1.value=score[0]+"点";
  document.hyoji.sc2.value=score[1]+"点";
  cardkazu=cardkazu-2;
  p[cardnum1]=0;p[cardnum2]=0;
 }
 else
 {
  c="はずれにゃ…";
 }
 document.hyoji.h2.value=c;
 flg=0;
 if (cardkazu<=0)
 {
  document.hyoji.h1.value="ゲーム終了にゃ♪";
  document.hyoji.h2.value="[開始]をクリックするともう1回遊べるのにゃ";
  flg=0;
 }
 else {wait=10;flg=4;}
}

// タイマー処理
function timerX()
{
※関係にゃい部分はちょっと省略しますにゃ
 if (flg==2)
 {
  wait=wait-1;
  if (wait<=0)
  {
   if (player[teban]==0) {c="2枚目のカードをクリックしてくださいにゃ";} else {c="";}
   document.hyoji.h2.value=c;
   flg=3;
  }
 }
 if (flg==4)
 {
  wait=wait-1;
  if (wait<=0)
  {
   if (p[cardnum1]==0) {a=0;} else {a=10;}
   h=charaput(cardnum1,a);h=charaput(cardnum2,a);
   cardnum1=-1;cardnum2=-1;
   h=carddataput();
   wait=0;flg=5;
  }
 }
 if (flg==5)
 {
  wait=wait-1;
  if (wait<=0)
  {
   if (player[teban]==0) {c="1枚目のカードをクリックしてくださいにゃ";} else {c="";}
   document.hyoji.h2.value=c;
   flg=1;
  }
 }
}
 ここまでで、例えば「灰色の部分の表示を手で隠しにゃがら遊ぶ」とか、「1分以内に全部取れたら勝ちというルールを自分で決める」とかいう感じにすると、1人用のゲームとして遊べるものができたって言えるかもしれませんにゃ。また解説していきますにゃ。読み飛ばしても大丈夫ですにゃ。
・「var score=new Array(2);」
 配列scoreを使うという宣言をしますにゃ。今は1人用ですけどすぐに2人で遊ぶゲームになりますから、最初から2人分の得点を記憶させるための配列を作っておきますにゃ。
・「document.hyoji.sc1.value="0点";document.hyoji.sc2.value="0点";」
 2人分の得点を「0点」と表示しますにゃ。これは、最初にゲームをする時には必要にゃいんですけど、2回目以降は前回の得点表示が残ってしまうことになりますから、ゲームを始めるたびに書き直すことにしますにゃ。
・「document.hyoji.h1.value="【先攻】の番ですにゃ";」
 2人で遊ぶ時に、今どっちの番にゃのかわからにゃいと困りますから、黄色い小部屋の中に表示させることにしますにゃ。お好きな言葉に変更しても問題ありませんにゃ。
・「if (player[0]==0)」「{」「}」「else」「{」「}」
 配列playerの0番目の要素が0、つまり、先攻のプレイヤーが人間なら、{ }の中の命令を実行しますにゃ。そうじゃにゃい場合は、elseの後の{ }の中の命令を実行しますにゃ。
・「c="1枚目のカードをクリックしてくださいにゃ";」
 先攻のプレイヤーが人間の時、にゃにをしたらいいのかわからにゃいと困りますから、画面に表示して教えてあげるための文字列を作りますにゃ。
・「c="";」
 そうじゃにゃい場合(先攻がコンピュータの時)は、そういう表示は必要ありませんから、何もにゃい文字列を作りますにゃ。
・「document.hyoji.h2.value=c;」
 作った文字列を表示しますにゃ。「【先攻】の番ですにゃ」と合わせて2行の言葉が表示されましたにゃ。
・「if (gametype<=1)」「{」「}」「else」「{」「}」
 変数gametypeの値が1以下(ゲームタイプAまたはBを選択した)か、そうではにゃい(ゲームタイプCまたはDを選択した)かで、実行する命令が変わりますにゃ。
・「cardkazu=30;」「cardkazu=28;」
 変数cardkazuは、ゲームが終わるまでに取ることのできるカードの枚数を表しますにゃ。ゲームタイプAまたはBの時は30枚全部取れますにゃ。ゲームタイプCまたはDは、最後に2枚余るルールですから取れるカードは28枚になりますにゃ。
・「score[0]=0;score[1]=0;」
 配列scoreの0番目と1番目の要素の値を0にしますにゃ。わかりやすく言うと、2人の得点を0点にしてからゲームを始めるってことですにゃ。
・「score[teban]=score[teban]+1;」
 配列scoreのteban番目の要素に1を加えますにゃ。わかりやすく言うと、カードが揃ったからその時の順番の人の得点が1点増えるってことですにゃ。
・「document.hyoji.sc1.value=score[0]+"点";」
 先攻のプレイヤーの得点を表示しますにゃ。次の行もおなじことですから説明は省略しますにゃ。
・「cardkazu=cardkazu-2;」
 この時点ではまだ画面上でもプログラム内でもカードは残っているんですけど、場のカードが2枚減ることは確定していますから、取れるカードの枚数を表す変数cardkazuの値を2減らしますにゃ。
・「p[cardnum1]=0;」
 配列pのcardnum1番目の要素の値を0にしますにゃ。わかりやすく言うと、1枚目にめくったカードは揃って取られたからもうにゃい状態にするってことですにゃ。次の命令もおなじことですから説明は省略しますにゃ。これで、プログラム内で2枚のカードがなくなりましたにゃ。
・「flg=0;」
 さっきまでは、1回で終わりのゲームでしたから、揃ったかどうかに関係にゃくフラグ=0(この場合はゲーム終了後の状態)にしていたんですけど、今はそうではありませんから、この行は消しますにゃ。
・「if (cardkazu<=0)」「{」「}」
 変数cardkazuの値が0以下(取れるカードがもうにゃい状態)なら{ }の中の命令を実行しますにゃ。この後の2行の説明は省略しますにゃ。
・「flg=0;」
 ここで、フラグ=0(ゲーム終了後の状態)に移行させますにゃ。
・「else」「{」「}」
 変数cardkazuの値が0以下ではにゃい(取れるカードがまだある状態)なら{ }の中の命令を実行しますにゃ。
・「wait=10;flg=4;」
 変数waitの値を10、変数flgの値を4にしますにゃ。わかりやすく言うと、ウエイトの値を10に設定して、2枚のカードがめくられた後のウエイト状態に移行するってことですにゃ。「ウエイトの値」は、関数timerXを何回実行したか、言い換えるとウエイトの値×0.1秒経過したかどうかを判断するのに使いますから、この場合の待ち時間は約1秒ですにゃ。(多少の誤差が出ることもありますにゃ)
・「player[teban]==0」「{」「}」「else」「{」「}」
 配列playerのteban番目の要素の値、つまり、その時のプレイヤーが人間かコンピュータかによって、実行する命令が変わりますにゃ。命令の内容と、その後どうするのかは、前に説明したこととおなじですから、説明は省略しますにゃ。
・「if (flg==4)」「{」「}」
 変数flgの値が4(2枚のカードがめくられた後のウエイト状態)の時、{ }の中の命令を実行しますにゃ。
・「wait=wait-1;」
 変数waitの値を1減らしますにゃ。この場合、変数waitは10に設定されていましたから、この命令を10回実行するまで次の行の条件にはあてはまらにゃいことになりますにゃ。
・「if (wait<=0)」「{」「}」
 変数waitの値が0以下(この場合は約1秒が経過した後)なら、{ }の中の命令を実行しますにゃ。
・「if (p[cardnum1]==0) {a=0;} else {a=10;}」
 ここでは、1枚目のカードが「もうにゃい=揃ったから取られた」のか「まだある=揃わにゃかったから裏返しに戻される」のかによって、変数aの値(次の命令で画像番号を指定するのに使う)を決めますにゃ。2枚目のカードは、1枚目のカードとおなじことになっているに決まっていますから、判定の対象にしませんにゃ。
・「h=charaput(cardnum1,a);」
 関数charaputを呼び出して、cardnum1番目の画像をa番目の画僧に差し替えますにゃ。わかりやすく言うと「カードが揃った時は『何もにゃい』の画像」「揃わにゃかった時はカードの裏の画像」に差し替えますにゃ。次の命令もおなじことですから説明は省略しますにゃ。
・「cardnum1=-1;cardnum2=-1;」
 今の順番でめくった2枚のカードに関する処理は終わりましたにゃ。このあと、めくったカードを覚えておく必要はありませんから、カードをめくる前の状態に戻しますにゃ。
・「h=carddataput();」
 関数carddataputを呼び出して、灰色の部分の表示を書き直しますにゃ。これは、実際のゲームでは使いませんにゃ。
・「wait=0;flg=5;」
 今のところ、コンピュータがプレイする処理は作っていませんから、ウエイトを0にしてフラグ=5の状態に移行しますにゃ。
・「if (flg==5)」「{」「}」
 変数flgの値が5(2枚のカードが消えるか裏返しに戻された後のウエイト状態)の時、{ }の中の命令を実行しますにゃ。フラグ=5に移行する時に変数waitの値を0にしましたから、color=red>この条件には必ずあてはまることになって、この範囲内の命令はフラグ=4の命令が実行された後、続けて実行されますにゃ。
・「wait=wait-1;」
 変数waitの値を1減らしますにゃ。今のところ、ウエイトは0になっていますから、変数waitの値は-1になりますにゃ。
・「if (wait<=0)」「{」「}」
 変数waitの値は-1ですから、必ず条件を満たすことになりますにゃ。このあたりの話は、コンピュータがプレイするようになると、事情が変わってきますにゃ。
・「if (player[teban]==0)…」
 さっきとおなじですにゃ。次が人間の番なら「1枚目のカードを…」の表示をしますにゃ。
・「flg=1;」
 変数flgの値を1にして、フラグ=1(1枚目のカードがめくられるのを待っている状態)に戻しますにゃ。

 最後に、STEP5のサブタイトル「人間同士の神経衰弱」を作りますにゃ。プログラム内でやることは、1人でも2人でもあんまり変わりませんから、今まで作ってきたものに、ちょっと書き加えるだけでできますにゃ。くるくるカードとラッキーカードは、今のところ、普通のカードとおなじように扱われますにゃ。こういうものができると思いますにゃ。
// タイマー処理
function timerX()
{
※関係にゃい部分はちょっと省略しますにゃ
 if (flg==4)
 {
  wait=wait-1;
  if (wait<=0)
  {
   if (p[cardnum1]==0) {a=0;} else {a=10;}
   h=charaput(cardnum1,a);h=charaput(cardnum2,a);
   cardnum1=-1;cardnum2=-1;
   if (a==10)
   {
    if (teban==0) {teban=1;c="【後攻】";}
    else {teban=0;c="【先攻】";}
    document.hyoji.h1.value=c+"の番ですにゃ";
   }
   h=carddataput();
   wait=0;flg=5;
  }
 }
※関係にゃい部分はちょっと省略しますにゃ
}
 たったこれだけですにゃ。これで、近くにお友達やご家族がいる人は、2人用の神経衰弱で遊べるようになりましたにゃ。例によって、追加した部分の解説をしますにゃ。読み飛ばしても大丈夫ですにゃ。
・「if (a==10)」「{」「}」
 変数aは、さっきカードの画像を表示する(取られてなくなったり裏返しに戻されたりしたように見える画像に差し替える)ために使ったんですけど、都合がいいからこれを再利用しますにゃ。変数aの値が10になるのは2枚のカードが揃わにゃかった時ですにゃ。その時に{ }の中の命令を実行しますにゃ。
・「if (teban==0) {teban=1;c="【後攻】";}」
 変数tebanの値が0である時、変数tebanの値を1にして、文字列cを「【後攻】」にしますにゃ。わかりやすく言うと先攻の番だった時、カードを揃えられにゃかったから後攻と交代するってことですにゃ。
・「else {teban=0;c="【先攻】";}」
 そうではにゃい時、変数tebanの値を0にして、文字列cを「【先攻】」にしますにゃ。にゃにを言っているのか、もう説明しにゃくてもわかりますにゃ?
・「document.hyoji.h1.value=c+"の番ですにゃ";」
 手番が変わったから、そのことを画面に表示してプレイヤーに教えますにゃ。

次へ進む  [目次]  [STEP0]  [STEP1]  [STEP2]  [STEP3]  [STEP4]  [STEP5]  [STEP6]  [STEP7]  [終わりに]