なでしこ3を使うと、iPadなどタブレットで動くプログラムも手軽に作成できます。今回は、iPadなどタブレットで使うことを念頭にしつつ、二人で遊べるテーブルゲームの定番、リバーシを作ってみましょう。

  • iPadでリバーシゲームを実行しているところ

    iPadでリバーシゲームを実行しているところ

テーブルゲームの定番「リバーシ」とは?

リバーシとは、二人のプレイヤーが交互に白と黒の石を盤面に起きながら進めるテーブルゲームです。相手の色の石を自分の色で挟むことで、自分の色の石に変えていきます。そして、最終的に盤上の色が多い方が勝利となります。有名なゲームなので、これ以上の詳しいルールの説明は不要でしょうか。

休日に家族と二人でゆっくり遊べるリバーシを作ろう

ルールが単純なことから、リバーシは、コンピューターゲームとしても、古くから作られています。一般的にコンピューター上で遊ぶ場合、一人用のものが大半です。コンピューターのAIが相手になってくれます。AIの性能によって、強かったり弱かったりします。

もちろん、プログラムを作って楽しいのは、対戦相手のAIをどのように実装するのかという点なのですが、今回は「夏休みや休日に家族と対戦する」というテーマの元、AIは作らない方針でいきましょう。

そのため、黙々とリバーシのルールだけを実装するのですが、それでも、なでしこで160行ほどのプログラムを書く必要があります。この長さだと、ちょっと頭をひねる必要があるでしょうか。

最初にどんなものを作るのか実際のプログラムを確認してみましょう。今回のプログラムは、なでしこ3貯蔵庫(こちら)に投稿してあります。

  • 二人対戦リバーシがすぐに実行できる

    二人対戦リバーシがすぐに実行できる

リバーシのプログラムの作り方

それでは、一つずつプログラムを作っていきましょう。まず、最初に考えるべきことは、リバーシのゲームをどのようなデータ構造で表現するのかという点です。以前、連載の65回目でトランプゲームを作った時にも解説しましたが、データ構造をうまく設計できると、プログラムを単純にすることができます。

リバーシの場合は、縦横8×8のマスの盤面が登場し、そこに白と黒の石を配置することになります。この時、8×8の盤面は、二次元配列変数を使って表現すると良いでしょう。

それで、盤の1マスを数値で表現し、0であれば石なし、1であれば黒の石、2であれば白の石と表現することにします。リバーシの初期盤面を表現するように次のような関数を用意できるでしょう。

●盤面初期化とは
 盤面=[
  [0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0],
  [0,0,0,2,1,0,0,0],
  [0,0,0,1,2,0,0,0],
  [0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0]
 ]
ここまで。

ここまで決めたら、リバーシの盤面を描画することができるでしょう。上記の関数を利用しつつ、盤面を描画するプログラムが次の通りです。

# データを初期化
タイル幅=37
F黒=1。F白=2。
盤面=[]。
盤面初期化。
盤面描画。

●盤面描画とは
  全描画クリア。
  1に線太さ設定。黒色に線色設定。
  # 左上から右下へ繰り返し盤面を描画する --- (*1)
  Yを0から7まで繰り返す
    Xを0から7まで繰り返す
      # 石のない空白マスを描画 --- (*2)
      XX=X×タイル幅
      YY=Y×タイル幅
      緑色に塗り色設定。
      [XX,YY,タイル幅,タイル幅]へ四角描画。
      # 白黒の石を描画 --- (*3)
      R=タイル幅÷2
      もし、盤面[Y,X]=F白ならば
        白色に塗り色設定。
        [XX+R,YY+R]へ(R-3)の円描画。
      違えば、もし、盤面[Y,X]=F黒ならば
        黒色に塗り色設定。
        [XX+R,YY+R]へ(R-3)の円描画。
      ここまで。
    ここまで。
  ここまで。
ここまで。
# ... ここに盤面初期化をコピーする ...

なでしこ貯蔵庫で右上の「新規」ボタンを押して、そこに上記のプログラムを記述して実行すると、次のようにリバーシの盤面が描画されます。

  • リバーシの盤面を描画したところ

    リバーシの盤面を描画したところ

上記のプログラムのポイントを確認してみましょう。まず、(*1)の部分で、左上から右下へと盤の1マスを1つずつ描画していきます。そのために「繰り返す」構文を二重で使って、Y方向とX方向と満遍なく描画します。

(*2)の部分では、実際に描画を行う座標(XX, YY)を計算し、「四角描画」を使って緑色の盤を描画します。(*3)では変数「盤面」の内容を確認して石を描画します。

石が置けるのか判定する

そして、今回最も重要な処理となるのが、石を置けるのか判定する処理です。石が置けるかどうかの条件を確認してみましょう。

黒のプレイヤーの手番の場合、まず、そのマスが空白であることが必要です。そして、そのマスの左上、上、右上、左、右、左下、下、右下の八方向のいずれかに対して、白の石があり、その方向の先に黒の石がある必要があります。つまり、盤上のマスの八方向を順に調べて、空白→白→白→黒のような配置の石があるかどうかを判定します。

なお、八方向を一つずつ調べるのは非常に大変です。そこで、以下のように方向を表す配列変数を定義しておいて、この配列変数の方向を一つずつ調べると便利です。

# --- 方向配列([左上,上,右上,左,右,左下,下,右下]を表す)
F方向=[
  [-1,-1,"左上"],[-1,0,"上"],[-1,1,"右上"],
  [0,-1,"左"],[0,1,"右"],
  [1,-1,"左下"],[1,0, "下"],[1,1,"右下"]]

上記配列を使って各方向の座標を表示するプログラムで使い方を確認してみましょう。

# --- 方向配列([左上,上,右上,左,右,左下,下,右下]を表す)
F方向=[
  [-1,-1,"左上"],[-1,0,"上"],[-1,1,"右上"],
  [0,-1,"左"],[0,1,"右"],
  [1,-1,"左下"],[1,0, "下"],[1,1,"右下"]]
# --- 方向を一つずつ調べる
F方向を反復
  Y=3。X=3。# 適当な座標
  BY=対象[0]。BX=対象[1]。B説明=対象[2]。
  「+-- 起点({X}, {X})から{B説明}方向」を表示。
  3回
    Y=Y+BY
    X=X+BX
    「| -- {B説明}{回数}つ先({X}, {Y})」を表示。
  ここまで。
ここまで。

プログラムを実行すると、次のように正しく指定方向の座標を求めていることが分かります。

  • 指定方向の座標を調べているテスト

    指定方向の座標を調べているテスト

そして、このようにして各方向を調べていくことで、石が配置できるかを調べることができます。

iPadなどのタブレットで実行する方法

なお、今回のプログラムは、iPadやタブレット上で遊ぶことを想定しています。プログラムを作ったら、なでしこ3貯蔵庫で保存しましょう。プログラムを保存した後、ページの下の方を見ると、「作品公開情報」という部分があります。

  • 投稿したプログラムは手軽に共有できる

    投稿したプログラムは手軽に共有できる

この中の「アプリ(即時実行)のURL」を覚えておきましょう。iPadなどのタブレット端末で、ブラウザ(Safariなど)を起動し、アドレスを入力すると作ったプログラムを実行できます。

  • iPadのブラウザで実行したところ

    iPadのブラウザで実行したところ

まとめ

以上、今回はリバーシの作り方について解説しました。ゲームを作りは楽しいだけでなく、プログラミング能力向上のための鍛錬にもなります。なお、ゲームを作る際には、データ構造を意識すると効率の良いプログラムが作れることも紹介しました。今回のプログラムを改造して、コンピューター対戦できるゲームにするのもお勧めです。いろいろ改造してみてください。

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