Проблемы с работой модели для игры "камень, ножницы, бумага"?

Как улучшить модель для игры "камень, ножницы, бумага", чтобы она стала более точной и могла определять ничью? Каким образом можно внести изменения в программный код, чтобы учитывать возможность ничьи в результатах?
  • 28 мая 2024 г. 16:31
Ответы на вопрос 2
Одной из основных проблем в модели для игры "камень, ножницы, бумага" может быть недостаточная случайность в выборе компьютером ходов. Если компьютер всегда выбирает один и тот же ход или же делает выбор на основе простых правил, то модель будет предсказуема и неинтересна для игрока.

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

Вот пример кода на Python, который может быть использован для игры "камень, ножницы, бумага" с возможностью ничьи:

```python
import random

# Возможные ходы
moves = ['камень', 'ножницы', 'бумага']

# Функция для выбора хода компьютера
def computer_move():
    return random.choice(moves)

# Функция для определения результат игры
def determine_winner(player_move, computer_move):
    if player_move == computer_move:
        return 'Ничья'
    elif (player_move == 'камень' and computer_move == 'ножницы') or (player_move == 'ножницы' and computer_move == 'бумага') or (player_move == 'бумага' and computer_move == 'камень'):
        return 'Вы победили'
    else:
        return 'Компьютер победил'

player_move = input("Введите ваш выбор (камень, ножницы, бумага): ").lower()
while player_move not in moves:
    print("Некорректный выбор, повторите попытку.")
    player_move = input("Введите ваш выбор (камень, ножницы, бумага): ").lower()

computer = computer_move()
print(f"Компьютер выбрал: {computer}")
winner = determine_winner(player_move, computer)
print(winner)
```

Этот код позволит игроку сразиться с компьютером в игру "камень, ножницы, бумага", учитывая возможность ничьи в результатах. При необходимости можно добавить дополнительные ходы или изменить логику определения победителя.
Вся твоя затея не имеет никакого смысла. KNeighborsClassifier - использует по умолчанию Minkowski metric, что эквивалетно для p=2, обычной Евклидовой дистанции. 

Евклидова дистанция не имеет никакого смысла - для категориальных переменных на вход, она мощный инструмент для непрерывных и бесполезный для категориальных. А у тебя именно категории stone, shears и paper которые закодировал правда, совершенно не правильно . Тебе тут нужен OneHotEncoder, а так ты как бы говоришь алгоритму что paper (3) чем то отличается по весу в модели чем stone (1) . В целом можно работать с так называемой Hamming distance, которая позволяет KNeighborsClassifier получать категории на вход, но scikit-learn не поддерживает ее из коробки, то есть ее можно добавить как custom metric.

Если ты собираешься чему то научится то:
1. Изучи примеры с объектом pipeline он позволяется осуществлять трансформации на тестовом и тренировачном датасете, внутри пайплайна.

2. Для любого алгоритма для этой задачи необходим OneHotEncoder его прям в пайплайн встроешь. Примеры в доках scikit-learn имеются.

3. По скольку у тебя категориальные переменные на вход, то используй алгоритмы которые базируются на деревьях решений . Все они есть в scikit-learn.
Похожие вопросы