简易五子棋游戏(控制台版)
五子棋是中国古代的传统黑白棋种之一。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征短、平、快
,又有古典哲学的高深学问阴阳易理
;既具有简单易学的特性,为人们所喜爱,又有深奥的技巧和高水平的国际性比赛。五子棋文化源远流长,具有东方的神秘和西方的直观;既有场
的概念,亦有点
的连接。五子棋起源于中国古代,发展于日本,风靡于欧洲,可以说五子棋是中西方文化的交流点,是古今哲学的结晶。这里将使用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控制台的背景颜色和字体颜色。