专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

python怎么实现三子棋游戏

来源:小易整编  作者:小易  发布时间:2024-03-21 07:46
摘要:一、基本流程三子棋游戏实现逻辑如下:1、创建初始化33棋盘;2、玩家执U子,先进行落子;3、胜负判定【胜、负、和棋】,若胜负未分,则继续如下4、电脑执T子,进行落子;5、胜负判定,若胜负未分,则从步骤2继续执行二、基本步骤1、菜单界面选择...
一、基本流程

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

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怎么实现三子棋游戏的详细内容,更多请关注易企推科技其它相关文章!


本文地址:网络知识频道 https://www.hkm168.com/jiqiao/1151792.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


网络知识
小编:小易整编
相关文章相关阅读
  • 用U盘轻松实现一键重装系统的小白装机教程

    用U盘轻松实现一键重装系统的小白装机教程

    在现代社会,电脑已经成为人们生活中不可或缺的工具。然而,由于各种原因,我们有时候需要重装电脑系统来解决一些问题或提升性能。但是,对于一些小白用户来说,重装系统可能是一项困难的任务。因此,本文将介绍一款小白一键重装系统的u盘装机教程,帮助小白...

  • ppt中怎么插入自定义动作按钮

    ppt中怎么插入自定义动作按钮

    ppt插入自定义动作按钮: 打开幻灯片文件,然后在菜单栏中点击插入,打开插入工具栏,之后在插入工具栏中选择形状工具,如下图所示:点击形状工具后,就打开所有预置的形状列表,如下图所示,选择我们需要的形状。选择好形状后,自动退回到ppt文件编辑...

  • 主板显卡卡扣断了怎么办

    主板显卡卡扣断了怎么办

    主板显卡卡扣断了可以尝试使用胶带或胶水将其固定、更换显卡插槽、更换主板或者寻求专业人员的帮助。详细介绍:1、使用胶带或胶水将其固定,使用胶带或胶水时要小心,以免粘到其他部件上;2、更换显卡插槽,建议找专业的电脑维修人员来进行操作;3、更换主...

  • abc类ip地址怎么区分

    abc类ip地址怎么区分

    区分方法:1、a类ip地址,第一段号码为网络号码,剩下的三段号码为本地计算机的号码;2、b类ip地址,前两段号码为网络号码;3、c类ip地址,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。本教程操作环境:windows7系统、De...

  • jsp文件怎么创建

    jsp文件怎么创建

    创建jsp文件的步骤:1、安装和配置java开发环境;2、安装和配置web服务器;3、创建jsp文件;4、编写jsp代码;5、部署和运行应用程序;6、调试和测试。详细介绍:1、安装和配置java开发环境,首先需要在计算机上安装jdk,可以从...

  • win7升级错误代码80072efe该怎么办win7升级错误代码80072efe解决...

    win7升级错误代码80072efe该怎么办win7升级错误代码80072efe解决方案

    win7客户在系统更新的过程中遇到了80072efe的报错,像这种状况要怎么办呢?你先清查网络问题,然后去微软官网下载代理,假如你用的是32位计算机就免费下载32位代理,安装下载完成后马上重启。假如再次出现升级不正确得话,你也就再去官方网站...

  • git怎么合并分支代码

    git怎么合并分支代码

    git合并分支代码的方法:1、使用“gitmerge”命令,该命令用来做分支合并,可以将其他分支中的内容合并到当前分支中。2、使用“gitrebase”命令,该命令用于改变当前的分支的基点,进而实现分支合并。本教程操作环境:Window...

  • PHP调用美联软通短信接口实现短信发送

    PHP调用美联软通短信接口实现短信发送

    随着人们生活水平的提高和科技的发展,短信已成为人们交流的主要方式之一,越来越多的企业开始通过短信平台来实现营销、提醒等功能。在这个过程中,短信接口的选择显得尤为重要。本文将介绍如何通过php调用美联软通短信接口实现短信发送。一、美联软通短信...

  • 周排行
  • 月排行
  • 年排行

精彩推荐