PYTHON はじめの一歩 / LESSON 13

三目並べを作ろう。

9マスの盤面をリストで表し、条件を調べ、関数にまとめます。小さな部品を組み合わせて完成させよう。

学びを始める

学んだ道具で、ゲームの判定へ。 | 動画なしでも学べます

三目並べを作ろう。をあおい・はる・AI先生・ROBORONと考えるイラスト
学んだ道具で、ゲームの判定へ。
GOAL

この回でできるようになること

  • 01二重リストで3×3の盤面を表す
  • 02行・列・斜めの勝ち筋を調べる
  • 03複数の盤面で判定を試し、見落としを探す
ことばの窓
01 / EXPLORE

9マスをデータにする

3つの行を、それぞれ3個の値を持つリストにします。0は空欄、1は○、2は×を表します。

あおい

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

AI先生

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

はる

board[0][1] は上の行の真ん中です。

実際のコードまず結果を予想してみよう
board = [[1, 1, 1],
         [2, 0, 2],
         [0, 0, 0]]
print(board[0][1])
print(board[1][1])
実行すると1 / 0

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

目で見てわかる9マスをデータにする
図13-1 0を空欄、1を○、2を×として表します。
図13-1 0を空欄、1を○、2を×として表します。
ROBORONのチェック!

1行ずつ手で書いて、位置番号を確かめよう。

02 / EXPLORE

勝てる線を全部並べる

勝利は横3本、縦3本、斜め2本の計8本のどれかで起こります。まずは線をデータにまとめます。

あおい

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

AI先生

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

はる

条件を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))
実行すると8

なぜ? 横3本に縦3本を追加し、斜め2本を加えて合計8本です。c は列番号、r は行番号です。

目で見てわかる勝てる線を全部並べる
図13-2 8本の線を漏れなく調べます。
図13-2 8本の線を漏れなく調べます。
ROBORONのチェック!

内包表記が難しければ、普通の for で1マスずつ append() してもよいよ。

03 / EXPLORE

勝者を判定する

同じ記号が1本の線に3個そろったら勝ち。空欄の0が3個並んでも勝ちではありません。

あおい

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

AI先生

そこは大事なチェックだね。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の線は勝ちと判定しません。

目で見てわかる勝者を判定する
図13-3 実際の勝ち筋を1本ずつ調べます。
図13-3 実際の勝ち筋を1本ずつ調べます。
ROBORONのチェック!

実際の対戦アプリにするなら、手番・入力検証・引き分けも追加しよう。

04 / YOUR TURN

予想して、理由まで確かめよう

答えを選んだら、説明を読んでから実行欄でも試してみよう。

チャレンジどれになるかな?

[[0,0,0],[1,2,1],[2,1,2]] の上段は、誰かの勝ち?

答えを選ぶと理由が表示されます。

PUT IT TOGETHER

小さな練習:斜めの勝ちを試そう

実行欄の『勝者を調べる』を選び、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) に渡すと『○の勝ち』になります。

COFFEE BREAK

完成したら、意地悪な例で試す

あおい

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

AI先生

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

はる

複数の盤面を用意して、予想した結果と比較します。

05 / RUN PYTHON

自分の手で動かそう

例題を選び、結果を予想してから「実行する」を押そう。値を変えると、どの行が結果を決めるか見えてくるよ。

例題を選ぶ

書き換えて試せます。Tabキーは半角スペース4つ分です。

上段中央と中段中央を取り出します。

この入力欄の使い方

コード内の input() に渡す値を1行ずつ書きます。input() がない例では空欄で大丈夫です。複数回呼ぶコードでは上から順に使います。

準備できました。

実行結果

実行すると、ここに結果を表示します。

Pythonは閲覧中の端末内で動作します。

AI先生からひとこと

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