楽しんでプログラミングを学ぼうと思ったらゲームを作ってみるのがオススメです。有名なゲームを自分で実装してみると、とてもたくさんの気づきがあります。そこで、今回はトランプゲームの中の一つ「ぶたのしっぽ」を作ってみましょう。

  • トランプゲーム「ぶたのしっぽ」を作ってみよう

    トランプゲーム「ぶたのしっぽ」を作ってみよう

ゲームを作ると自動的にレベルアップできる

どうしてゲームを作るとプログラミング力が身につくのでしょうか。まず、ゲームを作るには、何をどう動かすのか手順をしっかり考えなければなりません。物事を整理して、一つずつ処理を作っていく必要があります。そして、手順を考えることに加えて、ゲームデータをどう扱えば良いのかを考えなくてはなりません。つまり、プログラミングの基本である、アルゴリズムとデータ構造について考えることになります。

加えて、ゲーム作りはとても面白いものです。「好きこそものの上手なれ」と言いますが、多くのプログラマーがゲームを楽しく作っているうちに、プログラミングに必要なスキルを身につけています。楽しみながらプログラミングのレベルアップを図りましょう。

トランプゲーム「ぶたのしっぽ」とは

それで今回はトランプゲームの「ぶたのしっぽ」を作ってみましょう。なお、「ぶたのしっぽ」は次のようなゲームです。

最初に、トランプのカードを裏向きに並べます。そして、一枚を山札としてめくります。そして、ゲームに参加するプレイヤーが一人ずつ、裏向きのカードを1枚取って山札に重ねていきます。その際、山札と同じマークあるいは番号のカードが出たら、そのプレイヤーは山札のカードを引き取らなければなりません。裏向きのカードがなくなるまでこれを繰り返します。最終的に、手元にあるカードが多い人が負けです。

なお「ぶたのしっぽ」はローカルルールがいろいろあるのが特徴で、一般的なルールでは、手元に引き取ったカードがあるときは、そこから出しても良いとなっています。ですが、今回、プログラムを単純にするため、次のようなルールにしようと思います。

- (1) 52枚のトランプカードをシャッフルして裏向きに並べる
- (2) 最初に一枚をめくって山札に置く
- (3) プレイヤーは順に裏向きのカードを1枚ずつとって山札に置く
- (4) ただし、とったカードが山札のカードと同じマークか番号ならば、そのプレイヤーが山札にある全部のカードを引き取る
- (5) 裏向きのカードがなくなるまで(3)に戻って繰り返す。手札のカードが少ない人が商社となる

トランプを0から51の通し番号で表現しよう

以上の手順を元にしてプログラムを作っていきましょう。なお、本連載では、第65回目でもトランプを使った「七並べ」を作りました。このときも、トランプのカードをどのように表すかを考えました。

このとき、トランプのカードを0から51までの通し番号で表現する方法を紹介しました。これが分かりやすいので、今回もこの方法を使ってトランプを表してみます。

  • 0から51までの通し番号でトランプを表現しよう

    0から51までの通し番号でトランプを表現しよう

それで、52枚のトランプを作成しつつシャッフルするプログラムは次のように記述できます。

カード=0から51までの配列連番作成。
カードを配列シャッフル。
カードを表示。

上記のプログラムをなでしこ簡易エディタで実行して試してみましょう。次の画面のように、0から51までの数がシャッフルされて並ぶのを確認できます。

  • カードデータをシャッフルしたところ

    カードデータをシャッフルしたところ

プログラム中で使う変数をまとめてみよう

なお、今回はコレに加えて、山札や裏返しているトランプ、自分の手札にあるカード、対戦相手の手札のカードを管理する必要があります。そこで、プログラムの最初で次のような変数を定義してみます。

# プログラム内で使う変数一覧
豚カード=[] # 裏返しに置いてあるカードの一覧
自分手札=[] # 自分の手元にあるカード
相手手札=[] # 対戦相手(コンピューター)の手元にあるカード
山札=-1 # 山札の先頭にあるカード
山札一覧=[] # 山札に重ねたカードの一覧

なお、「ぶたのしっぽ」というゲームの名前は、トランプを裏向きに豚のしっぽのように並べるところから取られているそうです。そのため、ここでも裏向きのカードを「豚カード」という名前にしてみました。

そして、なでしこで配列変数を初期化するのに『[初期値1, 初期値2, ...]』のように記述できます。それで、『豚カード=[]』と書いた場合、変数「豚カード」を要素が空の配列変数で初期化するという意味になります。

裏返しのカードをどう表現するか?

なお、今回のプログラムでは52枚(13枚×4種)のトランプを裏向きに配置する必要があります。グラフィックに凝ったゲームにする場合は、トランプの画像を用意してこれを選べるようにすると良いのですが、今回はボタン部品を使って、裏向きの状態を「?」、すでに引いた後の状態を「_」と文字で表現することにしました。

それで、52個のボタンを作成するために次のようなプログラム作りましょう。以下のプログラムをなでしこ簡易エディタで実行して試してみましょう。

豚ボタン一覧= []
IDを0から51まで繰り返す
  B=「?」のボタン作成。
  B["data-id"]=ID
  Bをクリックした時には:
    ID=対象["data-id"]
    「{ID}を押しました」と言う。
  豚ボタン一覧[ID]=B
  もし、ID%5=4ならば、改行作成。
ここまで。

上記のプログラムを実行すると次のように表示されます。

  • 大量のボタンを作成し、個々のボタンを判別できる

    大量のボタンを作成し、個々のボタンを判別できる

「繰り返す」構文と「ボタン作成」命令を組み合わせることで、一度にたくさんのボタンを作成できます。

このとき、作成したボタンを辞書型データのように扱うことが可能です。そこで、ボタンの"data-id"というプロパティに固有のIDを割り振っておけば、「クリックした時」イベントでどのボタンが押されたかを判別できます。

引いたカードと山札を比べる処理

そして、「ぶたのしっぽ」ゲームでは、ボタンを押したとき、ボタンの場所にあるカードを確認して、山札にあるカードと比べて、マークや番号が同じかどうかを判定します。0から51の通し番号でトランプを管理する場合、次のような式で、マークと番号を調べることができます。

カードマーク = INT(番号÷13)
カード番号=番号%13

それで、実際に山札のカードと引いたカードを照合する処理は次のようになります。

●(誰がIDの)カード選択とは
  番号=豚カード[ID]
      # ...省略 ...
  T=INT(番号÷13) # 取得したカードのマークを得る
  N=番号%13 # 取得したカードの番号を得る
  T山札=INT(山札÷13) # 山札カードのマークを得る
  N山札=山札%13 # 山札カードの番号を得る
  判定=「」
  もし(T=T山札)または(N=N山札)ならば
    もし、誰=「自分」ならば
      判定=「 → 😿 残念...」
      自分手札=自分手札と山札一覧を配列足す
    違えば
      判定=「 → 😊 やった!」
      相手手札=相手手札と山札一覧を配列足す
    ここまで。
    山札一覧=[]
  ここまで。
  # ... 省略 ...
ここまで。

まとめ

以上、ここまでの部分で「ぶたのしっぽ」のプログラムの作りかたを紹介しました。ゲームを簡略化したのですが、140行と少し長くなったので、ゲームを作るのに必要となりそうな主要な処理を抜粋して紹介しました。以上の点が分かれば、プログラム全体を読むことができるでしょう。

実際のプログラムは、こちらにアップロードしました。プログラムを分かりやすくするため、グラフィックスなど全く使わないシンプルなものにしてあります。プログラムの動きを確認しながら処理を追ってみてください。

また、多人数で遊べるようにしたり、グラフィックスを付け足してみたりと、自分でいろいろ改良してみると、より楽しめるでしょう。

  • ぶたのしっぽのプログラム

    ぶたのしっぽのプログラム

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。