算数教具「ジャマイカ」を再現しよう❗️ vol.02 「Pythonで関数を作るための備忘録」


はじめに

このシリーズは、とある算数教具「ジャマイカ」について、
以下の目的を達成するべく奮闘する記録です。

▶︎ 1. 「ジャマイカ」のゲームを画像表示などを用いたプログラムで動かせるようになる。
2. 「ジャマイカ」におけるサイコロの任意の組み合わせについて、解の存在とその内容を探索・提示するプログラムを作る。

前回のおさらい

前回は、以下の内容を扱いました。

§1. 「ジャマイカ」を再現する
 Task.001 「サイコロの出目」を画像で表示する
 Task.002 「ランダムな数字に合わせてサイコロ出目画像を表示する」

これにより、サイコロをランダムに振り、
出目に対応するサイコロの出目画像を並べて表示できるようになりました。

_____【 参考記事 】_____
1 Recollection|算数教具「ジャマイカ」を再現しよう❗️の前回記事(vol.01)

> サイコロ7個の結果 [6 5 1 4 2 4 3]

§1. 「ジャマイカ」を再現する 続編

Task.003 「サイコロ出目画像表示のための関数を作る」

■ リアルなジャマイカでのサイコロを振る動作を関数定義によって見やすくまとめる。
 ➡︎ ジャマイカをゲームとして行うためには、シンプルなコードで実行できたほうが良い。
 ➡︎ これに対し、前回のジャマイカダイスロールを表示するためのコードは長ったらしかった。
 ➡︎ Pythonの関数定義の文法にしたがって、以下の関数を定義することで、簡単化を図る。

ドライブのfigファイル保存場所について指定する関数: figplace()
必要なライブラリをimportする関数: libimports()
7個のサイコロの出目をnp.array形式で出力する関数: jmc_diceroll()
ジャマイカのダイスロール結果を画像で表示する関数: jmc_display()

_____【 参考記事 】_____
2 Task003|Pythonで関数を定義・呼び出しする(def, return)
 ➡︎ 関数定義の方法や返り値の出力について参考にした。

task003_jmcfunctions1
### サイコロ出目表示に必要な画像ファイルを保存している場所を指定する文字列を返す関数
def figplace():
  wheredrive = '/content/drive/My Drive/Mathematics/MathProgramming/MathPro-Jamaica/'
  wherefigs = wheredrive + 'Jamaica-figs/'
  return wherefigs

### 必要なライブラリを一頻りインポートするための関数(返り値なし)
def libimports():
  from google.colab import drive 
  drive.mount('/content/drive',force_remount=False) #GoogleColabratory上でGoogleDriveのファイルへアクセスするマウントを取得する(第2引数をTrueにすると強制的に再度マウントを取得する)
  import matplotlib
  import matplotlib.pyplot as plt
  import matplotlib.image as mpimg
  import numpy as np

### ランダムな7個のサイコロの結果を出力し、6個目のサイコロの結果を10倍してジャマイカ使用のサイコロ結果を返す関数
def jmc_diceroll(printOption):
  jmcDice = np.random.randint(1,7,7) #7個のランダム変数を1以上7未満の値でランダムに生成したnp.array(1*7の行ベクトル)を出力する
  jmcDice[5] = jmcDice[5]*10 #6番目に位置する2桁の黒サイコロの数字を10倍してジャマイカ仕様のサイコロ結果にする
  if printOption == True:
    print('ジャマイカのダイスロール結果: ', jmcDice) #printOptionがTrueの時は、ダイスロールの結果を出力する
  return jmcDice

### 画像の保存場所とダイスロールの結果、表示する画像の大きさの比率を引数として、ジャマイカのダイス結果を画像表示する関数(返り値なし)
def jmc_display(figPlace,jmcDice,sizeRatio): #1:画像の保存場所,2:ダイスの結果,3:画像サイズのデフォルトに対する比率
  row = 1 #画像を表示する枠行列における行の数
  col = jmcDice.shape[0] #画像を表示する枠行列における列の数
  fsizeDefault = 15 #画像1つ1つのサイズのデフォルト値
  fsize = round(fsizeDefault * sizeRatio) #表示画像サイズ = デフォルト値 * 画像サイズのデフォルトに対する比率
  plt.figure(figsize=(fsize,fsize)) #画像1つ1つのサイズを調整するパラメータの指定
  for index in range(row * col):
    plt.subplot(row, col, index+1)
    if index < 5: #indexが0〜4まで、つまり1〜5番目のサイコロは白サイコロで画像出力
      imgname = 'dice-w-' + str(jmcDice[index]) + '.png'
      whereimg = figPlace + imgname
      img = mpimg.imread(whereimg)
      imgplot = plt.imshow(img)
      plt.axis('off')
    elif index < 7: #indexが5〜6まで、つまり6,7番目のサイコロは黒サイコロで画像出力
      imgname = 'dice-b-' + str(jmcDice[index]) + '.png'
      whereimg = figPlace + imgname
      img = mpimg.imread(whereimg)
      imgplot = plt.imshow(img)
      plt.axis('off')
    else:
      continue
task003_jmcdisplay
### function trial START ###
libimports()
figPlace = figplace()
jmcDice = jmc_diceroll(printOption=True)
jmc_display(figPlace, jmcDice, sizeRatio=1.4)
### function trial END ###
> Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
> ジャマイカのダイスロール結果:  [ 1  5  6  5  5 30  2]

次回予告

今回は主に、Pythonで関数を定義する方法と、ジャマイカのダイスロール結果を簡易的に表示するコードの備忘録を記載しました。

次回は、いよいよ
「ジャマイカ」のダイスロール結果に基づき、解を探索する関数の定義
へ踏み込みます。

題して、vol.03 「ジャマイカの解探索を目指して〜第1戦目〜」 です。

REF. ジャマイカ関連の基本情報

Q1. 算数教具「ジャマイカ」って何?

A1. 「ジャマイカ / Jamaica」とは、サイコロを用いた"数遊び"を題材とする算数教具として販売されているものです。

AmazonやYahoo!ショッピングなどの通販サイトでも販売されている一般的な商品です。
 ➡︎ Amazon販売ページはこちらからどうぞ。
 ➡︎ 画像は下図を参照ください(上記ページからの引用)

サイコロは白と黒の2種類で、それぞれ5個と2個付属しています。
 ➡︎ 円環部分に白サイコロ×5個と黒サイコロ×1個、中央部分に黒サイコロ×1個が付属しています。

色 / Color 数量 / amount 記載されている数字 / Numbers
白 / white 5 個 / 5 dice 1, 2, 3, 4, 5, 6
黒 / black 1 個 / 1 dice 1, 2, 3, 4, 5, 6
黒 / black 1 個 / 1 dice 10, 20, 30, 40, 50, 60

Q2. ジャマイカの遊び方は?

A2. 白サイコロ×5個の数字をそれぞれ1回ずつ使って四則演算を行い、黒サイコロ×2個の数字の和を作ります。

例えば、白サイコロの出目が(1,2,3,5,5)であり、黒サイコロの出目が(10,6)の場合は、
白サイコロの出目を全て足し合わせて 1+2+3+5+5=10+6 という等式を作ることができます。

白サイコロ×5個の数字は、それぞれ1回ずつしか使えません。
 ➡︎ 例えば、白サイコロの出目が(2,4,5,3,3)だった場合、計算に使えるのは
   2 が1回、3 が2回、4 が1回、5 が1回です。それ以上使ってはいけません。
   (2 を2回使ったり、3 を3回使ったりしてはダメです。)
 ➡︎ もちろん、「指定回数分使わない」ことも御法度です。
   (上の例では、3 を1回しか使わないなどもダメです。)

四則演算とは、加減乗除のことです。
 ➡︎ 「加」とは、「加法」すなわち「足し算」です。
  例えば、2+3=5 のような和(足し算の結果)を計算します。
 ➡︎ 「減」とは、「減法」すなわち「引き算」です。
  例えば、5-2=3 のような差(引き算の結果)を計算します。
 ➡︎ 「乗」とは、「乗法」すなわち「掛け算」です。
  例えば、3×4=12 のような積(掛け算の結果)を計算します。
 ➡︎ 「除」とは、「除法」すなわち「割り算」です。
  例えば、4÷2=2 のような商(割り算の結果※)を計算します。
 ※ 割り切れる演算のみを許す、すなわち既約分数形を許さないルールと、既約分数も許すルールがあります。
  [1] 既約分数になるものは許さないルールの場合
     白サイコロの出目(2,4,6,3,5)のとき、6÷3=2 という演算はできますが、
     6÷4=3/2 という結果は利用不可能です。
  [2] 既約分数になるものも許すルールの場合
     白サイコロの出目(2,4,6,3,5)のとき、6÷3=2 という演算もできるだけでなく、
     6÷4=3/2 という結果も利用可能です。
 ※ 既約分数を利用しないと解けないサイコロの出目の組もあります。
  例) 白サイコロの出目(2,2,4,4,6)に対して、黒サイコロの出目(30,3)のとき
    {(2- 2/4) + 4} × 6 = 30 + 3 という等式が成り立ちます。

四則演算はどのような順番で行っても構いません。
 ➡︎ 先に2つの数字を足しておいて、別の数字と掛ける、といった演算の順序は自由です。
  つまり、いつ・どこでも括弧を何回使ってもよいということです。
  例) 白サイコロの出目(3,6,4,4,1)に対して、黒サイコロの出目(20,6)のとき
    {(3 + 6) + (4 × 4)} + 1 = 20 + 6 という等式が成り立ちます。

参考記事まとめ