五子棋是中國古代的傳統黑白棋種之一。五子棋不僅能增強思維能力,提高智力,而且富含哲理,有助於修身養性。五子棋既有現代休閒的明顯特徵短、平、快
,又有古典哲學的高深學問陰陽易理
;既具有簡單易學的特性,爲人們所喜愛,又有深奧的技巧和高水平的國際性比賽。五子棋文化源遠流長,具有東方的神祕和西方的直觀;既有場
的概念,亦有點
的連接。五子棋起源於中國古代,發展於日本,風靡於歐洲,可以說五子棋是中西方文化的交流點,是古今哲學的結晶。這裏將使用Python語言開發一個彩色的控制檯版五子棋遊戲,以便讓用戶熟悉五子棋遊戲的實現原理。
1. 需求分析
開發的五子棋遊戲爲控制檯版,因此要求遊戲應該具備以下功能:
- 可以循環打印棋盤;
- 可以單機對戰;
- 對戰雙方有一方勝利時,打印勝利棋盤及贏家;
- 判斷棋子是否超出棋盤範圍;
- 判斷指定座標位置是否已經存在棋子;
- 界面比較美觀、提示明顯。
2. 遊戲設計
2.1 遊戲功能結構
五子棋(控制檯版)遊戲功能結構如圖所示。
2.2 遊戲業務流程
3. 代碼
五子棋的遊戲規則是,以落棋點爲中心,向八個方向查找同一類型的棋子,如果相同棋子數大於或等於5,則表示此類型棋子的玩家爲贏家。五子棋棋子查找方向如圖所示。
# -*- coding: utf-8 -*-
# @Time : 2020/3/8 11:24
# @Author : 我就是任性-Amo
# @FileName: 47.簡易五子棋遊戲.py
# @Software: PyCharm
# @Blog :https://blog.csdn.net/xw1680
# TODO 1.初始化棋盤
finish = False # 判斷遊戲是否結束
flagNum = 1 # 當前下棋者的標記
flag_ch = "" # 初始化棋子
chessboard_coordinates = "" # 初始化棋子座標
x = 0 # 當前棋子的橫座標 代表字母所在行
y = 0 # 當前棋子的縱座標 代表數字編號所在列
checkerboard = [["-" for j in range(10)] for i in range(10)] # 初始化棋盤
print("\033[1;37;41m---------------簡易五子棋遊戲(控制檯版)---------------\033[0m")
# TODO 2.定義一個msg()函數,用來輸出最後勝利的棋盤及贏家
def msg():
# 輸出棋盤
print("\033[1;37;44m-------------------------------------------------")
print(" 1 2 3 4 5 6 7 8 9 10")
for i in range(len(checkerboard)):
print(chr(i + ord("A")) + "", end=" ")
for j in range(len(checkerboard[i])):
print(checkerboard[i][j] + " ", end=" ")
print()
print("-------------------------------------------------", end="")
print("\033[0m")
# 輸出贏家
if flagNum == 1:
print("\033[32m*棋勝利!***\033[0m")
else:
print("\033[32mx棋勝利!***\033[0m")
# TODO 3.主邏輯
# 因爲棋盤要一直顯示 所以要使用循環 循環結束的條件是有一方五子連珠 所以這裏設置一個Flag來管控
while not finish:
# 輸出棋盤
print("\033[1;40;46m-------------------------------------------------")
print(" 1 2 3 4 5 6 7 8 9 10")
for i in range(len(checkerboard)):
print(chr(i + ord("A")) + "", end=" ")
for j in range(len(checkerboard[i])):
print(checkerboard[i][j] + " ", end=" ")
print()
print("-------------------------------------------------", end="")
print("\033[0m")
# 判斷當前下棋者
if flagNum == 1:
flag_ch = "*"
print("\033[1;37;40m請*輸入棋子座標(例如A1): \033[0m", end=" ") # 白字黑底
else:
flag_ch = "x"
# 輸入棋子座標
print("\033[1;30;42m請x輸入棋子座標(例如J5): \033[0m", end=" ") # 黑字綠底
chessboard_coordinates = input() # 輸入棋子座標
# 獲取第一個字符(即字母) 通過字母算出橫座標
x = ord(chessboard_coordinates[0]) - 65
# 注意這裏可能用戶輸入的座標爲:A11 此時我們需要的是A後面所有的數字 不能只寫chessboard_coordinates[1]
y = int(chessboard_coordinates[1:]) - 1
# 判斷座標是否在棋盤內
# Remove redundant parentheses: 刪除多餘的括號
if x < 0 or x > 9 or y < 0 or y > 9:
print("\033[31m***您輸入的座標有誤請重新輸入!***\033[0m")
continue
# 判斷座標上是否有棋子
if checkerboard[x][y] == "-":
checkerboard[x][y] = flag_ch
else:
print('\033[31m******您輸入位置已經有其他棋子,請重新輸入!\033[0m')
continue
# 判斷五子連珠算法
# 左側
if y - 4 >= 0:
if checkerboard[x][y - 1] == flag_ch and checkerboard[x][y - 2] == flag_ch and \
checkerboard[x][y - 3] == flag_ch and checkerboard[x][y - 4] == flag_ch:
finish = True
msg()
# 右側
if y + 4 <= 9:
if checkerboard[x][y + 1] == flag_ch and checkerboard[x][y + 2] == flag_ch and \
checkerboard[x][y + 3] == flag_ch and checkerboard[x][y + 4] == flag_ch:
finish = True
msg()
# 上方
if x - 4 >= 0:
if checkerboard[x - 1][y] == flag_ch and checkerboard[x - 2][y] == flag_ch and \
checkerboard[x - 3][y] == flag_ch and checkerboard[x - 4][y] == flag_ch:
finish = True
msg()
# 下方
if x + 4 <= 9:
if checkerboard[x + 1][y] == flag_ch and checkerboard[x + 2][y] == flag_ch and \
checkerboard[x + 3][y] == flag_ch and checkerboard[x + 4][y] == flag_ch:
finish = True
msg()
# 判斷棋子右上方
if x - 4 >= 0 and y + 4 <= 9:
# 輸入棋子座標的順序: A8 B7 C6 D5 E4
# 最後座標爲:E4 --> A8 可以清晰看出D5 C6 B7 A8 是在E4座標的右上方
if checkerboard[x - 1][y + 1] == flag_ch and checkerboard[x - 2][y + 2] == flag_ch and \
checkerboard[x - 3][y + 3] == flag_ch and checkerboard[x - 4][y + 4] == flag_ch:
finish = True
msg()
# 判斷棋子左下方
if x + 4 <= 9 and y - 4 >= 0:
# 輸入棋子座標的順序: E4 D5 C6 B7 A8 # 以最後輸入的A8座標爲準
# 最後座標爲:A8 --> E4 可以清晰看出E4 D5 C6 B7 是在A8左下方
if checkerboard[x + 1][y - 1] == flag_ch and checkerboard[x + 2][y - 2] == flag_ch and \
checkerboard[x + 3][y - 3] and checkerboard[x + 4][y - 4]:
finish = True
msg()
# 判斷棋子左上方
if x - 4 >= 0 and y - 4 >= 0:
# 輸入棋子座標的順序: A1 B2 C3 D4 E5
# 最後座標:E5 --> A1 可以清晰看出A1 B2 C3 D4 是在E5左上方
if checkerboard[x - 1][y - 1] == flag_ch and checkerboard[x - 2][y - 2] == flag_ch and \
checkerboard[x - 3][y - 3] == flag_ch and checkerboard[x - 4][y - 4] == flag_ch:
finish = True
msg()
# 判斷棋子右下方
if x + 4 <= 9 and y + 4 <= 9:
# 輸入棋子座標的順序: E5 D4 C3 B2 A1
# 最後輸入棋子座標:A1 --> E5 可以清晰看出B2 C3 D4 E5是在A1的右下方
if checkerboard[x + 1][y + 1] == flag_ch and checkerboard[x + 2][y + 2] == flag_ch and \
checkerboard[x + 3][y + 3] == flag_ch and checkerboard[x + 4][y + 4] == flag_ch:
finish = True
msg()
flagNum = -flagNum
4. 打包爲可執行文件
Python項目編寫完成後,可以將其打包成一個可執行文件,這樣就可以在其他計算機上運行該項目了,即使這臺計算機上沒有安裝Python開發環境。
實現打包可執行文件時,需要使用PyInstaller模塊,該模塊爲第三方模塊所以需要單獨安裝。PyInstaller模塊支持多種操作系統,如Windows、Linux、 Mac OS X等,但是該模塊並不支持跨平臺操作。例如: 如果是在Windows操作系統下打包的.exe可執行文件,該文件就只能在Windows環境下運行。
這裏以我的MacOS操作系統爲例,介紹PyInstaller 模塊的安裝。安裝PyInstaller模塊最簡單的方式就是在Pycharm的Terminal中輸入pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com pyinstaller
命令進行安裝,如圖所示。
PyInstaller模塊安裝完成以後,可以輸入pyintaller --version
命令,通過查詢PyInstaller模塊版本的方式檢測安裝是否成功。如圖所示:
PylInstaller模塊安裝完成以後,就可以打包.py文件爲可執行文件了。具體方法如下。
- 打開終端窗口(windows通過cmd打開命令提示符),在當前光標位置輸入:
pyinstaller + -F + (要打包的.py文件的絕對路徑)
,例如,該文件保存在/Users/xiangwei/Desktop/python_code/基礎練習/gobang.py
目錄中,則可以使用下面的代碼對其打包:
pyinstaller -F /Users/xiangwei/Desktop/python_code/基礎練習/gobang.py
輸入上面的代碼並按下Enter
鍵,將自動生成可執行文件,具體過程如圖所示
在上圖所示的位置,找到可執行文件的保存路徑,並且在該路徑下找到生成的可執行文件,雙擊該文件即可運行本項目。效果如圖所示。
windows打包後的.exe可執行文件可在我的百度網盤中獲取,提取鏈接及密碼如下:
鏈接:https://pan.baidu.com/s/1YTKhkyQnT9NfwUhU784O4A
密碼:ri9h
5. 總結
這裏主要使用Python語言開發了一個簡易五子棋遊戲(控制檯版)項目,項目的核心是五子棋的實現算法。另外,五子棋遊戲在控制檯中與用戶進行交互,如大家所知,控制檯中通常都是以黑色背景和白色字體顯示數據的,如何在控制檯中擁有良好的用戶體驗也是本項目的一個難點,本項目通過在print()打印函數中設置背景顏色、字體顏色來解決這一難點。 通過這裏的學習,大家應該熟練掌握五子棋遊戲的實現算法,並熟悉如何改變PyCharm控制檯的背景顏色和字體顏色。