目录
  • 一、基本流程
  • 二、基本步骤
    • 1、菜单界面
    • 2、初始化棋盘、打印棋盘
    • 3、玩家落子
    • 4、电脑落子
    • 5、输赢判定
  • 三、整体代码
    • 四、结果展示

      三子棋的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] = ' '
          pass
      
      def 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

      python实现三子棋游戏

      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 random
      MAX_ROW = 3
      MAX_COL = 3
      #array = ['0','0','0']
      chess_board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] #[array] * 3
      
      def init_cheaa_board(chess_board):
          for i in range(MAX_ROW):
              for j in range(MAX_COL):
                  chess_board[i][j] = ' '
          pass
      
      def 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
      
      
      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:
                  chess_board[x][y] = 'U'
                  print_chess_board(chess_board)
                  #return x,y
                  break
                  pass
          pass
      
      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 ' '
      
      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'
                  break
      
      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
      
      def 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
          pass
      
      
      if __name__ == "__main__":
      
          menu()
          pass

      四、结果展示

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

      python实现三子棋游戏

      python实现三子棋游戏

      python实现三子棋游戏

      以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。