3.1 需求分析
-
可以循环打印棋盘
-
可以单机对战
-
对战双方有一方胜利时,打印胜利棋盘及赢家
-
判断棋子是否超出棋盘范围
-
判断指定坐标位置是否已经存在棋子
-
界面美观,提示明显
3.2 游戏设计
3.2.1 游戏功能结构
简易五子棋游戏(控制台版)
-
棋盘设置
-
初始化棋盘
-
打印棋盘
-
打印胜利棋盘及赢家
-
为控制台设置不同字体和背景色
-
-
五子棋算法
-
判断棋子上,下,左,右方
-
判断棋子对角线方向
-
-
下棋设置
-
判断当前下棋者
-
记录棋子坐标
-
判断棋子坐标
-
判断指定坐标位置是否有棋子
-
3.2.2 游戏业务流程
开始 --> 初始化棋盘 --> 绘制棋盘 --> 输入棋子坐标 --> 判断坐标 --N--> 输入棋子坐标
--Y -- > 输入棋子到棋盘--> 是否五子连珠 -->Y --> 结束
-->N --> 另一玩家
3.2.3 游戏预览
3.3 开发必备
3.3.1 游戏开发环境
操作系统:win7, win10
python版本:3.7
开发工具:pycharm
3.3.2 文件夹组织架构
只有一个gobang.py文件
3.4 棋盘设置
3.4.1 棋盘设置实现流程
开始 --> 初始化棋盘 【应用:嵌套for循环和列表】 --> 打印棋盘 【应用:range()函数和print()函数】 --> 打印胜利棋盘和赢家【应用:print()函数和int标识变量】 ----> 设置字体和颜色【应用: \033[显示方式:前景色;背景色]】 ---> 结束
3.4.2 初始化棋盘
首先初始化棋盘,类似一个二维列表,因此通过一个名称为checkerboard的二维列表存储五子棋的棋盘,代码如下
finish = False # 游戏是否结束 flagNum = 1 # 当前下棋者标记 flagch = '*' # 当前下棋者棋子 x = 0 # 当前棋子的横坐标 y = 0 # 当前棋子的纵坐标 print('\033[1;37;41m-------简易五子棋游戏(控制台版) ------\033[0m') # 棋盘初始化 checkerboard = [] for i in range(10): checkerboard.append([]) for j in range(10): checkerboard[i].append('-')
3.4.3 打印棋盘
# 打印棋盘 print('\033[1;30;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('--------------------------------------------\033[0m')
3.4.4 打印胜利及棋盘方赢家
定义一个msg()函数,用来输出最后胜利的棋盘及赢家,该函数中,主要是使用嵌套的for循环输出最终胜利的五子棋棋盘,而输出赢家则通过判断变量flagNum的值来实现,msg()函数实现代码如下
def msg(): # 输出最后胜利的棋盘 print('\033[1;37;41m-----------------------------') 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('-------------------------\033[0m') # 输出赢家 if (flagNum == 1): print('\033[32m*棋胜利! ***\033[0m') else: print('\033[32mo棋胜利! ***\033[0m')
3.4.5 为控制台设置不同字体及背景色
语法:
\033[显示方式;前景色;背景色m
第一个参数指定显示方式的值,控制台中的显示方式值及说明如下表
控制台中的显示方式值及说明
显示方式 | 说明 | 显示方式 | 说明 |
---|---|---|---|
0 | 终端默认设置 | 1 | 高亮显示 |
4 | 使用下划线 | 5 | 闪烁 |
7 | 反白显示 | 8 | 不可见 |
第2个和第3个参数分别用来设置前景色和背景色的色值,Pycharm控制台中的前景色,背景色对应色值如表所示
Pycharm控制台中的前景色、背景色对应色值
颜色 | 前景色 | 背景色 |
---|---|---|
黑色 | 30 | 40 |
红色 | 31 | 41 |
绿色 | 32 | 42 |
黄色 | 33 | 43 |
蓝色 | 34 | 44 |
紫红色 | 35 | 45 |
青蓝色 | 36 | 46 |
白色 | 37 | 47 |
例如,要设置某一区域显示不同的颜色,使用下面代码即可
print('\033[1;30;46m-------------') print(' 1 2 3 4 5 6 7 8 9 10') # 省略其他代码 print('-------------------------------\033[0m')
而如果只设置一行显示不同的颜色,则使用下面代码
print('\033[1;37;41m------简易五子棋游戏(控制台版)--------------\033[0m')
3.5 算法
3.5.1 五子棋算法分析
游戏规则:以落棋点为中心,向八个方向查找同一类型的棋子,如果相同棋子数大于或等于5,则表示此类型棋子的玩家为赢家。
3.5.2 判断棋子上、下、左、右方向
判断棋子的上下左右方向,主要是判断与棋子的X坐标或Y坐标相邻的4个棋子是不是同一个颜色的棋子,如果是,则将finish标识设置为True,即结束循环下棋,然后调用msg()函数打印胜利棋盘及赢家。
# 判断棋子左侧 if (y - 4 >= 0): if (checkerboard[x][y - 1] == flagch and checkerboard[x][y - 2] == flagch and checkerboard[x][y - 3] == flagch and checkerboard[x][y - 4] == flagch): finish = True msg() # 判断棋子右侧 if (y + 4 <= 9): if (checkerboard[x][y + 1] == flagch and checkerboard[x][y + 2] == flagch and checkerboard[x][y + 3] == flagch and checkerboard[x][y + 4] == flagch): finish = True msg() # 判断棋子上方 if (x - 4 >= 0): if (checkerboard[x-1][y] == flagch and checkerboard[x-2][y] == flagch and checkerboard[x-3][y] == flagch and checkerboard[x-4][y] == flagch): finish = True msg() # 判断棋子下方 if (x + 4 <= 9): if (checkerboard[x+1][y] == flagch and checkerboard[x+2][y] == flagch and checkerboard[x+3][y] == flagch and checkerboard[x+4][y] == flagch): finish = True msg()
3.5.3 判断棋子对角线方向
即判断对角线上与棋子坐标相邻的4个棋子是不是同一个颜色棋子。如果是,则将finish标识设置为True,则结束循环下棋,然后调用msg()函数打印胜利棋盘及赢家:
# 判断棋子右上方向 if (x - 4 >= 0 and y - 4 >= 0): if (checkerboard[x-1][y-1] == flagch and checkerboard[x-2][y-2] == flagch and checkerboard[x-3][y-3] == flagch and checkerboard[x-4][y-4] == flagch): finish = True msg() # 判断棋子右下方向 if (x + 4 <= 9 and y - 4 >= 0): if (checkerboard[x+1][y-1] == flagch and checkerboard[x+2][y-2] == flagch and checkerboard[x+3][y-3] == flagch and checkerboard[x+4][y-4] == flagch): finish = True msg() # 判断棋子左上方向 if (x - 4 >= 0 and y + 4 <= 9): if (checkerboard[x-1][y+1] == flagch and checkerboard[x-2][y+2] == flagch and checkerboard[x-3][y+3] == flagch and checkerboard[x-4][y+4] == flagch): finish = True msg() # 判断棋子左下方向 if (x + 4 <= 9 and y + 4 <= 9): if (checkerboard[x+1][y+1] == flagch and checkerboard[x+2][y+2] == flagch and checkerboard[x+3][y+3] == flagch and checkerboard[x+4][y+4] == flagch): finish = True msg()
3.6 下棋设置
3.6.1 实现流程
开始 --> 判断当前下棋者(应用:int标识变量) --> 记录棋子坐标(应用:input()函数和 ord()函数) --> 判断棋子坐标(应用:if中应用or判断多条件) --> 判断指定坐标是否有棋子(应用:获取二维列表的值) --> 结束
3.6.2 判断当前下棋者
对战双方:控制台中用不同背景色和字体颜色显示
flagNum:判断对战双方身份,如果变量为1,下棋方为*,否则为‘o'
# 判断当前下棋者 if flagNum == 1: flagch = '*' print('\033[1;37;45m请*输入棋子坐标(例如A1): \033[0m', end = ' ') # 粉字黑底 else: flagch = 'o' print('\033[1;30;42m请o输入棋子坐标(例如J5):\033[0m', end = ' ') # 黑字绿底 # 在一方下完棋之后,需要改变flagNum变量的值,以便更换下棋者 flagNum *= -1; # 更换下棋者标记
3.6.3 记录棋子坐标
input()函数记录输入的棋子坐标,坐标形式为”大写字母+1~10的数字“,如A1,A为横坐标,1为纵坐标
将坐标转换为X/Y值
首字母转换X坐标,需要使用ord()函数获取字母对应的ASCII值,然后减去A字母的ASCII值
第二个数字转换为Y坐标,-1即可,索引从0开始
# 输入棋子坐标 str = input() ch = str[0] # 获取第一个字符的大写形式 x = ord(ch) - 65 y = int(str[1]) - 1
3.6.4 判断棋子坐标
棋盘为10*10,输入的坐标要在棋盘范围内,否则超出范围,打印相应的提示信息,只要x或y不在0-9,即可说明棋子坐标超出了棋盘范围
# 判断坐标是否在棋盘之内 if(x<0 or x>9 or y< 0 or y>9): print('\033[31m***您输入的坐标有误请重新输入! *** \033[0m') continue
3.6.5 判断指定坐标位置是否有棋子
在五子棋(控制台版)游戏中对战时,如果一方已经在一个坐标位置下了棋子,则另一方就不能在该位置下棋子,如果下了,则应该出现相应的提示信息 **您输入位置已经有其他棋子,请重新输入!
五子棋棋盘每个坐标位置默认值为’-‘,而下棋之后,值会变为”*“或”o",因此,判断指定坐标位置是否有棋子,只需要判断其值是否为"-",如果为“-”,则可以下棋,否则打印相应的提示信息
# 判断坐标上是否有棋子 if (checkerboard[x][y] == '-'): if(flagNum == 1): checkerboard[x][y] = '*' else: checkerboard[x][y] = 'o' else: print('\033[31m*****您输入位置已经有其他棋子,请重新输入! \033[0m') continue
3.7 小结
在print()打印函数中设置背景颜色,字体颜色
掌握算法实现并熟悉如何改变pycharm控制台的背景颜色与字体颜色