Unityで「しちならべ」を作る(5)
こんにちは「つけらっとゲームス」プログラム担当のとちです。
情報系学科のある専門学校で、外部講師として「七並べ」のシステム設計を授業で扱ったこともあり解答例として設計書を作りながら、Unityで「しちならべ」を作ったお話です(前回分はコチラ ↓ )
「ゲームを作ってみよう!」と考えている方、「ゲーム作りってどんな感じ?」と興味がある方向けの記事です。
ちなみに専門学校の外部講師としての記事はこんなのがあります。ご興味がございましたら以下もご覧くださいね。
前回は「どの手札が出せるのか?」判断する方法をお話しました。
今回は山札をシャッフルしてプレイヤー1名と対戦相手となるCOM1~3に手札を配る部分を考えてみましょう。
シャッフルする前に…
七並べと言えば手札を見て「出す札」or「止める札」を判断し敵にパスをさせて自分の手札を全部出すのが目的です。
その手札が毎回同じだと飽きます。そこで山札(トランプ全体)を切る必要がありますよね。
前回、トランプのカードをデータとして持つように変数定義しました。
以下に再掲しますね。
//─────────────────────────────────────────────────────
// CardFull トランプのカードデータ
//─────────────────────────────────────────────────────
public struct CardFull //
{ //
static public int[] CardID = new int[53]; //【変数定義】トランプ - カードID
static public int[] CardPt = new int[53]; //【変数定義】トランプ - 数値 [1]A [11]J [12]Q [13]K [15]ジョーカー
static public int[] CardMk = new int[53]; //【変数定義】トランプ - マーク [1]スペード [2]ハート [3]ダイヤ [4]クラブ [5]ジョーカー
static public int[] CardPos = new int[53]; //【変数定義】トランプ - 場所 [0]山札 [1]手札 [2]場
static public Sprite[] CardSp = new Sprite[53]; //【変数定義】トランプ - イメージ
static public Sprite CardBk = null; //【変数定義】トランプ - イメージ(裏面)
} //
変数の中身は次の図のとおりです。
プレイヤーの手札を管理している変数配列も再掲しますね。
//─────────────────────────────────────────────────────
// PcardSv プレイヤーのデータ
//─────────────────────────────────────────────────────
public struct PcardSv //
{ //
static public GameObject[] Pobj = new GameObject[14]; //【変数定義】手札のゲームオブジェクト
static public int[] PcdID = new int[14]; //【変数定義】手札のカードID
static public int Ppass = 3; //【変数定義】パス回数 [8]失格 [9]クリア
}
//─────────────────────────────────────────────────────
// E1cardSv 対戦相手(Com1)のデータ
//─────────────────────────────────────────────────────
public struct E1cardSv //
{ //
static public GameObject[] E1obj = new GameObject[14]; //【変数定義】Com1 - 手札のゲームオブジェクト
static public int[] E1cdID = new int[14]; //【変数定義】Com1 - 手札のカードID
static public int E1comID = 0; //【変数定義】Com1 - Com1の個性
static public int E1pass = 3; //【変数定義】Com1 - パス回数 [8]失格 [9]クリア
}
このあと、E2CardSV ~ E3CardSV が続く
これらを見ていただくと分かりますが、
CardFull.CardID[]はスペードAから順にクローバーK、ジョーカーまで綺麗に並んでいます。
毎回異なる札ID、つまりシャッフル結果を入れる変数配列はこれです。
・プレイヤーの手札を管理するPcardSv.PcdID[]
・対戦相手1の手札を管理するE1CardSv.E1cdID[]
・対戦相手2の手札を管理するE2CardSv.E2cdID[]
・対戦相手3の手札を管理するE3CardSv.E3cdID[]
シャッフル!
では、どうやってシャッフルするのか…
山札の53枚がバラバラにプレイヤーとCOM1~3に割り振られたらOK!
パッと思いつく方法としては、Unityを使っていますので…
このあたりを使用すれば良さそうです。
規則性がなくて予測できない数値、サイコロやルーレットの様にランダムに出る数字をコンピュータ関連の用語で「乱数」といいますよね。これを使って「トランプを切る」を再現するわけです。
乱数で得た数字をXとしましょう。Xの範囲は0~52です。
山札の上からX枚目のカードをプレイヤーに渡します。
次の乱数Xを求め、山札の上からX枚目のカードをCOM1に渡し、
次の乱数Xを求め、山札の上からX枚目のカードを……と繰り返します。
図で表現するとこんな感じです
これをプログラムコード化すれば、やりたいことができるハズです。
しかし、専門学校の授業時間では「乱数関数を使わずにシャッフル」という条件を課題に追加しました。
乱数関数を使わずにシャッフル?
となると、解答例も乱数関数を使わずに作らないといけませんね。
色々なやり方はあると思いますが、今回は現在のミリ秒、秒、分を利用してシャッフルしたいと思います。
やり方としては、
ミリ秒(3桁のテキスト化)+秒(2桁のテキスト化)+分(2桁のテキスト化)の7桁のテキストを作り1桁毎に読んで行きます。これを乱数Xとします。
山札のX枚目をプレイヤーに配り、テキストの次の1桁をXに加算します。
山札のX枚目をCOM1に配り、テキストの次の1桁をXに加算します。
山札のX枚目をCOM2に配り、テキストの次の1桁をXに加算します。
山札のX枚目をCOM3に配り、テキストの次の1桁をXに加算します。
これを繰り返します。
図で表すとこんな感じ…
これをプログラムコード化すればシャッフルされた状態になりそうです。
もっとランダム性を強くしたいなら、以下も追加しましょう。
・山札を誰から配り始めるか?(※1)
・7桁のテキストのどこからXに取得するか?(※2)
これはゲーム開始からのフレームカウントで解決しましょう。
(※1)フレームカウントを4で割った余りの値とする。
(※2)フレームカウントを7で割った余りの値とする。
かなりランダムっぽくなると思います。いかがでしょうか?
ちなみに、これをフローチャートで表現するとこんな感じです!
解答例のシステム設計書です(お手数ですが拡大してご覧ください~)
まだ続きます!
今回は「トランプをどうやってシャッフルするか?」を考えてみました。
前回の「手札から出せる札」も組み合わせると自分の手番はほぼ解決したと思います。
次は対戦相手である「COM1~3の思考ルーチン」を解決したいですね。
今回は長くなったのでここまでです。
ちなみに外部講師以外では、普段はこんなゲームをいじっている人です。
もしよかったら以下の記事もご覧くださいませ~。
次回【Unityで「しちならべ」を作る(6)】はコチラです(↓)
この記事が気に入ったらサポートをしてみませんか?