Jogo da Velha PYTHON

Gente, como eu posso melhorar a logica da minha maquina? (JogadaAI) visto que toda vez que ela vai jogar ela só marca em lugares disponíveis e aleatórios… raramente faz uma vitoria…

import random
import sys
import os
def restart_program():
    python = sys.executable
    os.execl(python, python, * sys.argv)

tab = [0, 1, 2, 
       3, 4, 5, 
       6, 7, 8]

def desenhar():
  print(tab[0], '|', tab[1], '|', tab[2])
  print('-' * 9)
  print(tab[3], '|', tab[4], '|', tab[5])
  print('-' * 9)
  print(tab[6], '|', tab[7], '|', tab[8])

def jogadaHumano():
  while True:
    posicao = input('Escolha a posição:')
    n = int(posicao)

    if(tab[n] == 'X' or tab[n] == 'O'):
      print('Posiçao inválida')
      continue
    else:
      break
    

  tab[n] = 'O'

def jogadaAI():
  
  print('Jogada da AI')
  opcoesValidas = []

  for i in range(0, 8):
    if(tab[i] != 'X' and tab[i] != 'O'):
      opcoesValidas.append(i)

  opcao = random.choice(opcoesValidas)
  tab[opcao] = 'X'

def ganhou(turno):
  if(
      # Avaliando as linhas
      (tab[0] == turno and tab[1] == turno and tab[2] == turno) or
      (tab[3] == turno and tab[4] == turno and tab[5] == turno) or
      (tab[6] == turno and tab[7] == turno and tab[8] == turno) or

      # Avaliando as colunas
      (tab[0] == turno and tab[3] == turno and tab[6] == turno) or
      (tab[1] == turno and tab[4] == turno and tab[7] == turno) or
      (tab[2] == turno and tab[5] == turno and tab[8] == turno) or

      # Avaliando as diagonais
      (tab[0] == turno and tab[4] == turno and tab[8] == turno) or
      (tab[2] == turno and tab[4] == turno and tab[6] == turno)
  ):
    return True
  else:
    return False


desenhar()

turnoHumano = True

for i in range(0, 9):
  if turnoHumano:
    jogadaHumano()

    if(ganhou('O')):
      desenhar()
      print('Jogador Humano ganhou')
      jogardnv = input("Deseja jogar novamente? Se sim responda 's' ou nao responda 'n'")
      if jogardnv == "s":
         restart_program()
      else:   
        break
  else:
    jogadaAI()

    if(ganhou('X')):
      desenhar()
      print('AI ganhou')
      jogardnv = input("Deseja jogar novamente? Se sim responda 's' ou nao responda 'n'")
      if jogardnv == "s":
        restart_program()
      else:
        break
   
  desenhar()
  turnoHumano = not turnoHumano

  if(i == 8):
    print('Deu velha')
    print('Fim do jogo.')
    jogardnv = input("Deseja jogar novamente? Se sim responda 's' ou nao responda 'n'")
    if jogardnv == "s":
      print ("carregando jogo...")
      restart_program()
    else:
        break