运行截图
![](https://img-blog.csdnimg.cn/direct/7900b7fa6938454eb2c2c2383b607a98.png)
函数准备
-
棋盘初始化函数
将棋盘二维数组与棋子数组初始化(设置初始值)
-
显示棋盘函数
将棋盘按照某一形状输出在控制台
-
角色下棋函数
将角色落子的坐标反应在棋盘二维数组中
-
判断胜利函数
判断是否有五个相同的子连成一线
-
悔棋函数
撤回刚才下的子
-
重新开始函数
重新开始游戏
游戏逻辑
由两位玩家分别进行落子,直到一方有五颗子连成一线游戏结束。在游戏进行中,玩家可以通过输入r/b来重新游戏/悔棋。
主函数具体流程
-
初始化棋盘
-
显示棋盘
-
由一位玩家输入落子位置或者选择重新游戏或悔棋
-
判断玩家输入的是位置/r/b
-
位置则判断位置是否合法,即是否超出棋盘范围、是否已有棋子在该位置。合法插入棋盘,并保存落子位置。若非法,则回到让玩家输入落子位置。
-
r则询问玩家是否重新开始(y/n),玩家确定,则重新开始游戏。玩家取消,则回到让玩家输入落子位置。
-
b则询问玩家是否悔棋(y/n),玩家确定,则撤销上一个棋子的位置,在棋盘中消除该棋子,回到上一位玩家输入落子位置。玩家取消,则回到让当前玩家输入落子位置。
-
玩家输入完合法落子位置后,判断是否有五个相同棋子连成一线,有则输出棋盘并显示胜利玩家的名称,无则输出棋盘,更换另一玩家输入落子位置。
完整代码
#改变背景色库文件
from colorama import init, Back
# 自动重置背景
init(autoreset=True)
# 存放棋子位置
chessPieces=[]
# 棋盘
chessboard=[[]]
# 初始化棋盘
def __init__(row, col):
global chessPieces, chessboard
chessPieces=[]
chessboard=[['-' for x in range(col)] for y in range(row)]
# 显示棋盘
def __show__(chessboard):
print(Back.RED+'五子棋小游戏'.center(len(chessboard)*3,'-'))
for i in range(len(chessboard)+1):
print(Back.GREEN+str(i).zfill(2)+' ',end='')
for row in range(len(chessboard)):
print('\n'+Back.GREEN+str(row+1).zfill(2)+' ',end='')
for col in chessboard[row]:
print(Back.GREEN+col+' ',end='')
print('\n')
#玩家落子
def addPiece(site,chessboard,symbol,chessPieces):
#去掉首尾空格
site=site.strip()
siteList=site.split(' ')
if len(siteList)!=2:
print('请输入正确的行和列,并用空格隔开')
return False
# 判断输入的位置是否为纯数字
if siteList[0].isnumeric() and siteList[1].isnumeric():
row=int(siteList[0])
col=int(siteList[1])
else:
print('输入的位置非数字,请重新输入')
return False
# 判断位置是否合法
if row>0 and row< len(chessboard)+1 and col>0 and col<len(chessboard[0])+1:
# 判断位置是否重复
if str(row)+' '+str(col) in chessPieces:
print('落子位置已有棋子,请重新输入落子位置')
return False
else:
chessPieces.append(str(row)+' '+str(col))
chessboard[row-1][col-1]=symbol
return True
else:
print('落子位置超出棋盘范围,请重新输入落子位置')
return False
# 判断棋盘是否有相同的5个棋子连成一线
def has_five_in_a_row(chessboard, symbol):
rows = len(chessboard)
cols = len(chessboard[0])
#判断位置是否合法
def is_valid(x, y):
return 0 <= x < rows and 0 <= y < cols
# 判断是否有五个子相连
def check_direction(x, y, dx, dy):
if is_valid(x + 4 * dx, y + 4 * dy) and chessboard[x][y] == symbol and chessboard[x + dx][y + dy] == symbol and chessboard[x + 2 * dx][y + 2 * dy] == symbol and chessboard[x + 3 * dx][y + 3 * dy] == symbol and chessboard[x + 4 * dx][y + 4 * dy] == symbol:
return True
return False
for i in range(rows):
for j in range(cols):
if (check_direction(i, j, 1, 0) or check_direction(i, j, 0, 1) or
check_direction(i, j, 1, 1) or check_direction(i, j, 1, -1) or
check_direction(i, j, -1, 1) or check_direction(i, j, -1, -1)):
return True
return False
# 重新开始
def reStart(site):
# 去掉首尾空格
site = site.strip()
if site == 'r':
flag = input('是否重新开始游戏?y/n:')
if flag.strip() == 'y':
return True
else:
return False
# 悔棋
def banck(site):
# 去掉首尾空格
site = site.strip()
if site == 'b':
flag = input('是否悔棋?y/n:')
if flag.strip() == 'y':
return True
else:
return False
#游戏入口
def main():
global chessPieces,chessboard
__init__(15,15)
players = ['X','O']
current_player = 0
while True:
__show__(chessboard)
site = input(f'玩家{current_player+1}请落子(用空格隔开行与列)(输入r:重新开始,b:悔棋):')
if reStart(site):
__init__(15,15)
print('游戏已重新开始')
current_player = 0
elif banck(site):
if len(chessPieces) == 0:
print('还未落子,请落子后再悔棋')
else:
# 找出上一个棋子的位置,删除棋盘对应位置,删除棋子位置记录
siteList=chessPieces[len(chessPieces) - 1].split(' ')
row = int(siteList[0])
col = int(siteList[1])
chessPieces.pop()
chessboard[row-1][col-1] = '-'
current_player = (current_player + 1) % 2
else:
if addPiece(site,chessboard,players[current_player],chessPieces):
#判断是否胜利
if has_five_in_a_row(chessboard,players[current_player]):
__show__(chessboard)
print(f'玩家{current_player+1}获胜!')
return
current_player = (current_player + 1) % 2
if __name__ == '__main__':
main()