実習室Linux環境のFirefoxが原因かもしれないトラブルが多いので,この授業ではデフォルトのブラウザを Chrome にしてもらうことにしました.以下のコマンドを実行すると,その設定が行われます(cf. AProg/2019/ex01/Step1#Step1_2_aprog).
$ /roes/sample/takataka/aprog/setup.sh
デフォルトを Firefox に戻したいひとは,takataka に相談してください.
は AProg/2019 からたどってください. Notebook の扱いが分からないというひとはこちら: AProg/2019/ex01/Step1#step1_3
今日の notebook を開いてそこに記されたことを読んで&実行して学習しなさい. 完了したらチェックを受けなさい(notebookを開いたままにしておくこと).
当日中に完了できなかったひとが多い/大事な内容を含む,という理由から,この課題の提出期限を次週第7回10時までに延長します
次のことを全てやりなさい.
授業の際に作ったファイル 06constants.txt を読み込んでディクショナリに格納するプログラムを作ろう. 以下を修正しましょう.ファイル名は 06exB1.py としよう.
check ヒント: 2列目の値は浮動小数点数値としてディクショナリに登録したい → ファイルから読み込んだままの情報は文字列なので,変換が必要ですね.
##### AProg2019 第6回課題B-1 # 空のディクショナリを作る constants = {} # ファイルを読み込んで,1列目をキー,2列目を値(浮動小数点数値)としてディクショナリに登録 # キーの一覧を使ってループし,ディクショナリの内容を表示.p.194参照 for k in constants.keys(): print(k) # キー値 k に対応した値を小数点以下2桁まで表示させるように修正しよう
check ヒント: モジュールを import して「モジュール名」.「関数名」(なんたら)
顔検出しよう
県庁所在地クイズを作ろう
何問やる? 50 ★ 「50」はキーボードからの入力.1以上47以下の整数でなければ入力やり直しになる 何問やる? 0 何問やる? 5 1問目: 和歌山県の県庁所在地は? 和歌山市 ★ 「和歌山市」と入力して Enter,以下同様 正解! 2問目: 熊本県の県庁所在地は? くまもん ちゃうで 3問目: 長野県の県庁所在地は? 長野市 正解! 4問目: 秋田県の県庁所在地は? 秋田犬 ちゃうで 5問目: 岡山県の県庁所在地は? 岡山市 正解! 5問中3問正解やったで
keyList = list(hoge.keys()) # この例では hoge がディクショナリ
三目並べ = oxゲーム = Tic-Tac-Toe を作ろう
この課題はいつもより少し配点大きくします.
### AProg2019-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)
### AProg2019-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 のプログラムをもとにして,次のことをやりましょう.