1. 程式人生 > 程式設計 >python實現簡單井字棋小遊戲

python實現簡單井字棋小遊戲

用python實現的一個井字棋遊戲,供大家參考,具體內容如下

#Tic-Tac-Toe 井字棋遊戲
#全域性常量
X="X"
O="O"
EMPTY=" "
#詢問是否繼續
def ask_yes_no(question):
  response=None;
  while response not in("y","n"):
    response=input(question).lower()
  return response
#輸入位置數字
def ask_number(question,low,high):
  response=None
  while response not in range(low,high):
    response=int(input(question))
  return response
#詢問誰先走,先走方為X,後走方為O
#函式返回計算機方,玩家的角色代號
def pieces():
  go_first=ask_yes_no("玩家你是否先走(y/n):")
  if go_first=="y":
    print("\n玩家你先走.")
    human=X
    computer=O
  else:
    print("\n計算機先走.")
    computer=X
    human=O
  return computer,human
#產生新的棋盤
def new_board():
  board=[]
  for square in range(9):
    board.append(EMPTY)
  return board
#顯示棋盤
def display_board(board):
  board2=board[:]
  for i in range(len(board)):
    if board[i]==EMPTY:
      board2[i]=i
  print("\t",board2[0],"|",board2[1],board2[2])
  print("\t","----------")
  print("\t",board2[3],board2[4],board2[5])
  print("\t",board2[6],board2[7],board2[8],"\n")
  #產生可以合法走棋位置序列(也就是還未下過子位置)
def legal_moves(board):
  moves=[]
  for square in range(9):
    if board[square]==EMPTY:
      moves.append(square)
  return moves
  #判斷輸贏
def winner(board):
    # 所有贏得可能情況,例如(0,1,2)就是第一行,(0,4,8,),(2,6)就是對角線
  WAYS_TO_WIN=((0,2,),(3,5),(6,7,8),(0,3,6),(1,7),(2,5,6))
  for row in WAYS_TO_WIN:
    if board[row[0]]==board[row[1]]==board[row[2]]!=EMPTY:
      winner=board[row[0]]
      return winner
      #棋盤沒有空位置
  if EMPTY not in board:
    return "TIE"
  return False
    #人走棋
def human_move (board,human):
  legal =legal_moves(board)
  move =None
  while move not in legal:
    move=ask_number("你走那個位置?(0-8):",9)
    if move not in legal:
      print("\n此位置已經落過子了")
          #print("Fine...")
  return move
    #計算機走棋
def computer_move(board,computer,human):
  board=board[:]
      #按優劣順序排序的下棋走子
  BEST_MOVES=(4,6,7) #最佳下棋位置順序表
      #如果計算機能贏,就走那個位置
  for move in legal_moves(board):
      board[move]=computer
      if winner(board)==computer:
        print("計算機下棋位置...",move)
        return move
        #取消走棋方案
      board[move]=EMPTY
      #如果玩家能贏就堵住那個位置
  for move in legal_moves(board):
      board[move]=human
      if winner(board)==human:
        print("計算機下棋位置...",move)
        return move
        #取消走棋方案
      board[move]=EMPTY
      #如果不是上面情況,也就是這一輪贏不了
      #則是從最佳下棋位置表中挑出第一個合法位置
  for move in BEST_MOVES:
    if move in legal_moves(board):
      print("計算機下棋位置....",move)
      return move
    #轉換角色
def next_turn(turn):
  if turn ==X:
     return O
  else:
    return X
    #主函式
def main():
    computer,human=pieces()
    turn =X
    board=new_board()
    display_board(board)
    while not winner(board):
      if turn ==human:
        move=human_move(board,human)
        board[move]=human
      else:
        move=computer_move(board,human)
        board[move]=computer
      display_board(board)
      turn=next_turn(turn)  #轉換角色
          #遊戲結束輸出輸贏或和棋資訊
    the_winner=winner(board)
    if the_winner==computer:
      print("計算機贏!\n")
    elif the_winner==human:
      print("玩家贏!\n")
    elif the_winner=="TIE":
      print("平局,遊戲結束\n")

main()
input("按任意鍵退出遊戲")

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。