Ним-3 v2.0 Написать программу на python, соблюдающую данные условия
Ограничение времени 1 секунда
Ограничение памяти 64Mb
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt
Игра ним для двух игроков с тремя кучами и без ограничения на количество забираемых камней.
Напишите программу с «искусственным интеллектом» (ИИ), которая играет против пользователя и выигрывает, если может. Исходное количество камней в кучах задаёт пользователь, программа всегда ходит первой. Выигрывает забравший последний камень, и при окончании игры нужно объявить победителя.
Алгоритм игры выглядит следующим образом:

Сначала пользователь вводит количества камней в кучах (натуральные числа, каждое на новой строке).
Затем первый ход делает программа и выводит через пробел пять чисел: из какой кучи взяты камни; сколько камней взято; сколько камней осталось в кучах, сначала в первой, затем во второй, а потом и в третьей
Затем ход делает пользователь: вводит на отдельных строках номер кучи и количество камней, которые он хочет взять.
Если ход некорректный, например, пользователь пытается взять камней больше, чем есть в куче, программа должна вывести: Некорректный ход: и ожидать нового ввода пользователя.
После каждого корректного хода игрока или ИИ нужно выводить пять чисел, как и после первого хода ИИ.
Если выигрывает игрок, то надо вывести фразу: Вы выиграли!, а если ИИ – фразу: ИИ выиграл!
Все сообщения программы должны строго соответствовать условию.

Формат ввода
Для старта игры вводятся три натуральных числа.
Пример диалога игры:

2
2
2
1 2 0 2 2
1
2
Некорректный ход: 1 2
1
0
Некорректный ход: 1 0
2
1
2 1 0 1 2
3 1 0 1 1
2
1
2 1 0 0 1
3 1 0 0 0
ИИ выиграл!

lixonilya lixonilya    3   31.10.2020 18:13    44

Ответы
andreybalashov andreybalashov  08.01.2024 16:03
Хорошо, давайте разберемся с данной задачей по шагам.

Шаг 1: Ввод данных
Пользователь должен ввести три натуральных числа, представляющих количество камней в каждой из трех куч. Давайте прочитаем эти значения с помощью input() и преобразуем их в целочисленный формат:

```python
heap1 = int(input())
heap2 = int(input())
heap3 = int(input())
```

Шаг 2: Ход программы
Теперь наш ИИ должен сделать ход. Для этого мы можем использовать простую стратегию, которая позволит нам выиграть в такой игре. Идея состоит в том, чтобы найти некоторый паттерн в количестве камней в кучах и выбрать ход в соответствии с ним.

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

```python
if (heap1 + heap2 + heap3) % 3 == 1:
# ИИ берет все камни из первой кучи
heap1_new = 0
heap2_new = heap2
heap3_new = heap3
elif (heap1 + heap2 + heap3) % 3 == 2:
# ИИ берет все камни из второй кучи
heap1_new = heap1
heap2_new = 0
heap3_new = heap3
else:
# ИИ берет все камни из третьей кучи
heap1_new = heap1
heap2_new = heap2
heap3_new = 0
```

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

```python
if heap1_new < heap1:
user_heap = int(input())
user_stones = int(input())
if user_heap == 1 and user_stones <= heap1 - heap1_new:
# Ход пользователя верный
heap1_new = heap1_new + user_stones
else:
print("Некорректный ход:", user_heap, user_stones)
else:
# Всегда забираем, когда ИИ первый ходит
user_heap = int(input())
user_stones = int(input())
print("Некорректный ход:", user_heap, user_stones)
```

Шаг 3: Обновление данных и проверка условий победы
Теперь, после каждого корректного хода, нам нужно обновить данные о количестве камней в кучах и проверить условия победы.

```python
heap1 = heap1_new
heap2 = heap2_new
heap3 = heap3_new

if heap1 + heap2 + heap3 == 0:
# Игра закончена, и игрок выиграл
print("Вы выиграли!")
break
```

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

```python
heap1 = heap1_new
heap2 = heap2_new
heap3 = heap3_new
```

Шаг 4: Повторяющийся процесс
Мы должны повторять шаги 2 и 3 до тех пор, пока не будет выполнено условие победы. Для этого мы можем использовать цикл while, который будет выполняться до тех пор, пока условие не будет выполнено.

```python
while True:
# Шаги 2 и 3
...
```

Шаг 5: Объявление победителя
Когда игра окончена и условие победы выполнено, мы должны объявить победителя. В нашем случае, если игра закончилась и победил пользователь, мы выведем "Вы выиграли!". Если же победил ИИ, мы выводим "ИИ выиграл!".

```python
if heap1 + heap2 + heap3 == 0:
# Игра закончена
if heap1_new == 0:
# Победил ИИ
print("ИИ выиграл!")
else:
# Победил игрок
print("Вы выиграли!")
break
```

В итоге, весь код вместе выглядит следующим образом:

```python
# Шаг 1
heap1 = int(input())
heap2 = int(input())
heap3 = int(input())

while True:
# Шаг 2
if (heap1 + heap2 + heap3) % 3 == 1:
heap1_new = 0
heap2_new = heap2
heap3_new = heap3
elif (heap1 + heap2 + heap3) % 3 == 2:
heap1_new = heap1
heap2_new = 0
heap3_new = heap3
else:
heap1_new = heap1
heap2_new = heap2
heap3_new = 0

# Шаг 2 (продолжение)
if heap1_new < heap1:
user_heap = int(input())
user_stones = int(input())
if user_heap == 1 and user_stones <= heap1 - heap1_new:
heap1_new = heap1_new + user_stones
else:
print("Некорректный ход:", user_heap, user_stones)
else:
user_heap = int(input())
user_stones = int(input())
print("Некорректный ход:", user_heap, user_stones)

# Шаг 3
heap1 = heap1_new
heap2 = heap2_new
heap3 = heap3_new

if heap1 + heap2 + heap3 == 0:
print("Вы выиграли!")
break

# Шаг 4
heap1 = heap1_new
heap2 = heap2_new
heap3 = heap3_new

# Шаг 5
if heap1 + heap2 + heap3 == 0:
if heap1_new == 0:
print("ИИ выиграл!")
else:
print("Вы выиграли!")
```

Надеюсь, это поможет вам написать программу на Python для игры "Ним-3". Удачи!
ПОКАЗАТЬ ОТВЕТЫ
Другие вопросы по теме Информатика