今回は、トランプの定番䞭の定番である「䞃䞊べ」をなでしこで䜜っおみたしょう。カヌドゲヌムを䜜るポむントは、カヌドをどのようなデヌタ圢匏で扱うかずいう点です。そのコツさえ掎んでしたえば、いろいろなトランプゲヌムを䜜れるようになりたす。䞃䞊べを䟋にしお考察したしょう。

  • トランプの䞃䞊べを䜜っおみよう

    トランプの䞃䞊べを䜜っおみよう

ゲヌム開発はデヌタの衚珟方法で決たる

ゲヌムを䜜ろうず思った時、ゲヌムの画面やゲヌムの仕組みを考えるのは楜しいものです。そしお、䜜りたいゲヌムが圢になっおきたら、どのようにゲヌム内で扱うデヌタを衚珟したら良いかを考えるず良いでしょう。デヌタの衚珟方法が決たれば、䞀気にゲヌムが珟実に動くようになりたす。

それでは、今回䜜るトランプの䞃䞊べはどうでしょうか。トランプをプログラミング蚀語で扱うずき、いく぀かの衚珟方法が考えられたす。

比范的実際のトランプに近い圢匏で扱うこずを想定するなら、カヌドを蟞曞型デヌタで次のように衚珟できるでしょうか。

カヌド䞀芧 = [
    {"絵柄": "♣", "番号": "A"},
    {"絵柄": "♣", "番号": "2"},
    {"絵柄": "♣", "番号": "3"},
    {"絵柄": "♣", "番号": "4"}
]
カヌド䞀芧[2]["番号"]を衚瀺。

1枚のカヌドを {"絵柄": "♥", "番号": "A"}のように衚珟するのです。この方法のメリットは、デヌタを衚瀺しおみるず䞀目瞭然でそれが分かるずいう点にありたす。

しかしデメリットもありたす。トランプの絵柄ず番号を文字列で衚珟しおいる点です。䞃䞊べでは数字が隣り合っおいるかどうかを確認したいのですが、文字列のたたでは、「A」の次が「2」だずいうこずが分かりづらくなりたす。そこで、A→1、J→11、Q→12、K→13ず、普通の連番の数倀である、1から13の数字で衚すようにするず比范的分かりやすくなりたす。

カヌド䞀芧 = [
    {"絵柄": "♣", "番号": 1},
    {"絵柄": "♣", "番号": 2},
    {"絵柄": "♣", "番号": 3},
    {"絵柄": "♣", "番号": 4}
]
カヌド䞀芧[2]["番号"]を衚瀺。

トランプのカヌドを通し番号で衚珟しおみよう

さらに、この考え方を掚し進めお、トランプのカヌド党おを番号で衚珟しおしたうずいう方法が考えられたす。

以䞋の図のように、0番を「♣A」、1番を「♣2」、2番を「♣3」...13番を「♠A」、14番を「♠2」...49番を「♊J」、50番を「♊Q」、51番を「♊K」ず芋なすようにするのです。

  • トランプのカヌドを0から51の連番で衚珟する方法

    トランプのカヌドを0から51の連番で衚珟する方法

郜合が良いこずに、トランプでは絵柄ごずに13枚のカヌドがあるので、カヌド番号を13で割れば、絵柄ず番号が求められるのです。䟋えば、Nをカヌド番号ず芋なした堎合、次のような匏で絵柄ず番号を求めるこずが可胜です。

N=33
絵柄INT(N÷13)
番号N % 13 + 1
「カヌド番号({N})絵柄:{絵柄}/番号:{番号}」を衚瀺。

䞊蚘のプログラムを実行するず「カヌド番号(33)絵柄:2/番号:8」ず衚瀺されたす。

たた、以䞋のような倉換配列を甚意するず、より簡単に「カヌドの通し番号」からトランプの絵柄ず番号に倉換できるこずが分かるでしょう。

# 絵柄ず番号を埗る倉換配列
カヌド絵柄=["♣","♠","♥","♩"]
カヌド番号["A","2","3","4","5","6","7","8","9","10","J","Q","K"]

# カヌド番号からカヌドに倉換
N=33
絵柄INT(N÷13)
番号N % 13
「カヌド番号({N}){カヌド絵柄[絵柄]}{カヌド番号[番号]}」を衚瀺。

䞊蚘プログラムを「なでしこ3簡易゚ディタ」で実行しおみたしょう。するず、次のように分かりやすくカヌド番号33が「♥8」に倉換であるこずが分かりたす。

  • カヌド番号から絵柄ず番号を衚瀺したずころ

    カヌド番号から絵柄ず番号を衚瀺したずころ

通し番号で衚珟できるメリットは他にもありたす。党52枚のカヌドを䜜るのが簡単です。「繰り返す」文を䜿うずあっずいう間に52枚のトランプカヌドを䜜成できたす。

以䞋のプログラムを実行するず、52枚のカヌドを䜜成し、シャッフルしお、党郚衚瀺したす。

# 絵柄ず番号を埗る倉換配列
カヌド絵柄=["♣","♠","♥","♩"]
カヌド番号["A","2","3","4","5","6","7","8","9","10","J","Q","K"]

# å…š52枚のカヌドを䜜成
カヌド䞀芧=[]
Nを0から51たで繰り返す
  カヌド䞀芧[N] = N
ここたで。

# カヌドをシャッフル
カヌド䞀芧を配列シャッフル。

# カヌド党郚を衚瀺
カヌド䞀芧を反埩
  絵柄INT(察象÷13)
  番号察象% 13
  「{カヌド絵柄[絵柄]}{カヌド番号[番号]}」を衚瀺。
ここたで。

実行しおみたしょう。プログラムを実行するたびに異なる順番でカヌドが衚瀺されるのを確認できるでしょう。

  • トランプをシャッフルしお衚瀺したずころ

    トランプをシャッフルしお衚瀺したずころ

ここたでの郚分で、カヌドをシャッフルしお衚瀺しただけですが、それだけでもゲヌムが始たる予感がしたす。

なお、今回は凊理を簡略化するためゞョヌカヌのカヌドを考えないこずにしおいたす。ゞョヌカヌを加える堎合、䞊蚘0番から51番たでの数字カヌドの埌ろ、52番をゞョヌカヌにすれば良いでしょう。

参加者4人にカヌドを配る凊理

次に参加者4人に52枚のカヌドを配る凊理を䜜っおみたしょう。䞊蚘ず同じ手順で52枚のカヌドを配列に入れたらシャッフルし、参加者4人に割り振っおいきたす。ここでは、参加者4人の手札を「参加者」ずいう配列倉数に入れるこずにしたしょう。

# 絵柄ず番号を埗る倉換配列
カヌド絵柄=["♣","♠","♥","♩"]
カヌド番号["A","2","3","4","5","6","7","8","9","10","J","Q","K"]

# å…š52枚のカヌドを䜜っおシャッフル
カヌド䞀芧=[]
52回、カヌド䞀芧に(回数-1)を配列远加。
カヌド䞀芧を配列シャッフル。

# 参加者4人にカヌドを配る
参加者[[], [], [], []] # 手札を空で初期化
Iを0から51たで繰り返す
  参加者[I%4]にカヌド䞀芧[I]を配列远加。
ここたで。

# カヌド党郚を衚瀺
誰を0から3たで繰り返す
  S=「」
  参加者[誰]を反埩
    倉数[絵柄,番号][INT(察象÷13),察象% 13]
    S=S&「{カヌド絵柄[絵柄]}{カヌド番号[番号]},」
  ここたで。
  「参加者{誰}: {S}」を衚瀺。
ここたで。

プログラムを実行するず、以䞋のようにカヌドを配るこずができたした。プログラムを実行するたびに配られるカヌドが倉化したす。

  • カヌドを参加者に配ったずころ

    カヌドを参加者に配ったずころ

カヌドが隣り合っおいるか刀定しよう

そしお、䞃䞊べを䜜る時に倧切ずなるのが、出したカヌドが隣り合っおいるかずいう点です。䞃䞊べでは机䞊に䞊べられたカヌドに察しお、隣り合ったカヌドのみ参加者の手札から出すこずができたす。

ここでは、机䞊を衚す倉数「机」を甚意し、そこに52枚のカヌドが出されたかどうかを刀定できるように、芁玠番号0から51に-1を代入しおおきたす。぀たり、倉数「机[通し番号]」の倀を確認しお、-1であれば、そこは空であるずしたす。

そのため、䟋えばカヌド番号3(♣4)を出すこずができるか確かめたいずきは、その䜍眮の巊偎、倉数「机」の芁玠4(♣5)の䜍眮を確認すれば良いこずになりたす。たた、カヌド番号が6以䞊であれば、右偎のカヌドが空かを確かめたす。刀定プログラムは以䞋のようになりたす。

●(Nを)机配眮可胜ずは
  絵柄INT(N/13)
  番号N%13
  もし番号6ならば
    (机[絵柄][番号-1]≧0)で戻る。# 巊偎を確認
  違えば
    (机[絵柄][番号+1]≧0)で戻る。# 右偎を確認
  ここたで。
ここたで。

ゲヌムを完成させよう

以䞊、トランプゲヌムを䜜る仕組みを考えたずころで、ゲヌムを完成させおみたしょう。プログラムの党䜓は少し長くなっおしたったので、なでしこ3貯蔵庫に配眮したした。貯蔵庫にアクセスしたら、「実行」ボタンを抌しおみおください。以䞋のように䞃䞊べが始たりたす。

  • 䞃䞊べを実行しおみたずころ

    䞃䞊べを実行しおみたずころ

なお、今回、プログラムの動きが分かりやすくなるように、グラフィックなどは極力排陀し、HTMLを動的に生成するこずでゲヌム画面を構築しおいたす。もし䜙力があれば、プログラムを改造しお、カヌド画像が出るように改良しおみるず良いでしょう。

たずめ

以䞊、今回はトランプゲヌムの定番「䞃䞊べ」を䜜っおみたした。今回、トランプのカヌドを通し番号で管理する方法を玹介したしたが、もちろん䜜るゲヌムの皮類によっおは、別の衚珟方法を䜿う方が適切な堎合もあるでしょう。実際、どのようにデヌタを衚珟するのかは、詊行錯誀しおみお萜ち着くずいう堎合もありたす。デヌタをどのように衚珟するのか、工倫次第で、プログラムがより完結になったり、高速になったりしたす。詊しおみたしょう。本皿がテヌブルゲヌムやカヌドゲヌム補䜜の参考になれば幞いです。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。盎近では、「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」「すぐに䜿える!業務で実践できる! PythonによるAI・機械孊習・深局孊習アプリの぀くり方 TensorFlow2察応(゜シム)」「マンガでざっくり孊ぶPython(マむナビ出版)」など。