千家信息网

python怎么实现三子棋游戏

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,今天小编给大家分享一下python怎么实现三子棋游戏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起
千家信息网最后更新 2025年11月08日python怎么实现三子棋游戏

今天小编给大家分享一下python怎么实现三子棋游戏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、基本流程

三子棋游戏实现逻辑如下:

1、创建初始化3*3棋盘;
2、玩家执U子,先进行落子;
3、胜负判定【胜、负、和棋】,若胜负未分,则继续如下
4、电脑执T子,进行落子;
5、胜负判定,若胜负未分,则从步骤2继续执行

二、基本步骤

1、菜单界面

选择1是开始游戏,选择2是退出游戏

def menu():    print('-'*20)    print('1---------------begin')    print('2---------------exit')    print('please select begin or exit')    print('-' * 20)    while(1):        select = input('please input:')        if select == '1':            begin_games()            pass        elif select == '2':            print('exit the game')            break            #pass    pass

2、初始化棋盘、打印棋盘

三子棋棋盘是3*3的方阵,在python中用列表来进行存储。

chess_board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

那么如何将这个存储列表打印出来,成为棋盘呢?

def init_cheaa_board(chess_board): #先对列表进行初始化    for i in range(MAX_ROW):        for j in range(MAX_COL):            chess_board[i][j] = ' '    passdef print_chess_board(chess_board): #棋盘打印    print('*'+'-'*7+'*'+'-'*7+'*'+'-'*7+'*')    for i in range(MAX_ROW):        print('|'+' '*3+chess_board[i][0]+' '*3+'|'+' '*3+chess_board[i][1]+' '*3+'|'+' '*3+chess_board[i][2]+' '*3+'|')        print('*' + '-' * 7 + '*' + '-' * 7 + '*' + '-' * 7 + '*')        pass    pass

3、玩家落子

玩家在3*3的棋盘中选择落子的横纵坐标。坐标点需要满足:1、该点在棋盘内;2、该点还未置子。

def player_first(chess_board):    while(1):        x = int(input('please input x:'))        y = int(input('please input y:'))        if(chess_board[x][y] != ' '): #若已被置子,则重新选择坐标            print('This position is already occupied!')            pass        elif(x >= MAX_ROW or y >= MAX_COL or x < 0 or y < 0): #所选坐标超出棋盘范围,重新选择坐标            print('This position is beyond the chessboard!')            pass        else: #若坐标可以落子,则将该坐标置为玩家的棋子U            chess_board[x][y] = 'U'            print_chess_board(chess_board)            #return x,y            break            pass    pass

4、电脑落子

电脑落子算法:

4.1、先检查一下棋盘,看电脑已占有棋面中是否已经有两子连成、即将成棋的状态。若已有,则获取可以促成胜利的坐标点,进行落子T;

4.2、若4.1不满足,则再去检查一下棋盘,看玩家已占有棋面中是否已经有两子连成、即将成棋的状态。若已有,则获取玩家即将胜利的坐标点,落子T进行拦截;

4.3、若4.1、4.2均不满足,则在棋面中选择电脑端有利的点进行落子;

A、先判断中心位置[1][1]处是否被占领,若未被占领,则这是最有利点。当占领[1][1]点时,则阻断了玩家的横、纵、正对角线、副对角线四条线路;
B、次有利点则是3*3棋盘的四个角,每占领一个角,则会阻断玩家的三条线路;
C、最后有利的点则是每条边的中心位置,会阻断玩家的两条线路;

def Intercept_player(chess_board,key):    count2 = 0    index2 = []    intercept_index = {'x':-1,'y':-1}    for i in range(MAX_ROW):        index = []        count = 0        count1 = 0        index1 = []        allindex = [0,1,2]        for j in range(MAX_ROW):            if(chess_board[i][j] == key): #每一行的玩家落子情况                count += 1                index.append(j)            if(chess_board[j][i] == key): #每一列的玩家落子情况                #print('j'+str(j)+',i'+str(i)+'='+chess_board[j][i])                count1 += 1                index1.append(j)            if (i == j and chess_board[j][i] == key):  # 在主对角线中的玩家落子情况                count2 += 1                index2.append(j)        if(count == 2):    #在每一行中  获取具体的可以拦截的位置坐标  需要排除掉已经填充的位置            result = list(set(allindex).difference(set(index)))            result = result[0]            if(chess_board[i][result] == ' '): #当这个位置可以进行拦截时,进行坐标返回                #return i,result                intercept_index['x'] = i                intercept_index['y'] = result                return intercept_index        #print(count1,'------->',index1)        if (count1 == 2):  # 在每一列中 获取具体的可以拦截的位置坐标  需要排除掉已经填充的位置            result = list(set(allindex).difference(set(index1)))            result = result[0]            #print('count1==2,result:',result)            if (chess_board[result][i] == ' '):  # 当这个位置可以进行拦截时,进行坐标返回                intercept_index['x'] = result                intercept_index['y'] = i                return intercept_index                #return i, result        if (count2 == 2):  # 在主对角线上 获取具体的可以拦截的位置坐标  需要排除掉已经填充的位置            result = list(set(allindex).difference(set(index2)))            result = result[0]            if (chess_board[i][result] == ' '):  # 当这个位置可以进行拦截时,进行坐标返回                intercept_index['x'] = i                intercept_index['y'] = result                return intercept_index                #return i, result    count3 = 0    if(chess_board[0][2] == key):        count3 += 1    if (chess_board[1][1] == key):        count3 += 1    if (chess_board[2][0] == key):        count3 += 1    if(count3 == 2):        if(chess_board[0][2] == ' '):            intercept_index['x'] = 0            intercept_index['y'] = 2        elif (chess_board[1][1] == ' '):            intercept_index['x'] = 1            intercept_index['y'] = 1        elif (chess_board[2][0] == ' '):            intercept_index['x'] = 2            intercept_index['y'] = 0    return intercept_index    def computer_second(chess_board):  #电脑智能出棋    #1、先检查一下电脑是否两子成棋  若已有,则获取空位置坐标 自己先成棋    intercept_index = Intercept_player(chess_board, 'T')    if (intercept_index['x'] == -1 and intercept_index['y'] == -1):        pass    else:  # 电脑可落子        x = intercept_index['x']        y = intercept_index['y']        chess_board[x][y] = 'T'        return    #2、若玩家快成棋   则先进行拦截    intercept_index = Intercept_player(chess_board,'U')   #若玩家已经两子成棋  则获取空位置的坐标    #print('intercept_index---:')    #print(intercept_index)    if(intercept_index['x'] == -1 and intercept_index['y'] == -1):        pass    else:  #电脑可落子        x = intercept_index['x']        y = intercept_index['y']        chess_board[x][y] = 'T'        return    #3、如果没有,则电脑端排棋  以促进成棋    #3.1、 占领中心位置  如若中心位置[1,1]未被占领    if(chess_board[1][1] == ' '):        chess_board[1][1] = 'T'        return    #3.2、 占领四角位置  若[0,0]  [0,2]  [2,0]  [2,2]未被占领    if (chess_board[0][0] == ' '):        chess_board[0][0] = 'T'        return    if (chess_board[0][2] == ' '):        chess_board[0][2] = 'T'        return    if (chess_board[2][0] == ' '):        chess_board[2][0] = 'T'        return    if (chess_board[2][2] == ' '):        chess_board[2][2] = 'T'        return    # 3.3、 占领每一边中心位置  若[0,1]  [1,0]  [1,2]  [2,1]未被占领    if (chess_board[0][1] == ' '):        chess_board[0][1] = 'T'        return    if (chess_board[1][0] == ' '):        chess_board[1][0] = 'T'        return    if (chess_board[1][2] == ' '):        chess_board[1][2] = 'T'        return    if (chess_board[2][1] == ' '):        chess_board[2][1] = 'T'        return

5、输赢判定

最终的结果:输、赢、和棋D
判定流程:判断每个横线、纵线、对角线上是否有玩家U或电脑T连成三子的,若有则是该方胜出;当整个棋面都被占满,但玩家和电脑都未成棋时,则说明和棋。

def chess_board_isfull(chess_board):   #判断棋盘是否填充满    for i in range(MAX_ROW):        if (' ' in chess_board[i]):            return 0    return 1    pass    def Win_or_lose(chess_board):    isfull = chess_board_isfull(chess_board)    for i in range(MAX_ROW):  #每一列的判断        if( chess_board[0][i] == chess_board[1][i] == chess_board[2][i]):            return chess_board[0][i]            pass        pass    for i in range(MAX_ROW):  # 每一行的判断        if( chess_board[i][0] == chess_board[i][1] == chess_board[i][2]):            return chess_board[i][0]            pass        pass    if (chess_board[0][0] == chess_board[1][1] == chess_board[2][2]):  # 判断棋盘正对角线        return chess_board[0][0]    if (chess_board[0][2] == chess_board[1][1] == chess_board[2][0]):  # 判断棋盘反对角线        return chess_board[0][2]    if isfull:        return 'D'  # 经过以上的判断,都不满足(既没赢也没输),但是棋盘也已经填充满,则说明和棋    else:        return ' '

三、整体代码

# coding=utf-8import randomMAX_ROW = 3MAX_COL = 3#array = ['0','0','0']chess_board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] #[array] * 3def init_cheaa_board(chess_board):    for i in range(MAX_ROW):        for j in range(MAX_COL):            chess_board[i][j] = ' '    passdef print_chess_board(chess_board):    print('*'+'-'*7+'*'+'-'*7+'*'+'-'*7+'*')    for i in range(MAX_ROW):        print('|'+' '*3+chess_board[i][0]+' '*3+'|'+' '*3+chess_board[i][1]+' '*3+'|'+' '*3+chess_board[i][2]+' '*3+'|')        print('*' + '-' * 7 + '*' + '-' * 7 + '*' + '-' * 7 + '*')        pass    passdef player_first(chess_board):    while(1):        x = int(input('please input x:'))        y = int(input('please input y:'))        if(chess_board[x][y] != ' '):            print('This position is already occupied!')            pass        elif(x >= MAX_ROW or y >= MAX_COL or x < 0 or y < 0):            print('This position is beyond the chessboard!')            pass        else:            chess_board[x][y] = 'U'            print_chess_board(chess_board)            #return x,y            break            pass    passdef chess_board_isfull(chess_board):   #判断棋盘是否填充满    for i in range(MAX_ROW):        if (' ' in chess_board[i]):            return 0    return 1    passdef Win_or_lose(chess_board):    isfull = chess_board_isfull(chess_board)    for i in range(MAX_ROW):  #每一列的判断        if( chess_board[0][i] == chess_board[1][i] == chess_board[2][i]):            return chess_board[0][i]            pass        pass    for i in range(MAX_ROW):  # 每一行的判断        if( chess_board[i][0] == chess_board[i][1] == chess_board[i][2]):            return chess_board[i][0]            pass        pass    if (chess_board[0][0] == chess_board[1][1] == chess_board[2][2]):  # 判断棋盘正对角线        return chess_board[0][0]    if (chess_board[0][2] == chess_board[1][1] == chess_board[2][0]):  # 判断棋盘反对角线        return chess_board[0][2]    if isfull:        return 'D'  # 经过以上的判断,都不满足(既没赢也没输),但是棋盘也已经填充满,则说明和棋    else:        return ' 'def computer_second_random(chess_board):    #电脑随机出棋    while(1):        x = random.randint(0,2)        y = random.randint(0,2)        if(chess_board[x][y] != ' '):            continue        else:            chess_board[x][y] = 'T'            breakdef Intercept_player(chess_board,key):    count2 = 0    index2 = []    intercept_index = {'x':-1,'y':-1}    for i in range(MAX_ROW):        index = []        count = 0        count1 = 0        index1 = []        allindex = [0,1,2]        for j in range(MAX_ROW):            if(chess_board[i][j] == key): #每一行的玩家落子情况                count += 1                index.append(j)            if(chess_board[j][i] == key): #每一列的玩家落子情况                #print('j'+str(j)+',i'+str(i)+'='+chess_board[j][i])                count1 += 1                index1.append(j)            if (i == j and chess_board[j][i] == key):  # 在主对角线中的玩家落子情况                count2 += 1                index2.append(j)        if(count == 2):    #在每一行中  获取具体的可以拦截的位置坐标  需要排除掉已经填充的位置            result = list(set(allindex).difference(set(index)))            result = result[0]            if(chess_board[i][result] == ' '): #当这个位置可以进行拦截时,进行坐标返回                #return i,result                intercept_index['x'] = i                intercept_index['y'] = result                return intercept_index        #print(count1,'------->',index1)        if (count1 == 2):  # 在每一列中 获取具体的可以拦截的位置坐标  需要排除掉已经填充的位置            result = list(set(allindex).difference(set(index1)))            result = result[0]            #print('count1==2,result:',result)            if (chess_board[result][i] == ' '):  # 当这个位置可以进行拦截时,进行坐标返回                intercept_index['x'] = result                intercept_index['y'] = i                return intercept_index                #return i, result        if (count2 == 2):  # 在主对角线上 获取具体的可以拦截的位置坐标  需要排除掉已经填充的位置            result = list(set(allindex).difference(set(index2)))            result = result[0]            if (chess_board[i][result] == ' '):  # 当这个位置可以进行拦截时,进行坐标返回                intercept_index['x'] = i                intercept_index['y'] = result                return intercept_index                #return i, result    count3 = 0    if(chess_board[0][2] == key):        count3 += 1    if (chess_board[1][1] == key):        count3 += 1    if (chess_board[2][0] == key):        count3 += 1    if(count3 == 2):        if(chess_board[0][2] == ' '):            intercept_index['x'] = 0            intercept_index['y'] = 2        elif (chess_board[1][1] == ' '):            intercept_index['x'] = 1            intercept_index['y'] = 1        elif (chess_board[2][0] == ' '):            intercept_index['x'] = 2            intercept_index['y'] = 0    return intercept_indexdef computer_second(chess_board):  #电脑智能出棋    #1、先检查一下电脑是否两子成棋  若已有,则获取空位置坐标 自己先成棋    intercept_index = Intercept_player(chess_board, 'T')    if (intercept_index['x'] == -1 and intercept_index['y'] == -1):        pass    else:  # 电脑可落子        x = intercept_index['x']        y = intercept_index['y']        chess_board[x][y] = 'T'        return    #2、若玩家快成棋   则先进行拦截    intercept_index = Intercept_player(chess_board,'U')   #若玩家已经两子成棋  则获取空位置的坐标    #print('intercept_index---:')    #print(intercept_index)    if(intercept_index['x'] == -1 and intercept_index['y'] == -1):        pass    else:  #电脑可落子        x = intercept_index['x']        y = intercept_index['y']        chess_board[x][y] = 'T'        return    #3、如果没有,则电脑端排棋  以促进成棋    #3.1、 占领中心位置  如若中心位置[1,1]未被占领    if(chess_board[1][1] == ' '):        chess_board[1][1] = 'T'        return    #3.2、 占领四角位置  若[0,0]  [0,2]  [2,0]  [2,2]未被占领    if (chess_board[0][0] == ' '):        chess_board[0][0] = 'T'        return    if (chess_board[0][2] == ' '):        chess_board[0][2] = 'T'        return    if (chess_board[2][0] == ' '):        chess_board[2][0] = 'T'        return    if (chess_board[2][2] == ' '):        chess_board[2][2] = 'T'        return    # 3.3、 占领每一边中心位置  若[0,1]  [1,0]  [1,2]  [2,1]未被占领    if (chess_board[0][1] == ' '):        chess_board[0][1] = 'T'        return    if (chess_board[1][0] == ' '):        chess_board[1][0] = 'T'        return    if (chess_board[1][2] == ' '):        chess_board[1][2] = 'T'        return    if (chess_board[2][1] == ' '):        chess_board[2][1] = 'T'        returndef begin_games():    global chess_board    init_cheaa_board(chess_board)    result = ' '    while(1):        print_chess_board(chess_board)        player_first(chess_board)        result = Win_or_lose(chess_board)        if(result != ' '):            break        else: #棋盘还没满,该电脑出棋            #computer_second_random(chess_board)            computer_second(chess_board)            result = Win_or_lose(chess_board)            if (result != ' '):                break    print_chess_board(chess_board)    if (result == 'U'):        print('Congratulations on your victory!')    elif (result == 'T'):        print('Unfortunately, you failed to beat the computer.')    elif (result == 'D'):        print('The two sides broke even.')def menu():    print('-'*20)    print('1---------------begin')    print('2---------------exit')    print('please select begin or exit')    print('-' * 20)    while(1):        select = input('please input:')        if select == '1':            begin_games()            pass        elif select == '2':            print('exit the game')            break            #pass    passif __name__ == "__main__":    menu()    pass

四、结果展示

4.1 在以下截图中,展示了电脑拦截、占据有利位置、并率先成棋的过程

以上就是"python怎么实现三子棋游戏"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

位置 坐标 电脑 玩家 棋盘 对角 对角线 选择 三子 有利 和棋 知识 空位 篇文章 胜负 检查 一行 情况 标点 线路 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库中的数据可以实时共享吗 怎样证明软件开发技术先进型 电子邮箱服务器选择什么 沧州医院网络安全保险 校园网络安全告家长书 网络安全专业考公务员有哪些岗位 数据库没有启动请查找原因 服务器超级管理员密码 广达服务器电源很难配 蜀山区推广网络技术开发费用 帕拉迪堡垒机如何复制服务器文件 贴纸软件开发 数据库字段等于其他字段之和 云桌面做软件开发的公司多吗 惠普服务器12v电源改装 我的世界单方块服务器攻略 举例说明事务对数据库的作用 如何保证APP网络安全 网络安全周领导发言稿全文 温州p2p软件开发 数据库对统计学有什么用 商铺网络安全 学习软件开发适合什么处理器 简单的管理系统软件开发 珠海电脑软件开发定做 网络安全创新作品如何做 gdb 数据库处理平台 诚信档案数据库授权委托书 高一网络安全作文80字 保定智联软件开发公司
0