От простого к сложному, пишем на Python логическую игру «Быки и Коровы». В этой игре игрок должен угадать четырёхзначное число за меньшее число ходов. Игрок вводит число, а компьютер даёт подсказки.
«Программирование - это игра, в которой вы можете создавать свои собственные правила и где конечным результатом будет что угодно, что вы из этого сможете сделать.»
Линус Торвальдс
Аннотация
8 уроков программирования.
Методическая разработка «Программирование логических игр на Python», как учебное пособие, предназначена для занятий с детьми старше 10 лет в кружке программирование. Синтаксису и семантике языка программирования Python здесь уделяется не достаточное для изучения языка Python внимание. Мы считаем, что данное пособие будет полезно детям и взрослым как введение в специальность. Программисты ещё не знакомые с языком Python с этим пособием смогут оценить выразительность языка Python. Дети могут самостоятельно запустить на компьютере в среде Python 3 примеры из нашего пособия. Примеры сопровождаются очень подробными комментариями и описанием работы программ. Заинтересованным в более глубоком изучении языка Python могу порекомендовать мобильное приложение Sololearn.
В данном пособии рассматриваются: применение переменных, списков, функция list, функции управляющие потоком выполнения программы if, else, elif, while, for, continue, break а также функции print и input, функции из библиотеки random и математические и логические операции.
Наше учебное пособие, так же, может быть полезно в проектной деятельности школьников. Выбирая проекты связанные с программированием, созданием компьютерных игр, компьютерных систем тестирования по школьным предметам, школьники и учителя найдут в этом пособии, практически, пошаговую инструкцию по реализации своего проекта.
Введение
Python [ˈpʌɪθ(ə)n], в русском языке питон — высокоуровневый язык программирования общего назначения, ориентированный на повышение
производительности разработчика и читаемости кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой набор полезных функций.
Python поддерживает структурное, обобщенное, объектно-ориентированное, функциональное и аспектно-ориентированное программирование. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений, высокоуровневые структуры данных. Поддерживается разбиение программ на модули, которые, в свою очередь, могут объединяться в пакеты.
Разработка языка Python была начата в конце 1980-х годов сотрудником голландского института CWI Гвидо ван Россумом.
На сегодня поддерживается одна ветка развития Python 3.x, поддержка ветки Python 2.x закончилась в апреле 2020 года.
Wikipedia
Для программирования на Python на компьютере должен быть установлен интерпретатор Python. В операционной системе Linux он установлен по умолчанию. В Windows и на компьютер Apple установить Python не сложно. Скачать дистрибутив Python можно с официального сайта Python.
Писать программы на Python следует в простых текстовых редакторах, которые не вносят в код программы свои теги форматирования. Например, в Windows это Notepad. Мы рекомендуем установить на компьютер и использовать специализированную среду разработки программ (IDE) на Python, например, IDLE или Thonny. Эти IDE бесплатны и доступны для установки в любой операционной системе. Устанавливая IDE IDLE под Windows, выбирайте дистрибутив для Python 3 последней версии. В процессе установки IDLE будет установлен и интерпретатор Python. В операционной системе Android удобно запускать и писать программы на Python в среде разработки Pydroid 3.
Сохраняйте программы на Python с расширением py. Например, имя файла может быть таким: BullsAndCows02.py. Где py - расширение имени файла, BullsAndCows - имя файла, 02 - версия программы.
Запускать программы на Python можно из командной строки. При этом интерпретатор командной строки должен быть открыт в папке с вашей программой. Наберите в командной строке python3 BullsAndCows02.py и нажмите Ввод (Enter). Командная строка в Windows - это cmd, в Linux и на Apple это терминал. В Windows, программы на python можно запускать двойным щелчком. И самое простое, запускайте программы на python из среды разработки программ (IDE) IDLE или Thonny.
Правила игры «Быки и Коровы»
По правилам игры, компьютер случайным образом выбирает четырёхзначное число таким образом, чтобы первой значащей цифрой не был 0 и чтобы все цифры, составляющие это число были бы уникальными. Цель игрока — угадать число. Если в предложенном вами числе несколько цифр оказались на своём месте, компьютер сообщает сколько есть таких цифр. Цифра на своём месте называется Быком. Если в предложенном вами числе несколько цифр оказались не на своём месте, компьютер сообщает сколько есть таких цифр. Цифра не на своём месте называется Коровой.
В западных источниках подобная игра-головоломка упоминается как "Master-mind". Но, "Master-mind" и в подмётки не годится нашим Быкам и Коровам. В школьные годы мы играли в игру "Быки и Коровы" на листочках в клеточку.
Следует отметить, что программный алгоритм, решатель этой задачи, довольно сложен и в этом пособии не рассматривается. Данной проблемой, в своё время, занимался Дональд Кнут, чьи работы собраны в книге "Искусство программирования".
Дональд Эрвин Кнут, доктор философии (1963), эмерит-профессор Стэнфордского университета, член Американского философского общества (2012), преподаватель и идеолог программирования, автор 19 монографий (в том числе ряда классических книг по программированию) и более 160 статей, разработчик нескольких известных программных технологий. Автор всемирно известной серии книг, посвящённой основным алгоритмам и методам вычислительной математики, а также создатель настольных издательских систем ΤΕΧ и METAFONT, предназначенных для набора и вёрстки книг научно-технической тематики (в первую очередь — физико-математических).
Понятие переменной, строка, операция присваивания, функция print()
Приступим к программированию. По правилам игры, компьютер случайным образом должен составить из четырёх цифр число. Где и как он будет хранить это число?
В простых программах вся информация (данные) хранится в переменных.
Переменная в программировании — это имя, с которым может быть связано значение.
Значит у переменной есть имя, это имя программист должен придумать сам. У переменной есть значение, значением переменной может быть число, символ, строка символов и более сложные структуры данных. В нашей программе компьютер загадывает 4 цифры (выбирает 4 символа из 10 цифр). 4 цифры могут представлять собой четырёхзначное число или строку из четырёх цифр. Мы, в нашей программе, цифры будем группировать в строки или в списки.
Символы и сроки (наборы символов) в Python заключают в двойные или одинарные кавычки. Создадим в нашей программе переменную со значением равным строке из 10 цифр. Пусть имя переменной будет z, а значение '0123456789'. Знак равно (=) почти во всех языках программирования - операция присваивания.
z = '0123456789'
Эта строка читается так: переменной z присваивается значение '0123456789'. Значение созданной переменной можно читать (передавать или использовать) и изменять.
z = '0123456789' # Из 10 цифр создаём строку z
print(z)
Программа 1. Определяем набор допустимых в игре символов.
В программе 1 функция print(z) выводит значение переменной z на экран. Если Вы запускаете свою программу в IDE IDLE, то функция print() осуществляет вывод в командный интерпретатор Python (Shell). Результат работы программы 1 представлен ниже как "Вывод 1".
====== RESTART: /BullsAndCows.py ======
0123456789
>>>
Вывод 1. Результат работы программы 1.
Мы рассмотрели работу функции print(). В общем, встроенные функции в Python имеют имя, заканчивающееся круглыми скобками. В круглых скобках в функцию передают параметры. Если параметров несколько, их разделяют запятыми.
Слово print - имя рассмотренной нами функции, z - параметр. Функция print() может принять несколько строковых параметров разделённых запятыми. Вывод строк на экран функция print() осуществляет в одну строку и в конце переводит курсор вывода в начало следующей строки, так что, следующая функция print() осуществляет вывод с начала следующей строки.
Списки, функция list()
Кроме перечисленных ранее чисел, символов и строк данные в Python могут быть представлены в виде списков.
Список в Python — это последовательность значений любого типа.
Создаётся список в квадратных скобках путём перечисления значений элементов списка через запятую:
z = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
Элементы списка пронумерованы, программисты говорят, — проиндексированы. Нумерация элементов списка начинается с 0. К значению любого элемента списка можно получить доступ по индексу этого элемента. Например, в созданном нами списке z пятый элемент списка z[5] имеет значение '5'. Обращаются к элементу списка по имени списка, указывая после имени индекс элемента в квадратных скобках. Ко всему списку обращаются по имени переменной, содержащей список, без указания квадратных скобок.
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
print(z)
Программа 2. Создаём список допустимых в игре символов.
В программе 2 функция list() создаёт список из строки содержащей все десятичные цифры. Функция print(z) выводит на экран весь список, см. вывод 2.
Функция list() может создать список из любого перечислимого объекта указанного в качестве аргумента функции в круглых скобках.
====== RESTART: /BullsAndCows.py ======
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
>>>
Вывод 2. Вывод списка из программы 1.
Пришло время объяснить, почему, работая над программой игры «Быки и Коровы», мы не остановились на перечислении допустимых символов для игры числом 1234567890, или строкой '0123456789', а решили создать список из этих символов. Просто, мы хотим воспользоваться функцией shuffle() из библиотеки random, а она умеет перемешивать элементы списка.
Библиотека функций random, функция shuffle()
Библиотека random предоставляет функции для генерации случайных чисел, букв, случайного выбора элементов последовательности и т.п. Функция shuffle() случайным образом перемешивает элементы последовательности, например, списка.
Библиотечные функции не входят в ядро Python. Чтобы воспользоваться функцией из сторонней библиотеки, необходимо или импортировать всю библиотеку в свою программу, или импортировать необходимую нам функцию. Во втором случае, необходимо воспользоваться следующим синтаксисом ключевого слова import:
from random import shuffle
Читается это так: из библиотеки random импортируем функцию shuffle.
Импортируют библиотеки и функции до их использования в программе. Рекомендуется это делать в самом начале программы, в верхних её строках.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
print(z)
Программа 3. Создаём перемешанный список допустимых в игре символов.
В программе 3 функция shuffle() перемешивает элементы списка z. В результате, мы получаем список z состоящий из элементов исходного списка но перемешанных случайным образом, см. вывод 3.
====== RESTART: /BullsAndCows.py ======
['3', '2', '1', '9', '6', '8', '7', '0', '4', '5']
>>>
Вывод 3. Результат работы программы 3.
Срез списка
Срез списка - это подмножество элементов исходного списка.
Анализируя список, сформированный программой 3, мы приходим к выводу, что почти любые четыре элемента подряд из этого списка удовлетворяют правилам формирования случайного числа в игре быки и коровы. Не удовлетворяет этим правилам только группа элементов начинающаяся с символа '0'.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
x = z[3:7] # Создаём список x из 4-х элементов списка z
print(x)
Программа 4. Выбираем из 10 перемешанных цифр 4 цифры подряд.
Мы уже говорили, что по имени переменной значением которой является список можно обратиться ко всему списку, по имени переменной с индексом можно выбрать отдельный элемент списка. Так же, можно получить доступ к части списка (срезу), если указать в квадратных скобках после имени переменной диапазон значений индексов элементов списка. Указывая диапазон, сначала указывают начальное значение диапазона, а затем, через двоеточие, конечное значение диапазона. Причём, начальное значение входит в диапазон, а конечное исключается. Все целые числа между начальным и конечным значением диапазона входят в диапазон.
В программе 4 в строке
x = z[3:7]
создаётся новая переменная x со значением равным срезу списка z, включающим элементы z[3], z[4], z[5], z[6]. Результат работы программы 4 можно видеть в выводе 4.
====== RESTART: /BullsAndCows.py ======
['8', '6', '4', '3']
>>>
Вывод 4. Результат работы программы 4.
Срез списка z[3:7] не гарантирует, что список не будет начинаться с символа '0'. Если список z[3:7] начинается с символа '0', то можно взять срез z[4:8] что гарантированно избавит нас от символа '0' в начале списка.
Тернарная операция if else
If переводится с английского языка как если, else как иначе. Тернарная операция if else - это условная операция. Тернарная операция получает три параметра, логическое условие и два вычислимых выражения одного типа. Если условие истинно (True) тернарная операция возвращает результат вычисления первого выражения, если условие ложно (False) - возвращается результат вычисления второго выражения.
Логические условия (condition англ.) в Python составляют с помощью логических операций и операций сравнения. Логические условия в результате вычислений всегда возвращают только одно из двух значений True или False.
Операции сравнения:
> больше,
< меньше,
== равно,
! = не равно,
>= больше или равно,
<= меньше или равно.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
x = z[3:7] if z[3] != '0' else z[4:8] # Создаём список x из 4-х элементов списка z, так, чтобы '0' не оказался на первом месте
print(x)
Программа 5. Выбор 4 элементов из списка z с условием, чтобы первый из выбранных элементов не был бы равен '0'.
В программе 5 в строке
x = z[3:7] if z[3] != '0' else z[4:8]
переменной х присваивается значение среза списка z[3:7] если z[3] не равно '0', иначе x присваивается значение среза z[4:8].
====== RESTART: /BullsAndCows.py ======
['2', '8', '4', '7']
>>>
Вывод 5. Результат работы программы 5.
Функция input()
В игре «Быки и Коровы» предполагается диалог игрока с компьютером. Игрок вводит своё число, а компьютер ему сообщает сколько "быков" и "коров" в этом числе.
Функция input() выводит в командную строку интерпретатора Python сообщение и ожидает ввод строки от пользователя. Пользователь вводит текст и завершает ввод нажатием на клавишу «Ввод» (На некоторых клавиатурах «Enter» или «Return»). Функция input() возвращает в программу введённую пользователем строку.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
x = z[3:7] if z[3] != '0' else z[4:8] # Создаём список x из 4-х элементов списка z, так, чтобы '0' не оказался на первом месте
y = input("Введите четырёхзначное число: ") # Функция ввода строки с клавиатуры
print ('Ваше число:', y, 'Моё число:', x)
Программа 6. Иллюстрация к функции input.
Программа 6, дойдя до строки y = input("Введите четырёхзначное число: "), приостанавливает работу. В командную строку выводится приглашение "Введите четырёхзначное число: ". В ответ на это приглашение игрок должен ввести своё число и нажать на клавишу «Ввод». Как только игрок закончит ввод строки, выполнение программы продолжится. Функция input() возвращает в программу введённую игроком строку, которая с помощью оператора присваивания сохраняется в переменной y.
====== RESTART: /BullsAndCows.py ======
Введите четырёхзначное число: 1234
Ваше число: 1234 Моё число: ['4', '0', '1', '2']
>>>
Вывод 6. Вывод строки введённой игроком и списка цифр, загаданных компьютером.
Программа 6 выводит в командную строку с помощью функции print() число введённое игроком и загаданный список из четырёх цифр см. вывод 6. Но в игре «Быки и Коровы» загаданное компьютером число должно быть скрыто от игрока до победы. Компьютер, вместо этого, должен сообщать игроку сколько "быков" и "коров" в его числе. Значит, программа должна считать "быков" и "коров" и хранить эти значения.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
x = z[3:7] if z[3] != '0' else z[4:8] # Создаём список x из 4-х элементов списка z, так, чтобы '0' не оказался на первом месте
y = input("Введите четырёхзначное число: ") # Функция ввода строки с клавиатуры
b = 0; c = 0 # Создаём переменные Bulls и Cows
print(y, ' содержит ', b, ' быка и ', c, ' коровы')
Программа 7. Созданы две переменные b и c, изменены аргументы функции print.
В программе 7 мы создали две переменные b (bull) и c (cow). Начальные значения этих переменных равны 0. Мы, так же переписали параметры функции print(), которая теперь выводит загаданное игроком число и количество "быков" и "коров" равными 0. Но, программа 7 не считает "быков" и "коров", см. вывод 7.
====== RESTART: /BullsAndCows.py ======
Введите четырёхзначное число: 5678
5678 содержит 0 быка и 0 коровы
>>>
Вывод 7. Вывод в консоль Python из программы 7.
Надо считать "быков" и "коров".
Условный оператор if, логическое выражение, операция сравнения
Условный оператор if изменяет обычный, построчный ход выполнения программы. Оператор if проверяет логическое условие и если это условие истинно (True) выполняется следующий за if блок операторов. Если условие ложно (False), следующий за if блок операторов не выполняется.
Блок операторов в Python выделяется из другой части программы отступом от начала строки предыдущего блока. Рекомендуется делать отступ в 4 пробела. Группа строк, следующих друг за другом и имеющая одинаковый отступ от начала строки является блоком кода.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
x = z[3:7] if z[3] != '0' else z[4:8] # Создаём список x из 4-х элементов списка z, так, чтобы '0' не оказался на первом месте
y = input("Введите четырёхзначное число: ") # Функция ввода строки с клавиатуры
b = 0; c = 0 # Создаём переменные Bulls и Cows
if y[0] == x[0]: # Проверяем цифра на своём месте,
b += 1 # если да, то добавляем быка
print(y, ' содержит ', b, ' быка и ', c, ' коровы')
Программа 8. Сравнение первых элементов строки y и списка x.
В программе 8 в строке
if y[0] == x[0]:
логическим условием оператора if является логическое выражение y[0] == x[0], где логическая операция сравнения == сравнивает первые элементы (с индексом 0) строки y и списка x. Все перечисленные понятия являются логическими потому, что они возвращают логическое значение True или False (тип boolean).
Если первый символ строки введённой игроком y[0], равен первому элементу x[0] списка из символов загаданных компьютером, то выполняется операция:
b += 1
Где к старому значению b прибавляется 1 и новое значение сохраняется в переменной b, см. вывод 8. Программа 8 проверяет, является ли первая цифра в строке введённой игроком "быком".
====== RESTART: /BullsAndCows.py ======
Введите четырёхзначное число: 1234
1234 содержит 0 быка и 0 коровы
>>>
Вывод 8. Результат работы программы 8 показывает что в строке, введённой игроком не угадана ни одна цифра.
Это и не удивительно, наша программа 8 сравнивает только первые элементы (элементы с индексом 0) в строке y и в списке x. То есть, программа ищет "быка" на первом месте в строке введённой игроком. А мы знаем, что не легко угадать 1 цифру из 10.
Не сложно проверить, по отдельности, совпадение каждой цифры в списке x загаданных компьютером цифр и соответствующих им цифр в строке y введённой игроком. Необходимо сделать 4 сравнения символов с помощью функции if и в случае каждого их совпадения к переменной b прибавлять одного быка.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
x = z[3:7] if z[3] != '0' else z[4:8] # Создаём список x из 4-х элементов списка z, так, чтобы '0' не оказался на первом месте
y = input("Введите четырёхзначное число: ") # Функция ввода строки с клавиатуры
b = 0; c = 0 # Создаём переменные Bulls и Cows
if y[0] == x[0]: # Проверяем, первая цифра на своём месте?
b += 1 # если да, то добавляем быка
if y[1] == x[1]: # Проверяем, вторая цифра на своём месте?
b += 1 # если да, то добавляем быка
if y[2] == x[2]: # Проверяем, третья цифра на своём месте?
b += 1 # если да, то добавляем быка
if y[3] == x[3]: # Проверяем, четвёртая цифра на своём месте?
b += 1 # если да, то добавляем быка
print(y, ' содержит ', b, ' быка и ', c, ' коровы')
Программа 9.
================ RESTART: /home/dior/Документы/Python/bool/01.py ===============
Введите четырёхзначное число: 4872
4872 содержит 1 быка и 0 коровы
Вывод 9.
Оператор elif, операция in
Что ещё должна сделать наша программа с каждой цифрой из строки введённой игроком? Программа должна сравнить первую цифру из строки y со второй и остальными цифрами в загаданном компьютером списке x. И если будет найдено совпадение, число "коров" должно быть увеличено на 1. И есть ещё одно ограничение, если первая цифра в y оказалась "быком", проверять её как "корову" не надо, не надо сравнивать её с остальными цифрами в x. Для программиста, задача найти корову оказывается ещё сложнее чем найти быка:
- Если символ (цифра) который мы проверяем оказался быком, далее ничего проверять не надо,
- в противном случае, надо сравнить этот символ со всеми элементами списка x,
- если найдено совпадение,
- увеличить переменную c на 1.
Но это только на первый взгляд сложно. if может быть использован совместно с elif.
Оператор elif может использоваться только совместно с оператором if, а функционал у elif такой же, как у if. Если логическое условие оператора if оказалось истинным, то оператор elif не выполняется и его блок операторов так же не выполняется. Если же логическое условие оператора if оказалось ложным, то оператор elif выполняется, а его блок операторов выполняется или не выполняется в зависимости от значения, возвращаемого логическим условием оператора elif.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
x = z[3:7] if z[3] != '0' else z[4:8] # Создаём список x из 4-х элементов списка z, так, чтобы '0' не оказался на первом месте
y = input("Введите четырёхзначное число: ") # Функция ввода строки с клавиатуры
b = 0; c = 0 # Создаём переменные Bulls и Cows
if y[0] == x[0]: # Проверяем, первая цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[0] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
if y[1] == x[1]: # Проверяем, вторая цифра на своём месте?
b += 1 # если да, то добавляем быка
if y[2] == x[2]: # Проверяем, третья цифра на своём месте?
b += 1 # если да, то добавляем быка
if y[3] == x[3]: # Проверяем, четвёртая цифра на своём месте?
b += 1 # если да, то добавляем быка
print(y, ' содержит ', b, ' быка и ', c, ' коровы')
Программа 10. Проверка, является ли первая цифра в строке введённой игроком "быком" или "коровой".
В программе 10 в строке
elif y[0] in x:
логическим условием оператора elif является логическое выражение y[0] in x, где логическая операция in последовательно сравнивает первый элемент (с индексом 0) строки y со всеми элементами списка x. Если хотя бы одно совпадение найдено, y[0] in x возвращает True, если совпадений не найдено, возвращается False.
Если логическое условие оператора elif истинно, то выполняется операция:
c += 1
Где к старому значению с прибавляется 1 и новое значение сохраняется в переменной с. Программа 10 проверяет, является ли первая цифра в строке введённой игроком "коровой", см вывод 10.
================ RESTART: /home/dior/Документы/Python/bool/02.py ===============
Введите четырёхзначное число: 1234
1234 содержит 0 быка и 1 коровы
Вывод 10.
Программа 10 проверяет только первую цифру введённую игроком. Теперь нам необходимо осуществить такую же проверку всех цифр из строки, введённой игроком.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
x = z[3:7] if z[3] != '0' else z[4:8] # Создаём список x из 4-х элементов списка z, так, чтобы '0' не оказался на первом месте
y = input("Введите четырёхзначное число: ") # Функция ввода строки с клавиатуры
b = 0; c = 0 # Создаём переменные Bulls и Cows
if y[0] == x[0]: # Проверяем, первая цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[0] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
if y[1] == x[1]: # Проверяем, вторая цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[1] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
if y[2] == x[2]: # Проверяем, третья цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[2] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
if y[3] == x[3]: # Проверяем, четвёртая цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[3] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
print(y, ' содержит ', b, ' быка и ', c, ' коровы')
Программа 11. Проверка цифры, в строке введённой игроком, являются "быками" или "коровами".
====== RESTART: /BullsAndCows.py ======
Введите четырёхзначное число: 1234
1234 содержит 0 быка и 2 коровы
>>>
Вывод 11.
Посмотрите на результат работы программы 11 - вывод 11. Здесь компьютер загадал число, игрок ввёл своё число. Компьютер подсчитал в строке введённой игроком количество "быков" и "коров" и вывел результат на экран. С первого раза отгадать четырёхзначное число маловероятно. Мы должны создать такую программу, которая будет загадывать своё число и давать возможность игроку делать попытки отгадать его несколько раз, до победы.
Цикл while
Для решения поставленной задачи, мы должны в нашей программе, начиная со строки содержащей функцию input() и до конца программы создать бесконечный цикл. Для этого практически во всех языках программирования имеется оператор или функция while который позволяет легко создавать бесконечные циклы.
Цикл while выполняется до тех пор, пока истинно условие выполнения цикла.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
x = z[3:7] if z[3] != '0' else z[4:8] # Создаём список x из 4-х элементов списка z, так, чтобы '0' не оказался на первом месте
while(True):
y = input("Введите четырёхзначное число: ") # Функция ввода строки с клавиатуры
b = 0; c = 0 # Создаём переменные Bulls и Cows
if y[0] == x[0]: # Проверяем, первая цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[0] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
if y[1] == x[1]: # Проверяем, вторая цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[1] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
if y[2] == x[2]: # Проверяем, третья цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[2] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
if y[3] == x[3]: # Проверяем, четвёртая цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[3] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
print(y, ' содержит ', b, ' быка и ', c, ' коровы')
Программа 12. С бесконечным циклом.
В программе 12 в строке
while True:
мы записали в качестве условия выполнения цикла логическую константу True. True переводится как истина. Таким образом, добавив в программу while True: мы создали бесконечный цикл. Телом этого цикла являются все строки программы, расположенные под ключевым словом while с отступом от левого края окна с программой.
====== RESTART: /BullsAndCows.py ======
Введите четырёхзначное число: 1234
1234 содержит 0 быка и 1 коровы
Введите четырёхзначное число: 5678
5678 содержит 0 быка и 2 коровы
Введите четырёхзначное число: 7893
7893 содержит 1 быка и 1 коровы
Введите четырёхзначное число: 2340
2340 содержит 0 быка и 0 коровы
Введите четырёхзначное число: 7591
7591 содержит 1 быка и 1 коровы
Введите четырёхзначное число: 8196
8196 содержит 0 быка и 4 коровы
Введите четырёхзначное число: 9861
9861 содержит 4 быка и 0 коровы
Введите четырёхзначное число:
Вывод 12.
Результат работы программы 12 представлен в выводе 12. Здесь мы видим, что игрок последовательно, следуя подсказкам компьютера, может логически вычислить число, загаданное компьютером. Но, программа 12 на этом не заканчивает свою работу. Цикл while продолжает работать хотя после победы смысла в этом нет. В своей программе мы должны предусмотреть выход из цикла while.
Оператор break
Оператор break применяется только внутри цикла while или for. На операторе break выполнение цикла прекращается, операторы тела цикла, следующие за break не выполняются. После оператора break выполняется следующий за телом цикла оператор. Оператор break помогает завершить цикл с помощью дополнительных условий завершения цикла и в любом месте тела цикла.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
x = z[3:7] if z[3] != '0' else z[4:8] # Создаём список x из 4-х элементов списка z, так, чтобы '0' не оказался на первом месте
while(True):
y = input("Введите четырёхзначное число: ") # Функция ввода строки с клавиатуры
b = 0; c = 0 # Создаём переменные Bulls и Cows
if y[0] == x[0]: # Проверяем, первая цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[0] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
if y[1] == x[1]: # Проверяем, вторая цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[1] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
if y[2] == x[2]: # Проверяем, третья цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[2] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
if y[3] == x[3]: # Проверяем, четвёртая цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[3] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
print(y, ' содержит ', b, ' быка и ', c, ' коровы')
if b == 4: # Если число угадано,
break
print('You win!') # поздравляем
Программа 13. Игра «Быки и Коровы»
В программе 13 условием выхода из цикла while является победа игрока, то есть нахождение всех цифр в числе загаданном компьютером и размещение этих цифр по своим местам (4 "быка"). Проверяется это условие в строке
if b == 4:
Если проверка условия возвращает True, выпролняеися выход из цикла и на экран выводится строка 'You win!'. На этом выполнение программы заканчивается см. вывод 12.
====== RESTART: BullsAndCows.py ======
Введите четырёхзначное число: 1234
1234 содержит 0 быка и 1 коровы
Введите четырёхзначное число: 5678
5678 содержит 0 быка и 1 коровы
Введите четырёхзначное число: 3456
3456 содержит 2 быка и 0 коровы
Введите четырёхзначное число: 9406
9406 содержит 1 быка и 2 коровы
Введите четырёхзначное число: 3906
3906 содержит 2 быка и 2 коровы
Введите четырёхзначное число: 3096
3096 содержит 4 быка и 0 коровы
You win!
>>>
Вывод 13.
Цикл for in, функция range()
Решить задачу проверки всех цифр из строки, введённой игроком можно копированием четырёх строк программы 9 начиная с условного оператора if четыре раза. В логических условиях надо будет индекс 0 поменять на индексы 0, 1, 2, 3. Но, можно эти четыре строки программы выполнить четыре раза с помощью оператора цикла.
Создавая цикл for, после ключевого слова for указывают имя переменной, которая последовательно будет принимать значения из списка или диапазона указанного после ключевого слова in. Когда элементы списка или диапазона закончатся, цикл будет завершён. В конце строки определяющей параметры цикла for ставят двоеточие ( : ). Тело цикла в Python выделяется отступами от начала строки. Рекомендуется добавлять 4 пробела.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
x = z[3:7] if z[3] != '0' else z[4:8] # Создаём список x из 4-х элементов списка z, так, чтобы '0' не оказался на первом месте
while(True):
y = input("Введите четырёхзначное число: ") # Функция ввода строки с клавиатуры
b = 0; c = 0 # Создаём переменные Bulls и Cows
for i in range(4): # В цикле из 4-x повторений
if y[i] == x[i]: # проверяем, первая цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[i] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
print(y, ' содержит ', b, ' быка и ', c, ' коровы')
if b == 4: # Если число угадано,
break # выход из игры и
print('You win!') # поздравляем.
Программа 14. Проверка количества "быков" и "коров"во введённой игроком строке.
В программе 14 в строкой
for i in range(4):
создан цикл из четырёх повторений. Переменная цикла i последовательно принимает значения из диапазона созданного функцией range().
Функция range(4) создаёт диапазон из целых чисел начиная от 0 включительно и заканчивая 4. Число 4 - правая граница диапазона не входит в этот диапазон. То есть, в цикле, переменная i последовательно принимает значения 0, 1, 2, 3.
В программе 14 переменная i используется в теле цикла как индекс элементов строки y и списка x. Таким образом последовательно проходят проверку на соответствие званию "бык" или "корова" все элементы строки y (y[0], y[1], y[2], y[3]).
================ RESTART: /home/dior/Документы/Python/bool/03.py ===============
Введите четырёхзначное число: 1234
1234 содержит 0 быка и 2 коровы
Введите четырёхзначное число: 5678
5678 содержит 0 быка и 1 коровы
Введите четырёхзначное число: 90
Traceback (most recent call last):
File "/usr/lib/python3.10/idlelib/run.py", line 578, in runcode
exec(code, self.locals)
File "/home/dior/Документы/Python/bool/03.py", line 10, in <module>
if y[i] == x[i]: # проверяем, первая цифра на своём месте?
IndexError: string index out of range
Вывод 14.
Посмотрите на результат работы программы 14 - вывод 14. Здесь компьютер загадал число, игрок ввёл своё число. Компьютер подсчитал в строке введённой игроком количество "быков" и "коров" и вывел результат на экран. С первого раза отгадать четырёхзначное число маловероятно. Мы должны создать такую программу, которая будет загадывать своё число и давать возможность игроку делать попытки отгадать его несколько раз, до победы.
Оператор continue
Оператор continue применяется только внутри цикла while или for. На операторе continue текущая итерация цикла прекращается, операторы тела цикла, следующие за continue не выполняются. После оператора continue выполняется вход в цикл с начала. Для цикла for вычисляется новое значение переменной цикла, для цикла while выполняется проверка условия цикла, далее, выполняется первый оператор тела цикла, если это не противоречит условию выполнения цикла. Оператор continue в сочетании с оператором условного выполнения помогает настроить логику последовательности выполнения операторов внутри тела цикла.
from random import shuffle # Импортируем функцию shuffle (перемешивание) из библиотеки random
z = list('0123456789') # Создаём список z из строки содержащей 10 цифр
shuffle(z) # Перемешиваем элементы списка z
x = z[3:7] if z[3] != '0' else z[4:8] # Создаём список x из 4-х элементов списка z, так, чтобы '0' не оказался на первом месте
while(True):
y = input("Введите четырёхзначное число: ") # Функция ввода строки с клавиатуры
if len(y) != 4: # Проверка количества символов, введённых игроком.
continue # Ввёл не 4 символа, пусть попробует ещё.
b = 0; c = 0 # Создаём переменные Bulls и Cows
for i in range(4): # В цикле из 4-x повторений
if y[i] == x[i]: # проверяем, первая цифра на своём месте?
b += 1 # если да, то добавляем быка,
elif y[i] in x: # если нет, проверяем есть ли в загаданном числе эта цифра,
c += 1 # если да, то добавляем корову.
print(y, ' содержит ', b, ' быка и ', c, ' коровы')
if b == 4: # Если число угадано,
break # выход из игры и
print('You win!') # поздравляем.
Программа 15. Добавлена проверка количества введённых игроком символов.
================ RESTART: /home/dior/Документы/Python/bool/03.py ===============
Введите четырёхзначное число: 1234
1234 содержит 1 быка и 0 коровы
Введите четырёхзначное число: 56
Введите четырёхзначное число: 567890
Введите четырёхзначное число: 5678
5678 содержит 0 быка и 2 коровы
Введите четырёхзначное число: 1239
1239 содержит 2 быка и 0 коровы
Введите четырёхзначное число: 1769
1769 содержит 2 быка и 0 коровы
Введите четырёхзначное число: 1859
1859 содержит 4 быка и 0 коровы
You win!
Вывод 15.
Задачи
"Достоверные знания могут быть получены только на личном опыте"
Декарт
- Напишите программу, которая предлагает пользователю ввести число с клавиатуры, а когда пользователь введёт число и нажмёт клавишу "Enter", программа выведет это число в терминал.
- Напишите программу, которая выведет в терминал случайное число. В своей программе используйте функцию random() из библиотеки random.
- Напишите программу, которая предлагает пользователю ввести число с клавиатуры, а когда пользователь введёт число и нажмёт клавишу "Enter", программа выведет в терминал случайные числа в количестве равном числу введённому пользователем.
- Напишите программу, которая выведет в терминал одно случайное число в диапазоне от 0.5 до 0.6, 0.5 включительно, 0.6 не включительно.
- Напишите программу, которая предлагает пользователю ввести число с клавиатуры, а когда пользователь введёт число и нажмёт клавишу "Enter", программа выведет в терминал случайные числа в количестве равном числу введённому пользователем. Причём, все эти случайные числа должны быть в диапазоне от 0.5 до 0.6, 0.5 включительно, 0.6 не включительно.
Введите число: 78
78
Вывод программы из задачи 1
0.8616020049064463
Вывод программы из задачи 2
Введите число: 4
0.8001405545802055
0.43831820874016714
0.727554705765767
0.14852568918031728
Вывод программы из задачи 3
0.5563005405132688
Вывод программы из задачи 4
Введите число: 3
0.5936859229505563
0.5465440890759224
0.5538088397062841
Вывод программы из задачи 5
Подсказка.
Возможно, для решения задач вам понадобятся: 'range()', 'input()', 'continue', '>=', 'while', 'print()', 'for', 'random', '"Введите число: "', '>', 'import', 'from', 'break', 'int()', 'random()', '<', 'in', 'True', 'if'.