Генерация числа для игры "Быки и коровы"
уважаемое сообщество. Я - абсолютный новичок в программировании, пишу игру Быки и коровы на Python. У меня следующий вопрос. По правилам игры не должно быть повторяющихся цифр в загаданном трехзначном числе. У меня проблема в области кода, который загадывает число.
import random
number_player1 = ' '
digit1 = str(random.randint(1, 9))
digit2 = str(random.randint(0, 9))
digit3 = str(random.randint(0, 9))
if digit1 != digit2 and digit2 != digit3 and digit1 != digit3:
number_player1 = digit1 + digit2 + digit3
else:
здесь мне непонятно, какое действие выполнить
Наверное, лучше всего было бы выполнить возвращение в начало программы для повторного загадывания числа, но с циклами я затрудняюсь что-то делать. И еще: программа учебная, все дальнейшие преобразования(ввод отгадываемого числа, подсчет собственно быков и коров) производятся с помощью строкового типа данных, так что желательны 'косметические' изменения программы, а не полная ее переделка. Заранее спасибо за ответы.
Ответы (2 шт):
Идея такая:
первую цифру Вы генерируете произвольно.
Вторую - до тех пор, пока она совпадает со второй. как только перестала совпадать - можно идти дальше! (вероятно, это произойдет с первой попытки, но здесь важен сам принцип)
Третью - надо после генераиции сравнивать с первой и второй, как только она отличается от них обоих - все, дело сделано!
И на "псевдокоде" я, отвечая на Ваш вопрос, написал это так:
import random
number_player1 = ' '
digit1 = str(random.randint(1, 9))
do
digit2 = str(random.randint(0, 9))
while ( digit2 == digit1 )
do
digit3 = str(random.randint(0, 9))
while ( digit3 == digit1 || digit3 == digit2 )
number_player1 = digit1 + digit2 + digit3
Но, есть проблема, о которой я забыл: к сожалению, в Python цикл с постусловием отсутствует!
Поэтому в реальности код становится несколько более громоздким:
import random
number_player1 = ' '
digit1 = str(random.randint(1, 9))
while True:
digit2 = str(random.randint(0, 9))
if digit2 != digit1:
break
while True:
digit3 = str(random.randint(0, 9))
if digit3 != digit1 and digit3 != digit2:
break
number_player1 = digit1 + digit2 + digit3
print (number_player1)
Но этот код я уже проверил - работает!
В random есть функция выбора указанного количества элементов из данной последовательности - sample(seq, n).
import random
random.seed(a=None, version=2) # на алгоритм не влияет, но увеличивается случайность результата
n = random.sample("0123456789", 3) # 3 неповторяющихся элемента из 0123456789
if n[0] == "0": # если первая цифра получилась 0
n[0] = random.randint(1, 9)