は AProg/2018 からたどってください. Notebook の扱いが分からないというひとはこちら: AProg/2018/ex01/Step1#step1_3
今日の notebook を開いてそこに記されたことを読んで&実行して学習しなさい. 完了したらチェックを受けなさい(notebookを開いたままにしておくこと).
次のことを全てやりなさい.
授業の際に作ったファイル 06constants.txt を読み込むプログラムを作ろう. 以下を修正しましょう.
##### AProg2018 第6回課題B-1
# 空のディクショナリを作る
constants = {}
# ファイルを読み込んで,1列目をキー,2列目を値(浮動小数点数値)として辞書に登録
# キーの一覧を使ってループし,ディクショナリの内容を表示.p.194参照
for k in constants.keys():
print(k) # キー値 k に対応した値を小数点以下2桁まで表示させるように修正しよう
顔検出しよう
県庁所在地クイズを作ろう
何問やる? 50 ★ 「50」はキーボードからの入力.1以上47以下の整数でなければ入力やり直しになる 何問やる? 0 何問やる? 5 1問目: 和歌山県の県庁所在地は? 和歌山市 ★ 「和歌山市」と入力して Enter,以下同様 正解! 2問目: 熊本県の県庁所在地は? くまもん ちゃうで 3問目: 長野県の県庁所在地は? 長野市 正解! 4問目: 秋田県の県庁所在地は? 秋田犬 ちゃうで 5問目: 岡山県の県庁所在地は? 岡山市 正解! 5問中3問正解やったで
keyList = list(hoge.keys()) # この例では hoge がディクショナリ
三目並べ = oxゲーム = Tic-Tac-Toe を作ろう
この課題はいつもより少し配点大きくします.
### AProg2018-ex06 三目並べ = oxゲーム = Tic-Tac-Toe
# 盤面の状態を表すディクショナリ
mark = {0:" ", 1:"o", -1:"x"}
### リストのリストで表された盤面情報を o,x で表示する
#
def printBoard(board):
print(board) # 実行例のように縦横に o や x が並ぶようにしよう
# printBoard の動作確認
board = [[0, 1, -1], [1, 0, -1], [0, 0, 0]]
printBoard(board)

isValid(board, x, y)
### AProg2018-ex06 三目並べ = oxゲーム = Tic-Tac-Toe
# 盤面の状態を表すディクショナリ
mark = {0:" ", 1:"o", -1:"x"}
### リストのリストで表された盤面情報を o,x で表示する
#
def printBoard(board):
#中身は自分で.mark 使うこと
### 位置 (x, y) が有効(盤面の範囲内かつまだoxがついてない)なら True, さもなくば False
#
def isValid(board, x, y):
#中身は自分で
### 入力を受け付ける.有効な位置でなければ再入力してもらう
#
def procUserInput(board):
while True:
msg = "どこに置く? 「0 1」のようにスペース入れて縦横の数を入力してね: "
s = input(msg).split()
if len(s) == 2:
y, x = int(s[0]), int(s[1])
if isValid(board, x, y):
return y, x
else:
print("そこには置けへんで.", end="")
print("入力し直して")
# 3 x 3 の盤面
board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
# o の番なら 1, x の番なら -1
turn = 1
while True:
printBoard(board)
if turn == 1:
print(" o の番ほげ.", end="")
else:
print(" x の番ほげ.", end="")
y, x = procUserInput(board)
turn *= -1
### ゲーム終了かどうか判定.戻り値は次の通り.この関数は修正不要
#
# -2: 引き分けでゲーム終了, -1: xの勝利
# 0: まだゲーム終了でない 1: oの勝利
#
def checkGameOver(board):
boardSize = len(board)
# 横一行 mark がそろっていたら mark を返す
for i in range(boardSize):
mark = board[i][0]
if mark == 0:
continue
j = 1
while j < boardSize and board[i][j] == mark:
j += 1
if j == boardSize:
return mark
# 縦一列 mark がそろっていたら mark を返す
for j in range(boardSize):
mark = board[0][j]
if mark == 0:
continue
i = 1
while i < boardSize and board[i][j] == mark:
i += 1
if i == boardSize:
return mark
# 右下がりに mark がそろっていたら mark を返す
mark = board[0][0]
if mark != 0:
i = 1
while i < boardSize and board[i][i] == mark:
i += 1
if i == boardSize:
return mark
# 右上がりに mark がそろっていたら mark を返す
mark = board[boardSize-1][0]
if mark != 0:
i = 1
while i < boardSize and board[boardSize-1-i][i] == mark:
i += 1
if i == boardSize:
return mark
# 盤面が埋まってたら引き分け
for i in range(boardSize):
for j in range(boardSize):
if board[i][j] == 0:
return 0
return -2
コンピュータと対戦できるように改造しよう.先手番 o は常に人間側(あなた)で後手番 x は乱数使ってランダムに手を打たせるようにしたらよい.
ここまでのプログラムをうまく作っていたら,盤面を表すリストのリストを 3x3 ではなく 4x4, 5x5 等の適当なサイズにしても動作するようになっているはずです.動作を確認して,そうなっていなければ修正しなさい.
課題C のプログラムをもとにして,次のことをやりましょう.