or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
Python實作課程
第三堂課 : Tic Tac Toe
2022 / 4 / 28
Tony
遊戲介紹
Tic Tac Toe 又叫井字遊戲
兩位玩家會在一個3*3的棋盤內輪流放置X和O佔領格子
當有連續的3個相同符號佔領一個橫排、直排、或對角線時,則該符號的玩家勝利。若所有格子都被佔領但雙方皆為滿足獲勝條件,則平局。
開始寫Code
要模板點我
這次會用到的技巧
Class
的各項工具:繼承, @staticmethod, …Try and Except
函式的運用all()
函式的運用list
的操作in enumerate(list)
的使用建議開一個資料夾叫做"TicTacToe"
這次會需要兩個.py的檔案
一、設定Player class
player.py
,寫兩個玩家的class,都繼承Player class,
一個代表電腦,一個代表真人玩家
letter 代表這個玩家會用什麼符號玩遊戲('X','O')
get_move是玩家決定下哪一步時執行的函式
二、遊戲初步設定
game.py
,寫一個TicTacToe的class並宣告一個list作為遊戲的棋盤,再宣告current_winner追蹤遊戲進行時隨時可能出現的贏家
執行後當前棋盤的模樣就會被印出來
重要:
i*3:(i+1)*3 for i in range(3)
這個概念要很清楚,之後還會用到!
印出各個位置代表的座標方便使用者放符號
這邊就需要 @staticmethod
告訴使用者現在哪邊還可以下
in enumerate(list) : 把list裡面每一項跟它的index用tuple(一種不能改變資料的陣列)包起來並分開
player.py
,完成兩種玩家的get_move函式在寫HumanPlayer之前你要先知道…
try and except:程式跑一跑遇到錯誤就會全盤中止,但我們希望碰到錯誤時不用終止而是通知使用者他做錯了,可以用try and except的方式處理
HumanPlayer的get_move函式
恭喜完成
player.py
裡面所有東西了play
函式回到
game.py
,在TicTacToe class
外面創一個play
函式,執行他就可以開始遊戲遊戲流程:
如果沒有,換玩家下並繼續遊戲
重複 1 ~ 3直到贏家產生 OR 沒空格
因為2,我們需要判斷盤面有無空格的function以及放棋子進盤面的function
empty_square(self)
: 回傳一個步林值代表現在盤面還有沒有空格,寫在TicTacToe class
裡面make_move(self)
: 把現在玩家要放的符號放在他選擇的位置,如果操作可行,回傳True,否則就回傳False兩個函式寫完就可以回來寫
play
函式此時整個遊戲快要完成了
只差最後一步:判定贏家
判定的時機應該是在每一次放棋子之後
所以我們可以在
if game.make_move(square, letter)
裡面塞入以下額外程式碼因為要在每一次放棋子之後判斷,我們在
make_move(self, square, letter)
函式裡面呼叫偵測贏家的函式winner(self, square, letter)
在
make_move(self, square, letter)
裡面補上以下程式碼self.winner(square, letter)
函式:判斷贏家我們判斷三個地方:
把這個函式寫在
TicTacToe class
裡面如果整列都同一個字母,則他為贏家
all()
函式:該陣列裡面每一個元素是否都不為0或空格如果整行都同一個字母,則他為贏家
\ 左上右下 : 第 0, 4, 8 格
/ 右上左下 : 第 2, 4, 6 格
如果全部判斷完都沒有一個符合,則回傳False,表示現在還沒有獲勝的局面
恭喜完成Play函式了!
有兩種版本可以玩:
恭喜各位完成最基礎的TicTacToe!