このページでは、ゲームの監督スクリプトを記述していきます。制作手順1-1で書きましたように、ワガハイ式7ならべではゲームの進行については全て監督スクリプト任せになります。よって、監督スクリプトの主なお仕事を書き出すと以下のようになります。
・トランプ山札をシャッフルして、各プレイヤーにカード配布
・手札に7のカードがあった場合は開始前に場に出す
・自分のターンに場に出すカードを選択、出せない場合はパス
・CPUが(とあるルールにのっとり)場に出すカードを選択、出せない場合はパス
・各プレイヤー0枚になったらあがり、順位表示
細かいことを言うとまだまだあるんですが、主な所はこんな感じです。これらを順番に実装していきましょう!
まずはゲーム開始前の挙動として、山札をシャッフルして、各プレイヤーにカード配布するスクリプトを書いていきます。
その前に、まずは各カードの定義をしていきましょう。前回までで頑張って52枚のトランプオブジェクトを作成しましたが、これからスクリプトを書く都合上、各トランプオブジェクトとマーク・数字情報とが紐づいてる方が扱いやすいので、これらを関連付けてあげましょう。今回は、構造体を用いて、関連付けていきます。
構造体とは、関連情報を一固まりにしたものを指します。例えば、「人」という構造体の場合、「名前」「性別」「国籍」「身長」「体重」…といった情報を一固まりにして扱う仕組みです(Unityでは同様のものに「クラス」という仕組みがありますが、構造体の方が使用機能が限られていて、その分軽い、とのこと)。
今回は、下のような「TrumpCard」という構造体を作成します。
public struct TrumpCard{ public int mark; //カードのマーク…クローバー:0、ダイヤ:1、ハート:2、スペード:3 public int number; //カードの数字 …1~13 public GameObject cardobject; //カードのオブジェクト public Vector3 defaultpos; //カード配置位置(場に並べる時) }
例えばクローバー6の構造体(名称:cardex)を作った場合は、以下のように値を定義します。
・cardex.mark=0(:クローバー)
・cardex.number=6(:数字そのまま)
・cardex.cardobject=「名称『card_c06』のオブジェクト」
・cardex.defaultpos=Vector3(6.5f,0.15f,0f)(場に出す位置、解説は後程)
なお中の変数は外から直接編集しますので、各変数の定義にpublicを付けておくのを忘れないようにしましょう。
次に、Startメソッド中に以下のスクリプトを書くことで、52枚のカードを定義していきます。要するに、先程クローバー6の構造体を上のように定義したのと同様に全52枚のカードを定義していきます。
//Startメソッド前に定義 List<TrumpCard> deckcards = new List<TrumpCard>(); //以下Startメソッド内 int i = 0; int j = 0; string[] markcode = {"c","d","h","s"}; //山札作成(シャッフルする) this.deckcards.Clear(); for (j = 0; j < 4; j++){ for (i = 1; i <= 13; i++){ TrumpCard card = new TrumpCard(); card.mark = j; card.number = i; card.cardobject = GameObject.Find("card_" + markcode[j] + card.number.ToString("D2")); card.defaultpos = new Vector3(1.3f*(i-1),0.15f,2.0f*j); this.deckcards.Add(card); } }
各card構造体を定義した後、最後に山札をイメージした動的配列deckcardsに組み込んでいきます。これは、次に山札シャッフルをするための準備作業になっています。
次に、山札シャッフルを行うスクリプトを書いていきます。先程、山札をイメージした動的配列deckcardsに52枚のカードが組み込まれましたが、現状ではマーク・数字順にキレイに並んだ山札になっています。この動的配列の要素順をランダムに入れ替えることで、順番をシャッフルしていきましょう。そのためのスクリプトが次のようになります。
private List<TrumpCard> Shuffle(List<TrumpCard> list){ for (int i = 0; i < list.Count; i++){ //list[i]とlist[randomnum]を順番入れ替え TrumpCard temp = list[i]; int randomnum = Random.Range(0, list.Count); list[i] = list[randomnum]; list[randomnum] = temp; } return list; }
本スクリプトにより、順番入れ替え作業が52回発生し、シャッフルした山札が完成する、という要領です。
今回、トランプ山札のシャッフルまでスクリプト化しました。次回は、各プレイヤーにカードを配布する手続きから書いていきます。次回で一気に、ゲーム開始までの準備過程を書き上げていきます。よろしくお願いします!!