【Unity】山札からトランプの手札を配るサンプル2通り

【Unity】山札からトランプの手札を配るサンプル2通り

そろそろ乱数ブログを名乗り始めてもいい気がしてきた今日この頃。

前回も乱数ネタだったのですが、Unityのマニュアルにある『ランダムなゲームプレイ要素の追加』を出発点に、トランプの山札をシャッフルするサンプルを作成しました。

マニュアルにある『リストをシャッフルする』の次の項目が『繰り返しなしでアイテムのセットから選択する』だったので、これちょうどよかばい! と思って、山札から手札が配られるケースを実装してみます。

 

環境

macOS 10.13 High Sierra

Unity2018.1.0f2

Unityのサンプルコードについて

上述のマニュアルにあるケースは、キャラクター一覧から、何人かのキャラクターを選んでいくつかの生成ポイントに配置するものです。

配列を使っており、キャラクター配列のそれぞれの要素にアクセスしていき、その要素が選ばれる確率と乱数を比較しています。乱数の値が確率以下であれば選ばれたと見なします。

指定の要素数だけアイテムを抽出したら処理を終了しています。

このコードの中では、元々のリストからの削除は行なっていないので、トランプに応用する場合はそれも考えないといけません。

Listを使って実装してみる

前回はトランプの山札をListで実装したので、それに合わせてListを使って実装してみます。

前回作成したスクリプトは上の記事を見ていただくか、GitHubをご覧ください。

このスクリプトに、手札を配る処理を追加します。

手札の内容を保持するリストをフィールドに追加します。

DistributeCardsでは、引数で渡された枚数をcardListから選択しています。

大筋ではUnityのサンプルの流れになっていますが、配ったカードは山札から無くしたいので、プレイヤー用の手札と、残り物カードのリストを用意しています。

プレイヤーの手札に加える枚数を山札に残っている枚数で割ることで、そのカードが選ばれる確率を出しています。その確率の値とRandom.valueを比較して、Random.valueが小さい値になっていたらそのカードをプレイヤーの手札リストに、大きければ残り物カードリストに追加しています。

プレイヤーの手札を配れ終えたら、残り物カードリストをそのまま山札にしています。

このメソッドはStart()の中で呼ぶようにしています。

 

実行結果

このスクリプトを保存してゲームを実行すると、以下のようにコンソールに表示されます。

8枚の手札が配られた
8枚の手札が配られた

 

山札の中から8枚のカードが手札として加えられました。

この8枚が山札に無いことを確認するため、以下のコードを追加しました。

CheckDuplicationメソッドで、引数のカードリストと山札のカードリストで重複が無いか確認しています。

引数のカードリストの全ての要素について山札での検索を行い、重複があれば重複していることを知らせます。

このメソッドで確かめると以下のようになりました。

重複はなさそう
重複はなさそう

 

流石に目grepするのはきつかったので、こうしたチェックメソッドがあるといい感じ。なお、わざと重複ありのリストを引数にしたらちゃんと『重複』と表示されたので動作も良さそう。

 

実はそのままリストの頭から取ってもいい

多分気付いた人も多いと思いますが、Unityのマニュアルに無理に従わなくても、今回のケースだとシャッフルしてある山札の先頭から指定枚数を手札に加えたほうが楽です。

なのでこちらも簡単に実装するとこんな感じ。

上のDistributeCardsではなく、こちらのDistributeFromDeckHeadを呼ぶようにして、配る前の山札もコンソールに出力するようにしたらこんな感じ。

配布前の山札
配布前の山札

 

配布後の山札と手札
配布後の山札と手札

 

ちゃんと山札の上から8枚移動させてます。

 

重複チェックもOK
重複チェックもOK

 

重複チェックも通りました。

List.RemoveRangeを使って一気にリストから要素を外せるので、山札の上からカードを取っていくときはこちらが早いかもです。

今回のサンプルで使ったスクリプトの全文はGitHubをご覧下さい。

元のリストを変えない時にUnityのサンプルは有効

今回実装したトランプの配布方式では、個人的に山札の上から配る方式が簡単で良かったです。

Unityのサンプルコードは、多分トランプをテーマにするよりも元のリストが変わらないケース、例えば敵キャラのデータ一覧からランダムに重複無しで敵を出現させるなんて時に便利なサンプルコードでした。

配列を使っているので、元のリストの長さが変わらないのであれば結構高速に動くはずです。

今回はその良さを十二分に活かせませんでしたが、出発点として考えるにはとてもいいサンプルでした。

まとめ

トランプの山札から手札にカードを配るサンプルを実装しました。

トランプの場合はカード全部合わせても50枚から60枚程度なので、アクションごとにリストをいじってもそこまで重くはならないはず。

正直乱数要素はそんなになかったので、単純にトランプっぽいゲームを作るチュートリアルになった気が……このままゲームを作るとこまでチュートリアルにするのもいいかも(やるとは言っていない)

アセット作ってます!

CTA-IMAGE

Unityでの開発に役立つアセットを作っています。

3DダンジョンRPGを開発するスピードを200%加速するAssetや、ファンタジーRPGのダンジョンを彩るパーツを取り揃えています。

特に3DダンジョンRPGのゲームを1から作るのは結構時間がかかります。ダンジョン部分の作成はこうしたアセットを使って、開発をブーストさせてみませんか?