
この回でできるようになること
- 01二重リストで3×3の盤面を表す
- 02行・列・斜めの勝ち筋を調べる
- 03複数の盤面で判定を試し、見落としを探す
9マスをデータにする
3つの行を、それぞれ3個の値を持つリストにします。0は空欄、1は○、2は×を表します。

紙の三目並べが、数字の箱になった!

そうなんだよ。board[行][列] と書くと、どのマスか指定できるんだ。

board[0][1] は上の行の真ん中です。
board = [[1, 1, 1],
[2, 0, 2],
[0, 0, 0]]
print(board[0][1])
print(board[1][1])
なぜ? 最初の [0] で上の行、次の [1] でその真ん中。2行目の真ん中は0で空欄です。

1行ずつ手で書いて、位置番号を確かめよう。
勝てる線を全部並べる
勝利は横3本、縦3本、斜め2本の計8本のどれかで起こります。まずは線をデータにまとめます。

横だけ見たら、縦の勝ちを見逃しちゃう!

そうだね。『勝てる線』の一覧を先に作ると、見落としを減らせるんだよ。

条件を8回ばらばらに書くより、同じ調べ方を繰り返せます。
board = [[1, 0, 2], [1, 2, 0], [1, 0, 0]]
lines = []
lines.extend(board)
for c in range(3):
lines.append([board[r][c] for r in range(3)])
lines.append([board[i][i] for i in range(3)])
lines.append([board[i][2-i] for i in range(3)])
print(len(lines))
なぜ? 横3本に縦3本を追加し、斜め2本を加えて合計8本です。c は列番号、r は行番号です。

内包表記が難しければ、普通の for で1マスずつ append() してもよいよ。
勝者を判定する
同じ記号が1本の線に3個そろったら勝ち。空欄の0が3個並んでも勝ちではありません。

空欄が3個並んだら『空欄の勝ち』になっちゃう?

そこは大事なチェックだね。1か2だけを勝者として調べよう。

いろいろな盤面を試し、勝ち筋の見落としを防ぎます。
def winner(board):
lines = board[:]
for c in range(3):
lines.append([board[r][c] for r in range(3)])
lines += [[board[i][i] for i in range(3)],
[board[i][2-i] for i in range(3)]]
for line in lines:
if line == [1, 1, 1]:
return "○の勝ち"
if line == [2, 2, 2]:
return "×の勝ち"
return "勝者なし"
board = [[1, 0, 2], [1, 2, 0], [1, 0, 0]]
print(winner(board))
なぜ? 左の列が [1,1,1]。勝者が見つかると return で結果を返します。0の線は勝ちと判定しません。

実際の対戦アプリにするなら、手番・入力検証・引き分けも追加しよう。
予想して、理由まで確かめよう
答えを選んだら、説明を読んでから実行欄でも試してみよう。
[[0,0,0],[1,2,1],[2,1,2]] の上段は、誰かの勝ち?
答えを選ぶと理由が表示されます。

小さな練習:斜めの勝ちを試そう
実行欄の『勝者を調べる』を選び、board を斜めに○が3つ並ぶ盤面へ変えて結果を確かめよう。
ヒント:[0][0]、[1][1]、[2][2] を1にします。
解き方の一例と理由を見る
board = [[1, 0, 2], [0, 1, 2], [2, 0, 1]]
print([board[i][i] for i in range(3)])斜めの線は [1,1,1] です。実行欄の winner(board) に渡すと『○の勝ち』になります。
完成したら、意地悪な例で試す

横の勝ちだけで成功! もう完成かな?

あと少しなんだよ。縦、斜め、空欄だらけ、勝者なしも試そう。プログラムは『都合のよい例』だけでなく、苦手な例で育つんだ。

複数の盤面を用意して、予想した結果と比較します。
自分の手で動かそう
例題を選び、結果を予想してから「実行する」を押そう。値を変えると、どの行が結果を決めるか見えてくるよ。
書き換えて試せます。Tabキーは半角スペース4つ分です。
上段中央と中段中央を取り出します。
この入力欄の使い方
コード内の input() に渡す値を1行ずつ書きます。input() がない例では空欄で大丈夫です。複数回呼ぶコードでは上から順に使います。
準備できました。
実行結果
実行すると、ここに結果を表示します。
Pythonは閲覧中の端末内で動作します。

学んだ道具で、ゲームの判定へ。 今日覚えた道具を、別の値でも試してみよう。自分で理由を説明できたら、とてもいい進歩なんだよ。