Количество камней нестабильно, nim game

#python #nim-game

#python #nim-игра

Вопрос:

Проблема в том, что количество камней, которые принимает компьютер, отличается от числа, отображаемого на экране. Я знаю, что это связано с тем, что функция повторяется дважды. Но я не могу найти способ сохранить сгенерированное случайное число и использовать это число для печати и вычитания [Также я знаю, что это можно сделать без использования функций, но это необходимо]

Вот код:

 import random
stones = random.randint(15, 30)
turn = 0

while stones > 0:
    if turn == 0:
        def player_announce():
            print('There are', stones, 'stones. How many would you like?', end=' ')
        def invalid_entry():
            print('Enter a number from 1-3.')
        player_announce()
        player_stones = int(input(''))
        if player_stones > 3 or player_stones < 1:
            invalid_entry()
        else:
            stones = stones - player_stones
            turn = 1
    else:
        def draw_stones():
            computer_stones = random.randint(1, 3)
            return computer_stones
        print('There are', stones, 'stones. The computer takes', draw_stones())
        stones -= draw_stones()
        turn = 0
if turn == 0:
    print('The computer beats the player!')
else:
    print('The player beats the computer!')
 

Комментарии:

1. Определение встроенных функций таким образом довольно странно..

2. Не могу сказать, что я когда-либо видел функции, определенные в цикле while раньше.

3. и однострочная функция, которая вызывается только один раз, несколько избыточна.

4. Потому что вы вызываете draw_stones() два отдельных и не связанных времени: один раз для печати, один раз в stones -= draw_stones() строке. Это будут две отдельные несвязанные случайные величины. Отсюда и непоследовательность.

5. Я настоятельно рекомендую вам переписать свой код, чтобы помочь отладке и сделать его более читаемым. а) Не определяйте простые однострочные функции, которые используются только один раз ( player_announce , invalid_entry ). б) Вся последовательность if turn == 0: ... player_announce(): только из того, что игрок взял допустимое количество (1-3) камней, затем выполняет обновление. c) На самом деле оба turn==0 и 1 сводятся к получению количества камней, переведенных в переменную, скажем drawn_stones , тогда вы можете выполнить обновление stones -= drawn_stones в цикле while, не нуждаясь в отдельной строке if turn == 0/1 .

Ответ №1:

Простой ответ — вызвать draw_stones один раз и сохранить результат:

 computers_stones = draw_stones()
print('There are', stones, 'stones. The computer takes', computers_stones)
stones -= computers_stones
 

Как только у вас это заработает, я советую вам попросить кого-нибудь прочитать все это для вас, есть много вещей, которые вы могли бы сделать лучше!

Комментарии:

1. ТАК и для конкретных проблем, но когда ваш код работает, вы можете захотеть посетить codereview.stackexchange.com и попросите дать вам более общие отзывы о стиле и подходе.