Python项目开发案例二简易五子棋游戏控制台版
Python项目开发案例(二)————简易五子棋游戏(控制台版)
二、简易五子棋游戏(控制台版)
2.1 需求分析
本节开发的五子棋游戏为控制台版,因此要求游戏应该具有以下功能:
- 可以循环打印棋盘;
- 可以单机对战;
- 对战双方有一方胜利时,打印胜利棋盘及赢家;
- 判断棋子是否超出棋盘范围;
- 判断指定坐标位置是否已经存在棋子;
- 界面美观,提示明显。
2.2 游戏设计
2.2.1 游戏功能结构
2.2.2 游戏业务流程
简易五子棋游戏(控制台版)业务流程如下图所示。
2.3 游戏开发必备
2.3.1 游戏开发环境
本游戏的开发及运行环境具体如下:
- 操作系统:Windows7、Windows10等;
- Python版本:Python3.7;
- 开发工具:Pycharm。
2.3.2 文件夹组织结构
简易五子棋游戏(控制台版)只有一个gobang.py文件,表示该软件的代码文件,所有实现五子棋逻辑的代码都在该文件中。
2.4 棋盘设置
2.4.1 棋盘设置实现流程
棋盘设置实现流程及用到的关键技术如图所示。
2.4.2 初始化棋盘
开发五子棋游戏时,首先需要对棋盘进行初始化,五子棋的棋盘类似于一个二维的列表,因此,本程序中通过一个名称为checkboard的二维列表,来存储五子棋的棋盘,代码如下:
finish = False #游戏是否结束
flagNum = 1 #当前下棋者标记
flagch = 'a' #当前下棋者棋子
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('-')
2.4.3 打印棋盘
用户要在五子棋游戏中下棋,首先需要显示五子棋的棋盘,由于本程序是控制台程序,因此直接在Pycharn中选中gobang,py文件,单击Pycharn界面右上角的
按钮,即可在Pycharn的控制台中显示棋盘。
2.4.2小节已经初始化了五子棋的棋盘,接下来的工作只需要将其打印输出即可,这里使用一个嵌套的for循环,遍历存储五子棋棋盘的二维列表,然后将遍历到的元素的一次输出即可。代码如下:
#打印棋盘
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")
2.4.4 打印胜利棋盘及赢家
玩五子棋游戏时,如果有一方胜利,则打印最终的棋盘,并输出赢家。
定义一个msg()函数,用来输出最后胜利的棋盘及赢家,该函数中,主要是使用嵌套的for循环输出最终胜利的五子棋棋盘,而输出赢家则通过判断变量flagNum的值来实现。msg()函数实现代码如下:
def mag():
#输出最后胜利的棋盘
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')
2.4.5 为控制台设置不同字体和背景色
2.5 五子棋算法
2.5.1 五子棋算法分析
五子棋的游戏规则是,以落棋点为中心,向八个方向查找同一类型的棋子,如果相同棋子数大于或等于5,则表示此类型棋子的玩家为赢家。五子棋棋子查找方向如图所示。
图1 判断一枚棋子在八个方向上摆出的棋型
2.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()
2.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()
2.6 下棋设置
2.6.1 下棋设置实现流程
下棋设置实现流程及用到的关键技术如图所示。
2.6.2 判断当前下棋者
在五子棋游戏下棋中时,有对战双方,具体体现在控制台中分别以不同的背景色和字体颜色来显示。
本程序中主要通过一个flagNum变量来判断对战双方的身份,如果该变量为1,则下棋方为“*”,否则,下棋方为“o”,实现代码如下:
#判断当前下棋者
if flagNum == 1:
flagch = '*'
print('\033[1;37;45m请*输入棋子坐标(例如A1):\033[0m',end='') # 粉字黑底
else:
flagch = '*'
print('\033[1;37;42m请o输入棋子坐标(例如J5):\033[0m',end='') # 黑字绿底
另外,在一方下完棋之后,需要改变flagNum变量的值,以便更换下棋者,代码如下:
flagNum *= -1; #更换下棋者标记
2.6.3 记录棋子坐标
在五子棋游戏中实现下棋功能时,主要通过记录棋子的坐标,来确定放在哪个位置,这里首先使用input()函数记录输入的棋子坐标,坐标形式为“大写字母+1到10的数字”(例如A1,A为横坐标,1为纵坐标),然后需要将坐标转换为X、Y值,将首字母转换X坐标,需要使用ord()函数获取字母对应的ASCII码值,然后减去A字母的ASCII码值;而将第2个数字转换为Y坐标,只需要减去1即可,因为索引从0开始。实现记录棋子坐标的代码如下:
#输入棋子坐标
str = input()
ch = str[0] #获取第一个字符的大写形式
x = ord(ch) - 65
y = int(str[1]) - 1
2.6.4 判断棋子坐标
在实现五子棋(控制台版)游戏时,设置的棋盘为10
10的,因此输入的坐标一定要在棋盘范围内,如果超过范围,则打印相应的提示信息。
由于五子棋的棋盘是10
10,而棋盘坐标索引是从0开始的,因此只要X坐标或Y坐标不在0~9的范围内,即可说明棋子坐标超出了棋盘的范围,实现代码如下:
#判断坐标是否在棋盘之内
if(x < 0 or x > 9 or y < 0 or y > 9 ):
print('\033[31m***您输入的坐标有误请重新输入!***\033[0m')
continue
2.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
2.7 小结
本章主要使用Python语言开发了一个简易五子棋游戏(控制台版)项目,项目的核心是五子棋的实现算法;另外,五子棋游戏在控制台中与用户进行交互,如大家所知,控制台中通常都是以黑色背景和白色字体显示数据的,如何在控制台中拥有良好的用户体验是本项目的一个难点,本项目通过在print()打印函数中设置背景颜色、字体颜色来解决这一难点。通过本章的学习,读者应该熟练掌握五子棋游戏的实现算法,并熟悉如何改变PyCharn控制台的背景颜色和字体颜色。