本节开发的五子棋游戏为控制台版,因此要求游戏应该具有以下功能:
简易五子棋游戏(控制台版)业务流程如下图所示。
本游戏的开发及运行环境具体如下:
简易五子棋游戏(控制台版)只有一个gobang.py文件,表示该软件的代码文件,所有实现五子棋逻辑的代码都在该文件中。
棋盘设置实现流程及用到的关键技术如图所示。
开发五子棋游戏时,首先需要对棋盘进行初始化,五子棋的棋盘类似于一个二维的列表,因此,本程序中通过一个名称为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('-')
用户要在五子棋游戏中下棋,首先需要显示五子棋的棋盘,由于本程序是控制台程序,因此直接在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")
玩五子棋游戏时,如果有一方胜利,则打印最终的棋盘,并输出赢家。
定义一个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')
五子棋的游戏规则是,以落棋点为中心,向八个方向查找同一类型的棋子,如果相同棋子数大于或等于5,则表示此类型棋子的玩家为赢家。五子棋棋子查找方向如图所示。
图1 判断一枚棋子在八个方向上摆出的棋型
判断棋子的上、下、左、右方向,主要是判断与棋子的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()
判断棋子的对角线方向,主要是判断对角线上与棋子坐标相邻的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()
下棋设置实现流程及用到的关键技术如图所示。
在五子棋游戏下棋中时,有对战双方,具体体现在控制台中分别以不同的背景色和字体颜色来显示。
本程序中主要通过一个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; #更换下棋者标记
在五子棋游戏中实现下棋功能时,主要通过记录棋子的坐标,来确定放在哪个位置,这里首先使用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
在实现五子棋(控制台版)游戏时,设置的棋盘为1010的,因此输入的坐标一定要在棋盘范围内,如果超过范围,则打印相应的提示信息。
由于五子棋的棋盘是1010,而棋盘坐标索引是从0开始的,因此只要X坐标或Y坐标不在0~9的范围内,即可说明棋子坐标超出了棋盘的范围,实现代码如下:
#判断坐标是否在棋盘之内
if(x < 0 or x > 9 or y < 0 or y > 9 ):
print('\033[31m***您输入的坐标有误请重新输入!***\033[0m')
continue
在五子棋(控制台版)游戏中对战时,如果一方已经在一个坐标位置下了棋子,则另一方就不能再该位置下棋子,如果下了,则应该出现相应的提示信息。
五子棋棋盘每个坐标位置的默认值为“-”,而下棋之后,值会变为“*”或者“o”,因此,要判断指定坐标位置是否有棋子,只需要判断其值是否为“-”即可,如果为“-”,则可以下棋,否则,打印相应的提示信息,代码如下:
#判断坐标上是否有棋子
if(checkerboard[x][y] == '-')
if(flagNum == 1):
checkerboard[x][y] == '*'
else:
checkerboard[x][y] == 'o'
else:
print('\033[31m******您输入位置已经有其他棋子,请重新输入!\033[0m')
continue
本章主要使用Python语言开发了一个简易五子棋游戏(控制台版)项目,项目的核心是五子棋的实现算法;另外,五子棋游戏在控制台中与用户进行交互,如大家所知,控制台中通常都是以黑色背景和白色字体显示数据的,如何在控制台中拥有良好的用户体验是本项目的一个难点,本项目通过在print()打印函数中设置背景颜色、字体颜色来解决这一难点。通过本章的学习,读者应该熟练掌握五子棋游戏的实现算法,并熟悉如何改变PyCharn控制台的背景颜色和字体颜色。