カタン、Pythonでは?―― 正六角形を19個
六角形を1個表示させることはできた。カタンでは19個並べなければならない。19個の六角形の頂点の横、縦の位置を指定しなければならない。
もちろん、六角形の頂点は、重なっているところが多いので、全部で54ヵ所である。それぞれについて横、縦の二つずつで、それも同じ数値が多いはずだから、108個もいらない。それならエクセルか何かで確認して、全部打ち込んでしまっても大した手間ではない。とはいうものの、練習ということで、できうる限り自分やらず、Pythonにやってもらおう。
やり方としては、六角形の頂点が上に来るように並べる。各六角形の上の頂点の位置を求めれば、残りの5つの頂点の位置は、相対的に決まる。では、各六角形の上の頂点の位置19個を求めよう。
六角形は、1辺の長さを20とする。とすると、向かい合う辺の距離は34.64となる。19個のうち、一番上の段に来る3つの横位置は34.64ずつ離れていて、縦位置は同じ。
次の段に来る4つの左端は、上の段の左端と比べ、横位置は17.32左に、縦位置は30下に、ということになる。これで計算させよう。
一番上の段の左端の正六角形の上の頂点の位置を、横217.32、縦200とする。これに足したり引いたりして、他の正六角形の位置を決めていけばよい。
リストを使うか、numpyの配列を使うかで迷ったが、とりあえずnumpyで行くことにした。
(リストと配列。似たような、でも違うものがどうしてあるのか、よくわからない。きっと、初心者を混乱させるために誰かが仕組んだんだろう)
最終的には3次元配列を目指すことにして、とりあえず、空の配列に、2要素の配列を追加していく実験をしてみた。
import numpy as np
t1 = np.empty((0, 2), dtype = float)
t1a = np.array([217.32, 200.00])
t2a = np.array([34.64, 0.00])
t2b = t1a + t2a
np.append(t1, np.array([t2b]), axis=0)
t2b = t2b + t2a
np.append(t1, np.array([t2b]), axis=0)
print(t1)
これで、変数t1に2次元配列が加わっていく、はずだった。しかし、実行してみると、
[]
としか出てこない。一番最初の空配列のままである。なんで?と思ったら、np.appendだと、元の配列は変わらずに、新しい配列が作られるかららしい。しかし、新しい配列ができるたびにその名前を付けていかなければならないのでは、意味がない。同じ配列に追加していくことはできないのだろうか?
たしか、リストはできたはずである。じゃあ、やっぱりリストでやるか。しかし、リストだと、要素同士の加算(t2b = t1a + t2a の部分)がうまく行かないはず。
どうしよう。