Как написать программу на языке Python, которая реализует игру Ним с двумя кучами, без ограничений на количество

Как написать программу на языке Python, которая реализует игру "Ним" с двумя кучами, без ограничений на количество забираемых камней? Программа должна иметь "искусственный интеллект" и играть против пользователя, выигрывая, если это возможно. Пользователь задает начальное количество камней в кучах, и программа всегда первой делает ход. Победитель объявляется после того, как игра окончена и один из игроков забрал последний камень. Какой алгоритм следует использовать для игры?
Arbuz

Arbuz

Для реализации игры "Ним" с двумя кучами на языке Python с искусственным интеллектом можно использовать алгоритм, называемый алгоритмом "минимакс". Этот алгоритм позволяет выбирать оптимальный ход для компьютера в каждой ситуации, чтобы максимизировать его шансы на победу.

Вот пошаговое решение для написания программы:

1. Начните с определения функции, которая будет отвечать за игровой процесс:
python
def play_game(pile1, pile2):
while True:
print("Количество камней в первой куче:", pile1)
print("Количество камней во второй куче:", pile2)
print("Ход компьютера:")

# Выбор оптимального хода для компьютера
pile1_move, pile2_move = get_computer_move(pile1, pile2)

print("Компьютер взял", pile1_move, "камней из первой кучи и", pile2_move, "камней из второй кучи.")

# Обновление состояния куч после хода компьютера
pile1 -= pile1_move
pile2 -= pile2_move

# Проверка условия окончания игры
if pile1 == 0 and pile2 == 0:
print("Победил компьютер!")
break

print("Ход пользователя:")

# Ввод хода пользователя
while True:
pile1_user = int(input("Введите количество камней, которое вы хотите взять из первой кучи: "))
if pile1_user > pile1 or pile1_user < 0:
print("Некорректный ход! Попробуйте снова.")
else:
break

while True:
pile2_user = int(input("Введите количество камней, которое вы хотите взять из второй кучи: "))
if pile2_user > pile2 or pile2_user < 0:
print("Некорректный ход! Попробуйте снова.")
else:
break

# Обновление состояния куч после хода пользователя
pile1 -= pile1_user
pile2 -= pile2_user

# Проверка условия окончания игры
if pile1 == 0 and pile2 == 0:
print("Победил пользователь!")
break


2. Определите функцию `get_computer_move`, которая будет выбирать оптимальный ход для компьютера. Здесь мы можем использовать алгоритм минимакс для просмотра всех возможных ходов и выбора наилучшего:
python
def get_computer_move(pile1, pile2):
best_result = float("-inf")
best_move = (0, 0)

# Проходимся по всем возможным ходам
for pile1_move in range(pile1 + 1):
for pile2_move in range(pile2 + 1):
# Пропускаем недопустимые ходы
if pile1_move == 0 and pile2_move == 0:
continue

# Вычисляем результат позиции после хода компьютера
result = evaluate_position(pile1 - pile1_move, pile2 - pile2_move)

# Обновляем лучший результат и ход
if result > best_result:
best_result = result
best_move = (pile1_move, pile2_move)

return best_move



3. Определите функцию `evaluate_position` для оценки текущей игровой позиции. Здесь значение функции может быть положительным, если позиция выгодна для компьютера, и отрицательным, если выгодна для пользователя:
python
def evaluate_position(pile1, pile2):
# Проверяем условие окончания игры
if pile1 == 0 and pile2 == 0:
return float("-inf") # минус бесконечность, так как это выгодно компьютеру

# Вычисляем оценку позиции
return pile1 + pile2 # можно использовать и другие формулы для оценки


4. Добавьте в программу код для начального ввода количества камней в кучах и вызов функции `play_game`:
python
pile1_initial = int(input("Введите начальное количество камней в первой куче: "))
pile2_initial = int(input("Введите начальное количество камней во второй куче: "))

play_game(pile1_initial, pile2_initial)


Это полное решение для реализации игры "Ним" с двумя кучами на языке Python с помощью искусственного интеллекта. Благодаря использованию алгоритма минимакс компьютер будет всегда выбирать оптимальные ходы и выигрывать, если это возможно.
Знаешь ответ?
Задать вопрос
Привет!
hello