AI tictactoe - будущие доски и компьютерные ходы - PullRequest
1 голос
/ 31 января 2020

Мне было предложено улучшить игрока против игрока c -та c -то до ИИ c -та c, в котором игрок играет против компьютера: для этого Мне нужно написать две функции: одну, которая получает доску и символ текущего игрока и возвращает список всех возможных будущих досок - каждая будущая доска представляет собой список, который содержит два элемента: одна - это место, где был помещен символ а другая - доска после размещения символа - доска после одного хода (я использую вложенную доску списка, как видно из кода ниже (в котором я получил помощь, здесь )

Вторая необходимая мне функция - это функция, которая поворачивает компьютеры - она ​​использует первую функцию и выбирает оптимальный ход одним из следующих способов:

  1. выбирает случайный ход (только для начало, если компьютер идет первым) и воспроизводит его

ИЛИ

если компьютер может выиграть в следующем ходу, он выбирает и играет эту опцию

И

если игрок может выиграть в следующем ходу, компьютер должен «заблокировать» его.

у меня есть игрок против игрока ti c -ta c -toe

код:

def get_move(whoseturn, board):
  rowloc=int(input(f'{whoseturn},insert the deserved row to place your symbol: '))
  coloc=int(input(f'{whoseturn} insert the deserved column to place your symbol: '))
  while True:
    if not (0 <= rowloc < 3 and 0 <= coloc < 3):
      print('row and column must be 0, 1, or 2')
      rowloc = int(input(f'{whoseturn},insert the deserved row to place your symbol: '))
      coloc = int(input(f'{whoseturn} insert the deserved column to place your symbol: '))
    elif  board[rowloc][coloc] !='e':
      print("The deserved place is taken, choose again ")
      rowloc = int(input(f'{whoseturn},insert the deserved row to place your symbol: '))
      coloc = int(input(f'{whoseturn} insert the deserved column to place your symbol: '))
    else:
      board[rowloc][coloc] = whoseturn
      break

  return rowloc, coloc

def display_board(board):
  print('\n'.join([' '.join(board[i]) for i in range(3)]))

def win(board, whoseturn, x, y):
  if board[0][y] == board[1][y] == board [2][y] == whoseturn:
    return True
  if board[x][0] == board[x][1] == board [x][2] == whoseturn:
    return True
  if x == y and board[0][0] == board[1][1] == board [2][2] == whoseturn:
      return True
  if x + y == 2 and board[0][2] == board[1][1] == board [2][0] == whoseturn:
    return True

  return False

def isfull(board):
    for i in range(0,3):
        for j in range(0,3):
            if board[i][j]=='e':
                return False
    return True

def main():
    board = [['e','e','e']
            ,['e','e','e']
            ,['e','e','e']]
    print("Welcome to the great tic tac toe game!")

    player1=input("Player 1, select your symbol (X/O): ")
    if player1 =='O':
        print('X is player 2s symbol')
        player2 = 'X'
    else:
        print('O is player 2s symbol')
        player2 = 'O'
    print("Player 1 will start")


    whoseturn=player1
    while True:
      display_board(board)

      rowloc, coloc = get_move(whoseturn, board)
      if win(board,whoseturn, rowloc, coloc):
        print(f'{whoseturn} wins!')
        display_board(board)
        break

      if isfull(board):
        print('Tied')
        break
      if whoseturn=='O':
          whoseturn='X'
      else:
          whoseturn='O'


if __name__ == '__main__':
   main()

и запуск функции будущих досок

код:

def futuremove(board,whoseturn):
    newboard=copy.deepcopy(board)
    place = []
    copyboard = []
    arrangement=[]
    final=[]
    for i in range(3):
        for j in range(3):
            if newboard[i][j]=='e':
                newboard[i][j]=whoseturn
                if win(newboard,whoseturn,i,j)==True:
                    loctup=[i,j]
                    place.append(loctup)
                    copyboard.append(newboard)
                    arrangement.append(place)
                    arrangement.append(copyboard)
                    final.append(arrangement)
                    print(final)
                else:
                    break

помогите мне найти работающего игрока против компьютера ti c -ta c -попутная игра! любая помощь будет очень ценится!

1 Ответ

1 голос
/ 31 января 2020

Существует множество различных подходов, один из которых может быть довольно простым: использовать минимаксный алгоритм 1002 *

В простом примере, где ваша программа выглядит только на один ход вперед, после того, как игра делает ход, ваш ИИ будет генерировать доску для каждого возможного хода, который он может сделать, и из этих ходов, каждого возможного встречного хода, который мог сделать игрок.

Теперь вы хотите чтобы назначить оценку каждому из возможных ходов ИИ, то, как вы хотите определить алгоритм подсчета очков, зависит от вас, но он должен представлять, насколько хорошо или плохо определенное игровое состояние для вашего ИИ.

Счет каждого из возможных ходов ИИ должен быть равен худшему счету всех встречных ходов игрока, потому что мы хотим предположить, что игрок будет действовать в их интересах.

Как таковой Вы сможете определить, какой из потенциальных ходов ИИ дает ему наилучшие шансы на победу в игре из текущего состояния. Я настоятельно рекомендую прочитать прилагаемую статью для подробностей реализации и более глубокого понимания.

...