📜  使用随机数的自动井字游戏的Python实现

📅  最后修改于: 2022-05-13 01:55:45.722000             🧑  作者: Mango

使用随机数的自动井字游戏的Python实现

井字游戏是一款非常流行的游戏,所以让我们使用Python实现一个自动井字游戏。

游戏由程序自动播放,因此无需用户输入。尽管如此,开发一款自动游戏还是很有趣的。让我们看看如何做到这一点。

numpyrandom Python库用于构建这个游戏。代码不是要求用户在板上做标记,而是随机选择板上的一个位置并做标记。除非玩家获胜,否则它将在每回合后显示棋盘。如果游戏平局,则返回-1。

解释 :
play_game()是主要函数,它执行以下任务:

  • 调用 create_board() 来创建一个 9×9 的棋盘并初始化为 0。
  • 对于每个玩家(1 或 2),调用 random_place()函数以随机选择船上的位置,并用玩家编号标记该位置。
  • 每次移动后打印板。
  • 每次移动后评估棋盘以检查行或列或对角线是否具有相同的玩家编号。如果是,则显示获胜者姓名。如果在 9 步之后没有获胜者,则显示 -1。

以下是上述游戏的代码:

# Tic-Tac-Toe Program using
# random number in Python
  
# importing all necessary libraries
import numpy as np
import random
from time import sleep
  
# Creates an empty board
def create_board():
    return(np.array([[0, 0, 0],
                     [0, 0, 0],
                     [0, 0, 0]]))
  
# Check for empty places on board
def possibilities(board):
    l = []
      
    for i in range(len(board)):
        for j in range(len(board)):
              
            if board[i][j] == 0:
                l.append((i, j))
    return(l)
  
# Select a random place for the player
def random_place(board, player):
    selection = possibilities(board)
    current_loc = random.choice(selection)
    board[current_loc] = player
    return(board)
  
# Checks whether the player has three 
# of their marks in a horizontal row
def row_win(board, player):
    for x in range(len(board)):
        win = True
          
        for y in range(len(board)):
            if board[x, y] != player:
                win = False
                continue
                  
        if win == True:
            return(win)
    return(win)
  
# Checks whether the player has three
# of their marks in a vertical row
def col_win(board, player):
    for x in range(len(board)):
        win = True
          
        for y in range(len(board)):
            if board[y][x] != player:
                win = False
                continue
                  
        if win == True:
            return(win)
    return(win)
  
# Checks whether the player has three
# of their marks in a diagonal row
def diag_win(board, player):
    win = True
    y = 0
    for x in range(len(board)):
        if board[x, x] != player:
            win = False
    if win:
        return win
    win = True
    if win:
        for x in range(len(board)):
            y = len(board) - 1 - x
            if board[x, y] != player:
                win = False
    return win
  
# Evaluates whether there is
# a winner or a tie 
def evaluate(board):
    winner = 0
      
    for player in [1, 2]:
        if (row_win(board, player) or
            col_win(board,player) or 
            diag_win(board,player)):
                 
            winner = player
              
    if np.all(board != 0) and winner == 0:
        winner = -1
    return winner
  
# Main function to start the game
def play_game():
    board, winner, counter = create_board(), 0, 1
    print(board)
    sleep(2)
      
    while winner == 0:
        for player in [1, 2]:
            board = random_place(board, player)
            print("Board after " + str(counter) + " move")
            print(board)
            sleep(2)
            counter += 1
            winner = evaluate(board)
            if winner != 0:
                break
    return(winner)
  
# Driver Code
print("Winner is: " + str(play_game()))

输出 :

[[0 0 0]
 [0 0 0]
 [0 0 0]]
Board after 1 move
[[0 0 0]
 [0 0 0]
 [1 0 0]]
Board after 2 move
[[0 0 0]
 [0 2 0]
 [1 0 0]]
Board after 3 move
[[0 1 0]
 [0 2 0]
 [1 0 0]]
Board after 4 move
[[0 1 0]
 [2 2 0]
 [1 0 0]]
Board after 5 move
[[1 1 0]
 [2 2 0]
 [1 0 0]]
Board after 6 move
[[1 1 0]
 [2 2 0]
 [1 2 0]]
Board after 7 move
[[1 1 0]
 [2 2 0]
 [1 2 1]]
Board after 8 move
[[1 1 0]
 [2 2 2]
 [1 2 1]]
Winner is: 2