Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2020, 20:31   #1
VeryStupidPerson
Пользователь
 
Аватар для VeryStupidPerson
 
Регистрация: 20.07.2020
Сообщений: 69
По умолчанию Крестики-нолики, минимаксный алгоритм

Я написал крестики - нолики, на основе minmax алгоритма, но они слишком слабо играют. Можно ли улучшить игру компьютера, не увеличивая глубину поиска? (функция computer())
Код:
board = [' 1 ', ' 2', ' 3', ' 4', ' 5', ' 6', ' 7', ' 8', ' 9']
def drawpole(board):
    print(' ' + board[0] + ' | ' + board[1] + ' | ' + board[2])
    print('----+----+----')
    print(' ' + board[3] + ' | ' + board[4] + ' | ' + board[5])
    print('----+----+----')
    print(' ' + board[6] + ' | ' + board[7] + ' | ' + board[8], '\n')
    print()

def computer(board, cznak, iznak):
    Min = 0
    Max = 0
    minmax = -40
    kletka = 0
    for i in range(9):
        if board[i] != 'O' and board[i] != 'X':
            newboard = board.copy()
            newboard[i] = cznak
            Max = poleznoste(newboard, cznak)
            if Max >= 5:
                board[i] = cznak
                break
            for a in range(9):
                if newboard[a] != 'O' and newboard[a] != 'X':
                    newnewboard = newboard.copy()
                    newnewboard[a] = iznak
                    Min = poleznoste(newnewboard, iznak)
                    if (-1 * Min + Max) > minmax:
                        minmax = -1 * Min + Max
                        kletka = i
        if i == 8:
            board[kletka] = cznak
    
def igrok(board, iznak):
    hod = int(input("Введите цифру поля, куда вы хотите поставить свой знак: "))
    if hod < 1 or hod > 9:
        print("Такой клетки нет!")
        igrok(board, iznak)
    elif board[hod - 1] == 'O' or board[hod - 1] == 'X':
        print("Эта клетка занята!")
        igrok(board, iznak)
    else:
        board[hod - 1] = iznak
        return
def poleznoste(board, znak):
    schetchik = 0
    index = 0
    for i in range(3):
        if board[index] == board[index + 1] == board[index + 2] == znak:
            schetchik += 5
        elif (board[index] == board[index + 1] == znak) and (board[index + 2] != 'O' and board[index + 2] != 'X'):
            schetchik += 1
        elif (board[index + 1] == board[index + 2] == znak) and (board[index] != 'O' and board[index] != 'X'):
            schetchik += 1
        elif (board[index] == board[index + 2] == znak) and (board[index + 1] != 'O' and board[index + 1] != 'X'):
            schetchik += 1
        index += 3
    index = 0
    for i in range(3):
        if board[index] == board[index + 3] == board[index + 6] == znak:
            schetchik += 5
        elif (board[index] == board[index + 3] == znak) and (board[index + 6] != 'O' and board[index + 6] != 'X'):
            schetchik += 1
        elif (board[index] == board[index + 6] == znak) and (board[index + 3] != 'O' and board[index + 3] != 'X'):
            schetchik += 1
        elif (board[index + 3] == board[index + 6] == znak) and (board[index] != 'O' and board[index] != 'X'):
            schetchik += 1
        index += 1
    if board[0] == board[4] == board[8] == znak:
        schetchik += 5
    elif (board[0] == board[4] == znak) and (board[8] != 'O' and board[8] != 'X'):
        schetchik += 1
    elif (board[0] == board[8] == znak) and (board[4] != 'O' and board[4] != 'X'):
        schetchik += 1
    elif (board[4] == board[8] == znak) and (board[0] != 'O' and board[0] != 'X'):
        schetchik += 1
    if board[2] == board[4] == board[6] == znak:
        schetchik += 5
    elif (board[2] == board[4] == znak) and (board[6] != 'O' and board[6] != 'X'):
        schetchik += 1
    elif (board[2] == board[6] == znak) and (board[4] != 'O' and board[4] != 'X'):
        schetchik += 1
    elif (board[4] == board[6] == znak) and (board[2] != 'O' and board[2] != 'X'):
        schetchik += 1
    return schetchik
        
if input("Вы хотите пойти первым? да/нет: ") == 'нет':
    iznak = 'O'
    cznak = 'X'
    computer(board, cznak, iznak)
else:
    iznak = 'X'
    cznak = 'O'
while True:
    drawpole(board)
    igrok(board, iznak)
    if poleznoste(board, iznak) >= 5:
        print("!!!Вы победили!!!")
        drawpole(board)
        break
    computer(board, cznak, iznak)
    if poleznoste(board, cznak) >= 5:
        print("!!!Я победил!!!")
        drawpole(board)
        break
    a = 0
    for i in board:
        if i == 'O' or i == 'X':
            a += 1
    if a == 9:
        print("!!!Ничья!!!")
        drawpole(board)
        break
Если нельзя, то достаточно ли будет увеличить глубину поиска в два раза, что бы компьютер всегда побеждал, или делал ничью?
И можно ли упростить вычисление полезности хода, не перебирать все возможные комбинации, а сделать как-то попроще? (функция poleznoste())
---------------------------------------------------
Нич-чего не понимаю!
Или что-то случилось, или… одно из двух!

Последний раз редактировалось VeryStupidPerson; 22.07.2020 в 20:35.
VeryStupidPerson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
алгоритм для изменения скорости игры крестики нолики tml2110 Помощь студентам 1 17.12.2011 16:19
Крестики нолики!!!!! Аля:-) Помощь студентам 13 11.10.2011 20:32
Алгоритм минимакс (minimaxing) для игры крестики-нолики 3х3 JustFree Помощь студентам 1 11.10.2011 16:35
Минимаксный алгоритм SaiLight Свободное общение 2 01.06.2009 03:46
крестики-нолики, алгоритм GaNDyPaC Помощь студентам 8 28.02.2009 23:30