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

# はじめに



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

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



# 前回のおさらい



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

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

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

**＿＿＿＿＿【 参考記事 】＿＿＿＿＿**
[^ref001] Recollection｜[算数教具「ジャマイカ」を再現しよう❗️の前回記事（vol.01）](https://qiita.com/c-odgr/items/fd0b4f20f130a89a7f5e)

```
> サイコロ７個の結果 [6 5 1 4 2 4 3]
```
![qiita004_jamaica_task002_diceroll.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630256/9d9cf9a4-44ca-a9b9-6ff5-186904a40dda.png)



# §1. <font color="Red">「ジャマイカ」</font>を再現する　続編



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



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

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

**＿＿＿＿＿【 参考記事 】＿＿＿＿＿**
[^ref002] Task003｜[Pythonで関数を定義・呼び出しする(def, return)](https://note.nkmk.me/python-function-def-return/)
　➡︎ 関数定義の方法や返り値の出力について参考にした。


```python: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

### ランダムな７個のサイコロの結果を出力し、６個目のサイコロの結果を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 #画像１つ１つのサイズのデフォルト値
  fsize = round(fsizeDefault * sizeRatio) #表示画像サイズ = デフォルト値 * 画像サイズのデフォルトに対する比率
  plt.figure(figsize=(fsize,fsize)) #画像１つ１つのサイズを調整するパラメータの指定
  for index in range(row * col):
    plt.subplot(row, col, index+1)
    if index < 5: #indexが0〜4まで、つまり１〜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
```


```python: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]
```

![qiita005_jamaica_task003_jmcdisplay.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630256/80ce45ca-08b6-4130-fb14-b4e8b1dcc58a.png)



# 次回予告



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

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

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



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



## Q1. 算数教具<font color="Red">「ジャマイカ」</font>って何？



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


■ ***AmazonやYahoo!ショッピングなどの通販サイトでも販売されている一般的な商品です。***
　➡︎ Amazon販売ページは[こちら](https://www.amazon.co.jp/dp/4902756161/ref=cm_sw_r_tw_dp_U_x_XrEPEbCJ5VRST)からどうぞ。
　➡︎ 画像は下図を参照ください（上記ページからの引用）
![qiita1_jamaica_red.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630256/1ae38e1c-0c14-f038-68b2-12515c8e189d.jpeg)


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

| 色 / 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. ジャマイカの<font color="Red">遊び方</font>は？



### A2. 白サイコロ×５個の数字をそれぞれ１回ずつ使って<font color="Blue">四則演算</font>を行い、黒サイコロ×２個の数字の和を作ります。

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

<img width="489" alt="qiita002_jamaica_sample_sizedown.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630256/9fbae750-cfa8-92c5-4ae2-ff2743d774b8.png">


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


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


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



# 参考記事まとめ



[^ref001]: Recollection｜[算数教具「ジャマイカ」を再現しよう❗️の前回記事（vol.01）](https://qiita.com/c-odgr/items/fd0b4f20f130a89a7f5e)
[^ref002]: Task003｜[Pythonで関数を定義・呼び出しする(def, return)](https://note.nkmk.me/python-function-def-return/)