使用python实现简单的控制台五子棋

运行截图

函数准备
  • 棋盘初始化函数
    将棋盘二维数组与棋子数组初始化(设置初始值)
  • 显示棋盘函数
    将棋盘按照某一形状输出在控制台
  • 角色下棋函数
    将角色落子的坐标反应在棋盘二维数组中
  • 判断胜利函数
    判断是否有五个相同的子连成一线
  • 悔棋函数
    撤回刚才下的子
  • 重新开始函数
    重新开始游戏
游戏逻辑
由两位玩家分别进行落子,直到一方有五颗子连成一线游戏结束。在游戏进行中,玩家可以通过输入r/b来重新游戏/悔棋。
主函数具体流程
  1. 初始化棋盘
  2. 显示棋盘
  3. 由一位玩家输入落子位置或者选择重新游戏或悔棋
  4. 判断玩家输入的是位置/r/b
  5. 位置则判断位置是否合法,即是否超出棋盘范围、是否已有棋子在该位置。合法插入棋盘,并保存落子位置。若非法,则回到让玩家输入落子位置。
  6. r则询问玩家是否重新开始(y/n),玩家确定,则重新开始游戏。玩家取消,则回到让玩家输入落子位置。
  7. b则询问玩家是否悔棋(y/n),玩家确定,则撤销上一个棋子的位置,在棋盘中消除该棋子,回到上一位玩家输入落子位置。玩家取消,则回到让当前玩家输入落子位置。
  8. 玩家输入完合法落子位置后,判断是否有五个相同棋子连成一线,有则输出棋盘并显示胜利玩家的名称,无则输出棋盘,更换另一玩家输入落子位置。
完整代码
#改变背景色库文件
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()

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值