zoukankan      html  css  js  c++  java
  • Tic-Tac-Toe游戏

      1 #Tic-Tac-Toe
      2 #机器人和人类下井字棋
      3 
      4 #全局变量
      5 import random
      6 X = "X"
      7 O = "O"
      8 EMPTY = " "      #表示棋盘上的空空格
      9 TIE = "TIE"      #表示平局
     10 NUM_SQUARES = 9  #井字棋棋盘上的方格数
     11 
     12 #显示游戏说明
     13 def display_instruct():
     14     """Display game instrcutin."""
     15     print(
     16         """Welcome to the gratest intellectual challenge of all time:Tic-Tac-Toe.
     17         This will be a showdown between your human brain and my silicon proessor.
     18         you will make your move known by entering a nmber,0 - 8. The number will
     19         correspond to the board position as illustrated:
     20          0 | 1 | 2
     21          ---------
     22          3 | 4 | 5
     23          ---------
     24          6 | 7 | 8
     25         Prepare yourself,human .The ultimate battle is about aobegin.
    """
     26     )
     27 
     28 #询问一个“是或否”的问题。接受一个问题,返回y或n
     29 def ask_yes_no(quesion):
     30     response = None
     31     while response not in ("y","n"):
     32         response = input(quesion.lower())
     33     return response
     34 
     35 #求情指定范围内的一个数字
     36 def ask_number(question,low,high):
     37     response = None
     38     while response not in range(low,high):
     39         response = int(input(question))
     40     return response
     41 
     42 #询问玩家是否希望先行棋
     43 def pieces():
     44     go_first = ask_yes_no("Do you require the first move ? (y/n):")
     45     if go_first =="y":
     46         print "
    Then take the first move.You wil need it."
     47         human = X
     48         computer = O
     49     else:
     50         print "
    Your bravery will be your undoing... I will go first.."
     51         human = O
     52         computer = X
     53     return computer, human
     54 
     55 #创建新的q棋盘
     56 def new_board():
     57     board = []
     58     for square in range(NUM_SQUARES):
     59         board.append(EMPTY)
     60     return board
     61 
     62 #显示棋盘
     63 def display_board(board):
     64     print "
    	",board[0],"|",board[1],"|",board[2]
     65     print "	","--------"
     66     print "
    	",board[3],"|",board[4],"|",board[5]
     67     print "	","--------"
     68     print "
    	",board[6],"|",board[7],"|",board[8]
     69 
     70 #接受一个棋盘,返回一个合法的行棋步骤
     71 def legal_moves(board):
     72     moves = []
     73     for square in range(NUM_SQUARES):
     74         if board[square] == EMPTY:
     75             moves.append(square)
     76     return moves
     77 
     78 #判断输赢
     79 def winner(board):
     80     WAYS_TO_WIN = ((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))
     81     winner = ""
     82     for row in WAYS_TO_WIN:
     83         if board[row[0]] == board[row[1]] == board[row[2]]!=EMPTY:
     84             winner = board[row[0]]
     85             return winner
     86     if winner=="":
     87         if EMPTY not in board:
     88              return TIE
     89         else:
     90             return None
     91 
     92 #用户行棋
     93 def human_move(board,human):
     94     legal = legal_moves(board)
     95     move = None
     96     while move not in legal:
     97         move = ask_number("Where you will move ?(0-8):",0,NUM_SQUARES)
     98         if move not in legal:
     99             print ("
    That square is already occupied,foolish human.Choose another.
    ")
    100     print "Fine..."
    101     return move
    102 
    103 #机器人行棋
    104 def computer_move(board,computer,human):
    105     board = board[:]
    106     BEST_MOVES =(4,0,2,6,8,1,3,5,7)
    107 
    108     #如果机器人能赢,就走那个位置
    109     for move in legal_moves(board):
    110         board[move] = computer
    111         if winner(board) == computer:
    112              print move
    113              return move
    114         #技术当前行棋方案的测试,并取消之
    115         board[move] =EMPTY
    116     #如果玩家能赢,就堵住那个位置
    117     for move in legal_moves(board):
    118         board[move] = human
    119         if winner(board) == human:
    120              print move
    121              return move
    122         #技术当前行棋方案的测试,并取消之
    123         board[move] =EMPTY
    124 
    125     #由于本轮谁也赢不了,所以叫挑选最佳的空位来走
    126     for move in BEST_MOVES:
    127         if move in legal_moves(board):
    128             print move
    129             return  move
    130 
    131 #返回下一个行棋方
    132 def next_turn(turn):
    133     if turn == X:
    134         return O
    135     else:
    136         return X
    137 
    138 #接受游戏的赢家
    139 def congract_winner(the_winner,computer,humna):
    140     if the_winner !=TIE:
    141         print the_winner,"won"
    142     else:
    143         print "tie!"
    144 
    145     if the_winner==computer:
    146         print "computer win"
    147     elif the_winner ==humna:
    148         print "human win!"
    149     elif the_winner==TIE:
    150         print "tie"
    151 
    152 #
    153 def main():
    154     display_instruct()
    155     computer,human = pieces()
    156     turn = X
    157     board = new_board()
    158     display_board(board)
    159 
    160     while not winner(board):
    161         if turn == human:
    162             move = human_move(board,human)
    163             board[move] = human
    164         else:
    165             move = computer_move(board,computer,human)
    166             board[move] = computer
    167         display_board(board)
    168         turn = next_turn(turn)
    169     the_winner = winner(board)
    170     congract_winner(the_winner,computer,human)
    171 
    172 main()

    执行过程:

    Python 2.7.6 (default, Nov 10 2013, 19:24:24) [MSC v.1500 64 bit (AMD64)] on win32
    Type "copyright", "credits" or "license()" for more information.
    >>> ================================ RESTART ================================
    >>> 
    Welcome to the gratest intellectual challenge of all time:Tic-Tac-Toe.
            This will be a showdown between your human brain and my silicon proessor.
            you will make your move known by entering a nmber,0 - 8. The number will
            correspond to the board position as illustrated:
             0 | 1 | 2
             ---------
             3 | 4 | 5
             ---------
             6 | 7 | 8
            Prepare yourself,human .The ultimate battle is about aobegin.
    
    do you require the first move ? (y/n):"y"
    
    Then take the first move.You wil need it.
    
          |   |  
        --------
    
          |   |  
        --------
    
          |   |  
    Where you will move ?(0-8):4
    Fine...
    
          |   |  
        --------
    
          | X |  
        --------
    
          |   |  
    0
    
        O |   |  
        --------
    
          | X |  
        --------
    
          |   |  
    Where you will move ?(0-8):2
    Fine...
    
        O |   | X
        --------
    
          | X |  
        --------
    
          |   |  
    6
    
        O |   | X
        --------
    
          | X |  
        --------
    
        O |   |  
    Where you will move ?(0-8):3
    Fine...
    
        O |   | X
        --------
    
        X | X |  
        --------
    
        O |   |  
    5
    
        O |   | X
        --------
    
        X | X | O
        --------
    
        O |   |  
    Where you will move ?(0-8):1
    Fine...
    
        O | X | X
        --------
    
        X | X | O
        --------
    
        O |   |  
    7
    
        O | X | X
        --------
    
        X | X | O
        --------
    
        O | O |  
    Where you will move ?(0-8):8
    Fine...
    
        O | X | X
        --------
    
        X | X | O
        --------
    
        O | O | X
    tie!
    tie
    >>> 

     

  • 相关阅读:
    .vue 文件中怎么引用全局的sass 样式
    git 本地仓库同时推送到多个远程仓库
    markdown文件生成html页面
    查看IPA安装包文件信息工具
    如何给iOS安装包IPA注入一个动态库文件?
    一年级语文上册读拼音写汉字,聪明的家长已收藏,偷偷给孩子练习
    关于直接下载第三方IPA应用分发平台之蒲公英的研究
    如何给iOS安装包IPA添加时间锁功能?
    关于几种获取iOS设备UDID典型方式的技术探讨
    针对五款IPA文件安装工具的深度评测
  • 原文地址:https://www.cnblogs.com/minmsy/p/5048990.html
Copyright © 2011-2022 走看看