#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 и попросите дать вам более общие отзывы о стиле и подходе.