Categories: making

ゲーム「ワガハイ式7ならべ」 制作手順2-1

監督スクリプトを記述しよう

このページでは、ゲームの監督スクリプトを記述していきます。制作手順1-1で書きましたように、ワガハイ式7ならべではゲームの進行については全て監督スクリプト任せになります。よって、監督スクリプトの主なお仕事を書き出すと以下のようになります。

・トランプ山札をシャッフルして、各プレイヤーにカード配布

・手札に7のカードがあった場合は開始前に場に出す

・自分のターンに場に出すカードを選択、出せない場合はパス

・CPUが(とあるルールにのっとり)場に出すカードを選択、出せない場合はパス

・各プレイヤー0枚になったらあがり、順位表示

細かいことを言うとまだまだあるんですが、主な所はこんな感じです。これらを順番に実装していきましょう!

スクリプトを書こう1(シャッフル&配布)

まずはゲーム開始前の挙動として、山札をシャッフルして、各プレイヤーにカード配布するスクリプトを書いていきます。

各カードの定義

その前に、まずは各カードの定義をしていきましょう。前回までで頑張って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.defaultpos)については前回のページでも示したように、右図のような配置になりましたので、式に直すと上のようになります。先程例に挙げましたクローバー6の場合、i=6、j=0なので、確かにcard.defaultpos = (6.5f,0.15f,0f)になりますね!

各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回発生し、シャッフルした山札が完成する、という要領です。

最後に

今回、トランプ山札のシャッフルまでスクリプト化しました。次回は、各プレイヤーにカードを配布する手続きから書いていきます。次回で一気に、ゲーム開始までの準備過程を書き上げていきます。よろしくお願いします!!

r_yoshi

Recent Posts

ゲーム「ワガハイ式テトリス」 制作手順4-2

監督スクリプトを記述しよう(ブ…

5年 ago

動的配列(List型)のご紹介と活用法

こちらのページでは、Unity…

5年 ago

ゲーム「ワガハイ式テトリス」 制作手順4-1

監督スクリプトを記述しよう(ブ…

5年 ago

ゲーム「ワガハイ式ビリヤード」 制作手順2-5

監督スクリプトを記述しよう こ…

5年 ago

ゲーム「ワガハイ式テトリス」 制作手順2-1

テトリミノに付けるスクリプトを…

5年 ago

ゲーム「ワガハイ式ぷよぷよ」 制作手順3-2

各ぷよに付けるスクリプトを記述…

5年 ago