プログラミング:2次元リストと平面への表示
2次元リストを使って,図を格子状に配置することがある。このとき,リストの縦横のイメージと,平面上の座標との関係が一致しないので注意が必要である。
たとえば,行列

の要素をこのイメージで平面上に格子状に表示することを考えよう。
Python では,リストのインデックスは 0 から始まるので,𝑎11 は 𝑎00 と読み替えて,次のようなリストを作る。
Matrix = [['00','01','02','03','04'],
['10','11','12','13','14'],
['20','21','22','23','24'],
['30','31','32','33','34'],
['40','41','42','43','44']
]
このリストの要素 Matrix[1][3] すなわち '13' はどこに表示すればよいか。Pythonの場合,図を描くのに matplotlib を使うか,Tkinter を使うかで変わってくる。matprotlib は画面の左下が原点,Tkinter は左上が原点である。
次のコードで確かめてみよう。
import matplotlib.pyplot as plt
import tkinter as tk
plt.figure(figsize=(4,4))
plt.axis([0,5,0,5])
root = tk.Tk()
root.title("Tkinterの位置関係")
root.geometry("200x200")
canvas = tk.Canvas(root,width=200,height=200,bg="white")
Matrix = [['00','01','02','03','04'],
['10','11','12','13','14'],
['20','21','22','23','24'],
['30','31','32','33','34'],
['40','41','42','43','44']
]
# matplotlib で 要素 Matrix[1][3]=24 を 座標 (3,1) に表示
# matplotlib では左下が原点
plt.text(3, 1, Matrix[1][3],size=16)
# Tkinter で 要素 Matrix[1][3]=24 を 座標 (3,1) に表示
# Tkinter では,左上が原点 単位がピクセルなので,たとえば40ピクセルを1に canvas.create_text(3*40, 1*40, text=Matrix[1][3],font=("",16))
canvas.pack()
plt.show()
root.mainloop()

このように,上下が逆になる。イメージ通りなのは Tkinter の方である。matplotlib の方 は,y 座標も上下を入れ替える必要がある。
さらに,表示の基準位置も異なる。基準位置とは,指定した座標が,表示するもののどの位置かということで,matplotlib では左下,Tkinter は中央である。その分シフトして全体を表示すると次のようになる。
plt.grid(ls='--', color='blue')
N = 5;
for x in range(N):
for y in range(N):
plt.text(x, y, Matrix[y][x],size=16)
canvas.create_text(x*40+20, (N-1-y)*40+20, text=Matrix[y][x],font=("",16))

結構ややこしい。
これを授業でどう扱うか。Cindyscriptでも同じ事情なので,これまでにやってきた経験からすると,
・初めのうちは無理。少し練習させてから
となる。x,y を入れ替えることや,y座標を N-y にするというのがなかなかわからないのだ。
説明した時はできても,ちゃんとわかっていないと,問題でやらせたときにできない。したがって,他の部分を考えさせたいときは,この表示部分は作ったものを渡す,ということもある。
使う場面は,たとえば,大学入試センター試験「情報関係基礎」2007年のブロック落としのプログラミング。これは,教員が表示部分を作ってしまわないと無理だろう。それも課題に入れると,授業1コマではできない可能性が大きい。

また,社会と情報の教科書(第一学習社)にも載っている,コンウェイのライフゲーム。碁盤状の方眼に生命体を置くものだ。誕生・生存・死亡の条件が,ある生命体のまわり8ヵ所の状況で決まる。たとえば,次のように推移する。

これも,マス目の状態をリストで表すので,表示するときに x,y の入れ替えが必要になる。
ただし,こういうところは,大学入試共通テストのプログラミングでは問題としては出ないだろうから,表示に関するところは全部事前に作り込んで渡し,授業では触れないということも考えられる。生徒の理解度に応じて行うことだ。
