ケータイFlashゲーム制作レクチャー

第9回カードゲームレクチャー(3)めくったカードとその判定!!

インタラクティブにゲームを動かす!これぞボタンアクション!

前回に続いて、今回もバリバリとスクリプトを書くぞぉ!このゲームの肝!!スクリプトは長いけれど、しっかりと読むピ~ィ!" width="415" height="164" />

めくるカードを選択させる(続)

まずは、前回の続きから。前回は、めくることの出来るカードを示すためにカードに選択候補枠を点滅させた。今回はこの枠を移動させる仕掛けの話から。

(4)選択候補枠移動の仕掛け

スクリプトを記述する場所は、phase3に置いたボタン。汎用ボタンのオブジェクトアクションとして記述する。なお、ここには5キー押下時にカードをめくる処理のスクリプトも記述してあるがこの解説は項を改めることとして、とりあえずは4キー、6キー押下時の処理のみ解説する。

Fla画面1 選択候補枠移動処理のスクリプトの記述場所
Fla画面1 選択候補枠移動処理のスクリプトの記述場所

ここに記述するスクリプトは次のようなものだ(5キー押下時の処理は省略⁠⁠。

List1 選択候補枠移動処理のスクリプト
//6キー押下時(選択候補枠移動(→))・・・・・・①
on (keyPress "6") {
  //次の候補インデックスを検索・・・・・・②
  flg=0;
  do{
    targetIndex++;・・・・・・③
    targetIndex%=8;
    flg = Eval("CardLook" add targetIndex);
  } while(flg);
  //候補インデックスに対応するカードに候補枠を付加
  if(selectCard1・・・・・・④
      gotoAndStop( ../:targetIndex+1); 
    }
  }
  else{         //2枚目の選択時
    tellTarget("Target2"){ 
      gotoAndStop( ../:targetIndex+2);  
    }
  }
}
//4キー押下時(選択候補枠移動(←)) ・・・・・・⑤
on (keyPress "4") {
  //次の候補インデックスを検索
  flg=0;
  do{
    targetIndex+=7; ・・・・・・⑥
    targetIndex%=8;
    flg = Eval("CardLook" add targetIndex);
  } while(flg);
  //候補インデックスに対応するカードに候補枠を付加
  if(selectCard1

List1についてポイントとなる所に項番を付した。この順に解説していこう。

  •  6キー押下時は、右送りに選択が移ることになる。これはCardの連番を昇順に数えていく動きとなる。

    矢印の順で選択枠が移っていく
  •  次の候補インデックスを検索する。すでにペアが揃ってしまい場に存在しなくなったカードは、該当するCardLockに"1"がセットされているため、この値が"0"になるまで処理を繰り返すことにより、次の"めくれるカード"を発見することができる。

  •  式targetIndex++は、変数targetIndexへの1加算を示す。これを繰り返していくとすぐにtargetIndexが上限値である"7"を超えてしまうが、次の行にある式targetIndex%=8により、その値が8になると0にリセットされる。これは%が剰余算(割り算の余りを求める演算)を行う演算子であるためだ。このようにある範囲の数値を循環して利用したいような場合、%演算を利用すると、

    if (targetIndex == 8) {
        targetIndex = 0;
    }

    などとif文を使って値を記述するよりも、幾分処理効率がよく、またコードがスマートである。

  •  ②で決定した候補インデックスに対応するカードに候補枠を付加する。これは選択候補クリップのインスタンスTarget1もしくはTarget2の表示フレームをgotoAndStopで変更してあげればよい(この時、選択候補クリップは1枚目用と2枚目用で空白フレームの分フレーム番号が1つずれている点注意すること。⁠⁠。

  •  今度は、4キー押下時。左送りに選択が移ることになる。つまりCardの連番を降順に数えていく動きとなる。

    矢印の順で選択枠が移っていく
  •  ③がtargetIndex++だったから、今度はtargetIndex--だと思った人!

    ・・・残念でした。それだとtargetIndexあえてtargetIndex+=7と7加算することにより、次の行の式targetIndex%=8で余りを求め、結果的に-1させるように作るのだ。この方が、形が③と揃いスマートでしょっ!! 実にちょっとしたことだけれども、こうした点にこだわりが持てるとスクリプトがグッとカッコよくクールに見えるのだ。

いよいよカードをめくる

続いて5キー押下時の処理。カードをめくる仕掛けだ。前項にも記したように、このスクリプトもphase3においたボタンのオブジェクトアクションとして記述する。

List2 カードをめくる処理のスクリプト
//5キー押下時(決定)  ・・・・・・①
on (keyPress "5") {
  //カードを表にする  ・・・・・・②
  tellTarget("CardPlay/Card"add targetIndex ){
    gotoAndStop( Eval("../../:CardVal" add  ../../:targetIndex));
  }
  //カードをロック状態にする
  set("CardLook" add targetIndex, 1);
  if(selectCard1 ・・・・・・③
    selectCard1 = targetIndex;  //1枚目の選択インデックスを保存
    //次の候補インデックスを検索
    flg=0;
    do{
      targetIndex++;
      targetIndex%=8;
      flg = Eval("CardLook" add targetIndex);
    } while(flg);
    //候補インデックスに対応するカードに候補枠を付加
    tellTarget("Target2"){
      gotoAndStop( ../:targetIndex+2);  
    }
  }
  else{          //2枚目の選択時  ・・・・・・④
    selectCard2 = targetIndex; //2枚目の選択インデックスを保存
    //2枚のカードのナンバーが同じか確認する

                    List3を参照                   

  }
}

List2についてもポイントとなる所に項番を付した。やはりこの順に解説する。

  •  5キー押下時は、カードをめくる動きとなる。これは、カードの表を表示するブロック、1枚目のカードがめくられた後の処理をするブロック、2枚目のカードがめくられた後の処理をするブロックの3つのブロックからなる。

  •  カードの表を表示する。Card0~Card7の表面となるマークやナンバーのフレーム番号は、それぞれ変数CardVal0~CardVal7に保存されている。また、めくるべきカードの番号は変数targetIndexに保持されている。

    したがって、"CardPlay/Card" add targetIndexの表示フレームをgotoAndStopで変数"CardVal" add targetIndexの値に移動してやれば、カードはめくられることになる。

    めくられたカードは、もう一度選択されることがない様にロック状態とする。これは変数"CardLock" add targetIndexの値を1とすればよい。

  •  めくられたのが1枚目か2枚目かで、次の処理が変わってくる。1枚目の時は、まず、変数targetIndexの値を変数selectCard1に保存(これにより、逆に式selectCard1の判定により現在めくられたカードが1枚目か2枚目かを見分ける事も可能となる⁠⁠、次の選択候補を検索し(これは前項の②と同様の処理である。⁠⁠、2枚目用の選択候補枠を表示状態とする。

  •  めくられたのが2枚目の時は、変数targetIndexの値を変数selectCard2に保存した後、めくられた2枚のカードのナンバーが同じかどうかチェックする。これについては、さらに項を分けて解説しよう。

2枚のカードのナンバーが同じかどうかの判定

さて、長々とワンボタンのアクションを解説しているが、いよいよそれも最終段階。めくられた2枚のカードが同じナンバーかどうかの判定だ。

List3 2枚のカードの一致をチェックするスクリプト
//2枚のカードのナンバーが同じか確認する
    n1 = -1;  ・・・・・・①
    n1 += Eval("CardVal" add selectCard1);  ・・・・・・②
    n1 %= 13;  ・・・・・・③
    n2 = -1;  ・・・・・・④
    n2 += Eval("CardVal" add selectCard2);
    n2 %= 13;
    if(n1 == n2){             //同じ時  ・・・・・・⑤
      gotoAndPlay("phase4a");
    }
    else{                     //違う時
      gotoAndPlay("phase4b");
    }

List3は短いがプログラミングに慣れていない人には、理解しづらい部分だと思う。項番の順に細かく見て行こう。

  •  変数n1は、1枚目のカードのナンバーの値を代入するために用意した。初期値を-1としているのは、②、③の式を簡略して記述するためである。

  •  カードクリップの2~53フレームには、Fla画面2のように、A(=1⁠⁠~K(=13)が4回繰り返しで並んでいる。したがって、あるカードのナンバーの値は、(フレーム番号-1)÷13の余りを計算すれば良い。ここでn1は、あらかじめ-1で初期化されているため単純に"CardVal" add selectCard1の値を足しこむことにより、めくられた1枚目のカードの(フレーム番号-1)の値を取ることになる。

    Fla画面2 カードクリップの内部。各カードが並んでいる
    Fla画面2 カードクリップの内部。各カードが並んでいる
  •  あとは、剰余算%を使って13で割った余りを代入すれば、変数n1は1枚目のカードのナンバーの値となる。

  •  同様の計算を行い変数n2に2枚目のカードのナンバーの値を代入する。

  •  2つの変数n1とn2の値を比較し、等しければ「2枚のカードのナンバーは同じ」としてphase4aに、等しくなければ「2枚のカードのナンバーは異なる」としてphase4bに処理を移す。

今回は、神経衰弱のための判定として、2枚のカードのナンバーの一致を確認する方法を取り上げた。しかし、ゲームによっては、2枚のカードのマークが同じかどうか知りたい場合もあるだろう。しかし、この場合も悩む必要はまったくない。マークの一致を確認したい場合は、(フレーム番号-1)÷13を計算すれば良いのだ。今回使っているカードクリップの場合、式の解が0ならダイヤ、1ならクラブ、2はハート、そして3はスペードと計算することが可能なのである。

9回目はここまで!前回+今回とスクリプト満載になったけれど、カードゲームのコア部分なので、Flaファイルも参考にしつつ習得を目指そう!次回は、いよいよゲームの完成!楽しみに待つのだ! ピピ~ィ!

おすすめ記事

記事・ニュース一覧