• 井字棋游戏


    1 问题

    如何用python完成井字棋游戏。

    2 方法

    1. 打印棋盘;

    2. 让玩家选择棋子;

    3. 随机决定谁先走;

    4. 玩家选择落子位置;

    5. 判断输赢;

    6. 是否再来一次

    通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。

    代码清单 1

    import random
    def drawBoard(board):
       # "board"是长度为10的列表,为了方便输入,忽略第一个元素board[0]
       print('\n\n\n\n')
       print('\t\t\t┌─┬─┬─┐')
       print('\t\t\t│'+board[7]+' │'+board[8]+' │'+board[9]+' │')
       print('\t\t\t├─┼─┼─┤')
       print('\t\t\t│'+board[4]+' │'+board[5]+' │'+board[6]+' │')
       print('\t\t\t├─┼─┼─┤')
       print('\t\t\t│'+board[1]+' │'+board[2]+' │'+board[3]+' │')
       print('\t\t\t└─┴─┴─┘')
    def inputPlayerLetter():
       letter = ''
       while not (letter == 'X' or letter == 'O'):
           print('Do you want to be X or O?')
           letter = input().upper()
       if letter == 'X':
           return ['X', 'O']
       else:
           return ['O', 'X']
    def whoGoesFirst():
       if random.randint(0, 1) == 0:
           return 'computer'
       else:
           return 'player'
    def playAgain():
       print('Do you want to play again? (yes or no)')
       return input().lower().startswith('y')
    def makeMove(board, letter, move):
       board[move] = letter
    def isWinner(bo, le):
       return ((bo[7] == le and bo[8] == le and bo[9] == le) or
       (bo[4] == le and bo[5] == le and bo[6] == le) or
       (bo[1] == le and bo[2] == le and bo[3] == le) or
       (bo[7] == le and bo[4] == le and bo[1] == le) or
       (bo[8] == le and bo[5] == le and bo[2] == le) or
       (bo[9] == le and bo[6] == le and bo[3] == le) or
       (bo[7] == le and bo[5] == le and bo[3] == le) or
       (bo[9] == le and bo[5] == le and bo[1] == le))
    def getBoardCopy(board):
       dupeBoard = []
       for i in board:
           dupeBoard.append(i)
       return dupeBoard
    def isSpaceFree(board, move):
       return board[move] == ' '
    def getPlayerMove(board):
       move = ' '
       while move not in '1 2 3 4 5 6 7 8 9'.split() or not isSpaceFree(board, int(move)):
           print('What is your next move? (1-9)')
           move = input()
       return int(move)
    def chooseRandomMoveFromList(board, movesList):
       possibleMoves = []
       for i in movesList:
           if isSpaceFree(board, i):
               possibleMoves.append(i)
       if len(possibleMoves) != 0:
           return random.choice(possibleMoves)
       else:
           return None
    def getComputerMove(board, computerLetter):
       if computerLetter == 'X':
           playerLetter = 'O'
       else:
           playerLetter = 'X'
       for i in range(1, 10):
           copy = getBoardCopy(board)
           if isSpaceFree(copy, i):
               makeMove(copy, computerLetter, i)
               if isWinner(copy, computerLetter):
                   return i
       for i in range(1, 10):
           copy = getBoardCopy(board)
           if isSpaceFree(copy, i):
               makeMove(copy, playerLetter, i)
               if isWinner(copy, playerLetter):
                   return i
       move = chooseRandomMoveFromList(board, [1, 3, 7, 9])
       if move != None:
           return move
       if isSpaceFree(board, 5):
           return 5
       return chooseRandomMoveFromList(board, [2, 4, 6, 8])
    def isBoardFull(board):
       for i in range(1, 10):
           if isSpaceFree(board, i):
               return False
       return True
    print('Welcome to Tic Tac Toe!')
    while True:
       theBoard = [' '] * 10
       playerLetter, computerLetter = inputPlayerLetter()
       turn = whoGoesFirst()
       print('The ' + turn + ' will go first.')
       gameIsPlaying = True
       while gameIsPlaying:
           if turn == 'player':
               drawBoard(theBoard)
               move = getPlayerMove(theBoard)
               makeMove(theBoard, playerLetter, move)
       if isWinner(theBoard, playerLetter):
                   drawBoard(theBoard)
                   print('Hooray! You have won the game!')
                   gameIsPlaying = False
               else:
                   if isBoardFull(theBoard):
                       drawBoard(theBoard)
                       print('The game is a tie!')
                       break
                   else:
                       turn = 'computer'
           else:
               move = getComputerMove(theBoard, computerLetter)
               makeMove(theBoard, computerLetter, move)
               if isWinner(theBoard, computerLetter):
                   drawBoard(theBoard)
                   print('The computer has beaten you! You lose.')
                   gameIsPlaying = False
               else:
                   if isBoardFull(theBoard):
                       drawBoard(theBoard)
                       print('The game is a tie!')
                       break
                   else:
                       turn = 'player'
       if not playAgain():
           break

    3 结语

    针对如何使用python完成井字棋游戏的问题,提出该方法,通过本次实验,证明该方法是有效的,该程序设计的井字棋游戏具有一定的挑战性,无法满足所有阶段玩家的游戏需求。

  • 相关阅读:
    四十四、​Fluent 收敛标准-质量和能量守恒
    Sosyal Lig Arena VoxEdit 比赛
    WinForm实现倒计时锁定程序完整源码附注释
    【爬坑之路一】windows系统下更新升级node版本【亲测有效】
    Nodejs 第七十九章(Kafka进阶)
    pytest文档84 - 把收集的 yaml 文件转成pytest 模块和用例
    SQL自定义函数
    [Hello World] 二分查找笔记
    Python 的运算符和语句(条件、循环、异常)基本使用指南
    为什么 NGINX 的 reload 不是热加载?
  • 原文地址:https://blog.csdn.net/gschen_cn/article/details/133366542