Серия «101 игра на python»

7

101 игра на Python. Предисловие

Приветствую тебя, начинающий программист! Этот репозиторий создан специально для тебя. Здесь ты найдешь коллекцию игр из легендарной книги «101 BASIC Computer Games», переведенных на язык Python. Я хочу показать тебе, как всего несколько строк кода могут воплотить сложные идеи, чтобы ты мог без труда разобраться в логике написания программы, увлечься процессом и начать свои эксперименты.

дальше будет много текста. Можешь пропустить и перейти к содержанию

Книга, которая вдохновила меня на создание этого учебника

В 1973 году была опубликована книга «101 BASIC Computer Games», быстро ставшая настоящим бестселлером, разойдясь тиражом в миллион экземпляров. Она сыграла ключевую роль в популяризации программирования, а за её успехом стояла компания Digital Equipment Corporation (DEC), один из пионеров в производстве мини-компьютеров.

Немного истории развития вычислительной техники

К концу пятидесятых годов прошлого века гигантские машины на электронных лампах, такие как ENIAC и MARK-1 в основном были замещены поколением компьютеров на транзисторах. Каждое следующее поколение разительно отличалось быстродействием и объемом обрабатываемых данных, но и они занимали немало места и требовали команду профессионалов для обслуживания. На рынке того времени было несколько выдающихся марок вычислительных машин, которые оказали значительное влияние на развитие технологий и науки. Перечислю некоторые из них:

  • IBM 709 — одна из самых популярных машин того времени, использовавшаяся для научных и военных расчетов.

  • UNIVAC I (Universal Automatic Computer I) — первый коммерчески успешный компьютер, разработанный для использования в бизнесе и правительственных учреждениях.

  • PDP-1 (Programmed Data Processor-1) — первый компьютер из линейки PDP, разработанный компанией Digital Equipment Corporation (DEC), который стал основой для развития мини-компьютеров. (о компании DEC будет написано ниже)

  • EDSAC (Electronic Delay Storage Automatic Calculator) — один из первых практических компьютеров с хранимой программой, разработанный в Кембриджском университете.

  • CDC 1604 — компьютер компании Control Data Corporation, известный своей высокой производительностью и использованием в научных исследованиях.

  • ENIAC

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

ENIAC на Абердинском испытательном полигоне, штат Мэриленд. Глен Бек (на заднем плане) и Бетти Снайдер (на переднем плане) программируют ENIAC в здании 328 в Баллистической исследовательской лаборатории.

  • Harvard Mark I

    Электромеханическая счетная машина

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

Левая стойка вычислителя с электромеханическими вычислительными компонентами.

  • IBM 1401

    десятичный компьютер с переменной длиной слова

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

IBM 1401 в ремонте в Музее компьютерной истории. Волонтер музея использует осциллограф для устранения неполадок с сумматором компьютера.

  • UNIVAC I

    Первый американский компьютер общего применения (1951)

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

UNIVAC I — первый коммерческий компьютер в США, созданный для гражданского правительственного учреждения в лаборатории Экерта-Мокли в Филадельфии, штат Пенсильвания.

  • IBM 7070

    Десятичный компьютер, представленный IBM в 1958 году

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

Часть шасси IBM 7070, на котором видны платы стандартной модульной системы (SMS) с дискретными транзисторами.

  • UNIVAC 1232

    Серия 1230 представляла собой военную версию UNIVAC 490, выпускавшуюся подразделением Sperry Univac в Сент-Поле.

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

Панель управления для компьютера UNIVAC 1232. Этот конкретный компьютер использовался примерно с 1967 по 1990 год в Центре управления спутниками ВВС США в Саннивейле, Калифорния. Этот компьютер является военной версией универсального коммерческого компьютера UNIVAC 490. Находится в Смитсоновском национальном музее авиации и космонавтики в Центре Удвара-Хейзи. (https://commons.wikimedia.org/)

Программирование в 1970-80х: эпоха перфокарт и терпения

Процесс разработки 1970-х годах был совсем не таким, как сегодня. Доступ к вычислительным машинам был ограничен, и это влияло на весь процесс. В основном, это были армия, университеты, и научные учреждения. Программирование в те времена было скорее искусством, требующим кропотливости, трудолюбия и огромного терпения. Работа с кодом требовала внимательности, аккуратности и высокой степени усидчивости. Разработчик писал и редактировал код вручную в тетради или блокноте. Представь себе: никакой подсветки синтаксиса, автодополнения или отладчика! Если в код закрадывалась ошибка или нужно было что-то изменить, код переписывался заново или исправлялся аккуратными пометками. Это был долгий и монотонный процесс, требующий предельной концентрации. Ни о какой массовости профессии программиста речи не шло.

Ввод программы в машину был отдельным «искусством». Программист или оператор садился за перфоратор, рядом клал тетрадь с кодом и начинал набивать код на перфокарты. Перфоратор – это устройство, похожее на пишущую машинку, где каждая клавиша соответствовала определённой букве, цифре или символу. Нажатие клавиши пробивало отверстие в нужной колонке карты. Каждая карта представляла собой одну или несколько строк кода. После завершения набора карты передавались на проверку – верификацию. Оператор вводил в верификационное устройство данные повторно, а машина сверяла их с пробитыми отверстиями. Перфокарту с ошибкой либо заменяли, либо исправляли путём пробивки новых отверстий в подходящих колонках. Когда все карты были готовы, их раскладывали в строгой последовательности. Порядок был критически важен, так как именно в этой последовательности карты считывались машиной. Затем карты передавали на считывающее устройство. Для кодировки даже относительно небольших программ требовались сотни, тысячи, а то и десятки тысяч перфокарт. Любая ошибка, будь то неправильно пробитое отверстие или нарушение последовательности, приводили к сбою программы. И тогда весь процесс приходилось начинать заново.

Перфоратор  IBM 29 Keypunch

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

FORTRAN IV Pocket Handbook, Daniel E. Alexander and Andrew C. Messer, McGraw Hill, 1972.(https://www.math-cs.gordon.edu/courses/cs323/FORTRAN/keypunch.jpg)

Эта стопка из 62 500 перфокарт — объемом 5 МБ — содержала программу управления гигантской военной компьютерной сетью SAGE.

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

Изображение взято с сайта Computer History Museum (CHM)

DEC и Дэвид Ал

Выпускники Массачусетского технологического института (MIT) Кен Олсон и Харлан Андерсон не были новичками в вычислительной технике. Работая в Лаборатории Линкольна (научно-исследовательское учреждение Министерства обороны США в структуре Массачусетского технологического института) они выполнили бо́льшую часть проектов при разработке машин AN/FSQ- 7, TX-0 и TX-2. TX-0 был первым полностью транзисторным 16-битным компьютером с 16-битной адресацией и 16-битными инструкциями.

AN/FSQ- 7

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

Название "AN/FSQ" происходит от Army-Navy / Fixed Special eQuipment.

AN/FSQ-7 был самой большой дискретной компьютерной системой из когда-либо созданных. Это была основная компьютерная система сети SAGE, разработанная и построенная IBM. Она была огромной, содержала около 49 000 электронных ламп, весила сотни тонн и потребляла мегаватты энергии. Программа на перфокартах из предыдущего фото запускалась на этой системе
(https://commons.wikimedia.org/)

В 1957 году Кеннет Олсен и Харлан Андерсон учредили компанию Digital Equipment Corporation (DEC) с целью удешевить и уменьшить габариты вычислительных машин. Начальный капитал компании составил $100 000, причём 70% из них принадлежало компании American Research and Development. Американская корпорация исследований и разработок (ARDC) была новаторской венчурной фирмой, а ее инвестиция в DEC считается первой в истории успеха венчурного капитала. Классический пример стартапа тех лет😊. Компания-учредитель настояла на том, чтобы в названии дочерней компании отсутствовало слово «computer», хотя изначально название планировалось как «Digital Computer Corporation». Это же условие было соблюдено и в названии продукции: вместо термина «computer» употреблялся термин «Programmable Data Processor», или сокращённо «PDP». Данное условие было связано с тем, что в те времена существовал стереотип о том, что компьютер — это нечто огромное и дорогое, требующее отдельного машинного зала и солидного обслуживающего персонала. Таким путём компания избежала негативных последствий этого стереотипа.

PDP-8

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

PDP-8 на выставке в Национальном музее вычислительной техники в Блетчли, Англия. Этот экземпляр относится к первому поколению PDP-8, построенному на дискретных транзисторах и позднее известному как Straight 8. (https://commons.wikimedia.org/)

PDP-11

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

Компьютер PDP-11/40 в Венском Техническом Музее. Внизу расположен процессор PDP–11/40, над ним установлен двойной накопитель DECtape TU56. (https://commons.wikimedia.org/)

В 1969 году корпорация DEC пригласила на работу Дэвида Ала в качестве консультанта по психологии обучения и маркетингу для разработки своей линейки учебных продуктов. У Ала было основательное образование в области точных наук и бизнеса: он получил учёные степени в области электротехники и делового администрирования. До прихода в DEC он успел получить опыт работы в сфере просвещения и был известен своим интересом к использованию компьютеров в учебном процессе. Он начал свою карьеру в Digital Equipment Corporation в качестве консультанта по психологии обучения и маркетингу для разработки линейки компьютеров, не требующих специального обучения для обслуживания вычислительных систем. Дэвид Ал редактировал информационный бюллетень DEC, в котором регулярно публиковались блоки кода и инструкции по программированию мини-компьютеров. Ал уговорил руководство издать сборник игр на языке BASIC.
- BASIC, язык, на котором написаны игры, тогда только набирал популярность.
- BASIC был спроектирован так, чтобы студенты могли без затруднений писать программы, используя терминалы с разделением времени. Он предназначался для более «простых» пользователей, не столько заинтересованных в скорости исполнения программ, сколько просто в возможности использовать компьютер для решения своих задач, не имея специальной подготовки.
- интерпретатор языка был в каждой моделей PDP, кроме самых ранних (PDP-1, PDP-4, PDP-5)

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

(us.archive.org)

Сборник стоил 7,50 долларов плюс 50 центов за доставку. Сегодня эта цена эквивалентна примерно 50.25 долларам, учитывая среднегодовую инфляцию в 3.8%

Важную роль в создании книги сыграли энтузиасты программирования со всей страны. DEC объявила конкурс, приглашая программистов присылать свои игры на BASIC. Авторы лучших работ получали гонорар, а их игры включались в сборник. Этот краудсорсинговый подход сделал книгу поистине уникальной. Она стала не только сборником игр, но и отражением энтузиазма и творчества целого поколения программистов-любителей. DEC предъявляла достаточно строгие требования к оформлению присылаемых материалов, что было необходимо для унификации и упрощения процесса публикации. Вот некоторые из этих требований:
Бумага. Белая, нелинованная. Как можно меньше сгибов на распечатках. 
Печать. Свежая черная лента. Красная не не принималась. 
Перфолента. Предпочтительна была парафинированная фальцованная перфолента (бумага, пропитанная парафином для прочности и защиты с отверстиями для лентопротяжного механизма). Если использовалась лента с пропиткой (например, от телетайпа), её необходимо было аккуратно сложить (сгибы через каждые 8.5 дюймов (21.59 см)), оставив не менее 17 дюймов (43.18 см) пустого лидера и 8.5 дюймов (21.59 см) трейлера. Ленту с пропиткой требовалось заворачивать в пищевую пленку или вощеную бумагу, чтобы предотвратить загрязнение.

- Лидер —  начало ленты, которое остается пустым перед началом записи данных.

- Трейлер —  конец ленты, который остается пустым после завершения записи данных.

Кроме того, авторы должны были предоставить следующую информацию:
*  Имя
*  Полный адрес
*  Телефон
*  Школу (если есть)
*  Возраст
*  Используемую компьютерную систему
*  Источник программы (оригинальная идея или адаптация)

Отправляя программу, автор давал Digital Equipment Corp. право публиковать, перепечатывать, распространять или использовать её любым другим способом. При этом авторство, конечно же, всегда указывалось.

101 игра на Python. Предисловие Программирование, История IT, Python, Инструкция, Гайд, Длиннопост

Страница книги с инструкцией для авторов (us.archive.org)

Кроме этой книги, были изданы два дополнительных руководства:
Understanding Mathematics and Logic Using BASIC Computer Games для учеников 7-12 классов.
Getting Started in Classroom Computing для учеников 2-7 классов.

Книга выдержала три переиздания:
1-е издание: июль 1973 года.
2-е издание: апрель 1974 года.
3-е издание: март 1975 года.

В 1973 году Девида Ала уволили со своей должности в связи с сокращением штатов, но еще до увольнения он был принят в новое подразделение DEC. Эта группа трудилась над созданием компьютера, который был меньше, чем любой из когда-либо построенных, намереваясь вывести новый продукт на новые рынки, такие как школы. Им удалось построить компактную машину, сочетающую PDP-8 с терминалом VT50, а также, они смогли поместить PDP-11 в небольшой портативный корпус. Когда результат показали операционному комитету DEC, инженерам он понравился, но отдел продаж опасался, что это сократит продажи их существующих линий. В конечном итоге решение было принято Кеном Олсеном, одним из основателей Digital Equipment Corporation, который в конце концов заявил: «Я не вижу причин, по которым кому-то может понадобиться собственный компьютер».

На этом проект завершился.

В 1974 г. Ал покинул DEC, разочаровавшись в политике компании и основал Creative Computing, один из первых журналов, популяризаторов компьютеров. В течение следующего десятилетия Creative Computing охватывала весь спектр любительских, домашних и персональных компьютеров, и, хотя Ал продал журнал в начале 1980-х, он продолжал выполнять свои обязанности главного редактора.
В июне 2022 года Ал выпустил в общественное достояние все, что он когда-либо написал, от прозы до программного обеспечения

Продолжение истории. Дэвид Ал и Creative Computing

В этом сборнике

Я начинаю портировать игры на языке Python. Каждая игра сопровождается исходным кодом, подробным объяснением, блок-схемой и алгоритмом, чтобы ты смог легко понять, как она работает, и начать экспериментировать.

Мое мнение

Обучение коду через написание игр дает ученику возможность увидеть осмысленный результат выполнения кода. В репозитории код написан максимально просто, чтобы быть доступным для начинающих. В процессе я буду давать рекомендации по написанию кода, комментариев и следованию стилю PEP-8.

Далее:
Содержание

Показать полностью 13
5

101 игра на python. Полезные функции. read_text_file

Функция для чтения текстовых файлов предоставляет возможность чтения содержимого текстовых файлов, включая возможность чтения файлов из директорий, фильтрацию по расширению и гибкий формат возвращаемых данных. Она поддерживает чтение как отдельных файлов, так и всех файлов с определенными расширениями внутри директории (включая поддиректории).

Код

101 игра на python. Полезные функции. read_text_file Python, Утилиты, Программирование, Гайд

Аргументы

  • file_path (str | Path): Путь к файлу или директории, содержимое которой нужно прочитать. Может быть представлен строкой или объектом Path из модуля pathlib.

  • as_list (bool, optional): Флаг, определяющий формат возвращаемого значения. По умолчанию False, что означает, что содержимое будет возвращено в виде единой строки. Если установлено в True, то содержимое будет возвращено в виде списка строк.

  • extensions (list[str], optional): Список расширений файлов (например, [".txt", ".log"]), которые нужно читать, если указан путь к директории. Если None (по умолчанию), то будут читаться все файлы в директории.

  • exc_info (bool, optional): Флаг, определяющий, нужно ли включать подробную информацию об ошибке (трассировку стека) в лог, если во время чтения файла возникнет ошибка. По умолчанию True.

Возвращаемое значение

  • str: Содержимое файла (или содержимое всех файлов) в виде строки, если as_list равен False.

  • list[str]: Содержимое файла (или содержимое всех файлов) в виде списка строк, если as_list равен True.

  • None: В случае ошибки при чтении или если указан некорректный путь.

Код с примерами 👉 github

UPD:

Это упрощенный пример. На больших объемах данных он сожрет всю память. Позже я покажу асинхронный пример чтения / записи и с использованием пошагового генератора

Показать полностью 1
3

101 игра на python. Музыкальный калькулятор

Для тех, кто не любит много читать 👉 код здесь

В этом примере будут использоваться термины из музыки.

Термины

Звук.
Звук — это колебание воздуха, характеризующееся частотой, измеряемой в герцах (Гц). Чем выше частота, тем выше звук. Простыми словами: Звук — это то, что мы слышим, когда что-то вибрирует (например, струна гитары или голосовые связки). Чем быстрее вибрация, тем выше звук.

Нота.
Нота — это символ, обозначающий конкретный звук определённой высоты. В музыке используются ноты с названиями: C (до), D (ре), E (ми), F (фа), G (соль), A (ля), B (си). Простыми словами: Нота — это "имя" звука. Например, нота A4 — это звук с частотой 440 Гц.

Интервал.
Интервал — это расстояние между двумя нотами, выраженное отношением их частот. Например, октава — это интервал с соотношением частот 2:1, квинта — 3:2, кварта — 4:3. Простыми словами: Интервал — это "промежуток" между двумя нотами. Например, если вы играете ноту C (до) и затем ноту G (соль), интервал между ними называется квинтой.

Полутон.
Полутон — это наименьший интервал в западной музыкальной системе. Например, расстояние между нотами C (до) и C# (до-диез) — это полутон. Простыми словами: Полутон — это "маленький шаг" между нотами. Например, на гитаре один лад — это полутон. В восточных культурах используют микротональные системы, где интервалы меньше полутона. Это когда между нотами есть ещё более мелкие шаги, которые создают уникальное звучание, непривычное для западного уха.

Тон.
Тон — это интервал, равный двум полутонам. Например, расстояние между нотами C (до) и D (ре) — это тон. Простыми словами: Тон — это "большой шаг" между нотами. Например, на гитаре два лада — это тон.

Октава.
Октава — это интервал между двумя нотами, где частота верхней ноты ровно в два раза больше частоты нижней. Например, нота A4 имеет частоту 440 Гц, а нота A5 (на октаву выше) — 880 Гц. Простыми словами: Октава — это "расстояние" между двумя нотами с одинаковыми названиями, но разной высотой. Например, если вы поете ноту C (до) низким голосом, а потом ту же ноту C, но высоким голосом, то между ними будет октава.

Гамма.
Гамма — это последовательность нот, выстроенных в восходящем или нисходящем порядке. В западной музыке наиболее распространена диатоническая гамма, состоящая из 7 нот с комбинациями целых тонов и полутонов. Простыми словами: Гамма — это "лестница" из нот, которая помогает создавать мелодии. Например, мажорная гамма звучит весело и ярко, а минорная — грустно и задумчиво. Мажорная гамма строится по интервалам: тон-тон-полутон-тон-тон-тон-полутон. Например, гамма C мажор: C, D, E, F, G, A, B, C. Минорная гамма строится по интервалам: тон-полутон-тон-тон-полутон-тон-тон. Например, гамма A минор: A, B, C, D, E, F, G, A.


Калькулятор

Функция calculate_frequency вычисляет частоту любой ноты в хроматической гамме, зная её порядковый номер относительно A4 (где A4 это 0). Она использует экспоненциальную зависимость, основанную на степени двойки, которая в музыке описывает частотные отношения нот в хроматическом строе.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Функция calculate_interval_ratio вычисляет отношение частот между двумя нотами, представленными их номерами в хроматической гамме. Она всегда возвращает отношение так, чтобы в результате получается число больше 1, то есть частота более высокой ноты делится на частоту более низкой ноты, вне зависимости от порядка, в котором были переданы номера нот. Таким образом, функция определяет математическое значение интервала между двумя нотами.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Функция calculate_tempo_duration вычисляет общую продолжительность музыкального фрагмента в секундах, основываясь на темпе (который здесь не используется непосредственно), длительности одного удара в секундах и общем количестве ударов. Она делает это путем простого умножения длительности удара на их количество.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Функция calculate_note_duration вычисляет длительность ноты в секундах на основе темпа (в BPM) и относительной длительности ноты (например, 0.25 для четвертной ноты). Она использует темп для определения длительности одного удара, а затем умножает её на длительность ноты для получения длительности ноты в секундах.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Функция calculate_rhythm_pattern вычисляет общую продолжительность ритмического паттерна, заданного списком длительностей нот и длиной такта. Она перебирает длительности нот, умножает каждую на длину такта, и суммирует их. Результат представляет собой общую длительность паттерна в единицах целых нот.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Функция calculate_note_number вычисляет номер ноты в хроматической гамме на основе ее частоты. Она использует логарифм по основанию 2 для определения разницы в октавах между заданной нотой и эталонной нотой A4, а затем умножает это значение на 12, чтобы получить разницу в полутонах. Результат округляется до ближайшего целого числа, так как ноты нумеруются целыми числами.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Функция generate_scale_frequencies создает список частот нот, образующих заданную гамму. Она принимает номер корневой ноты, шаблон гаммы, где каждый элемент представляет собой интервал в полутонах, и эталонную частоту ноты A4. Функция перебирает интервалы в шаблоне, вычисляет частоту каждой ноты в гамме с помощью функции calculate_frequency и добавляет её в результирующий список, который затем и возвращает.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Функция calculate_tuning_deviation вычисляет отклонение фактической частоты от целевой в процентах. Она предназначена для определения того, насколько точно настроен музыкальный инструмент или звук. Она возвращает положительное значение, если фактическая частота выше целевой, и отрицательное, если ниже.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Функция get_note_name преобразует номер ноты в хроматической гамме (где A4 имеет номер 0) в её строковое представление, включая название ноты (A, A#, B, C, C# и т.д.) и номер октавы. Она использует список названий нот и вычисляет октаву и индекс ноты в пределах октавы на основе номера ноты.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Функция get_note_info_from_freq принимает частоту ноты в герцах и выводит информацию о ноте, включая её частоту, название и номер в хроматической гамме. Она использует функции calculate_note_number и get_note_name для получения этой информации. Она предоставляет удобный способ узнать, какой ноте соответствует заданная частота.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Функция tune_instrument имитирует работу тюнера для музыкального инструмента. Она принимает целевую и фактическую частоты и, используя calculate_tuning_deviation, определяет, насколько фактическая частота отклоняется от целевой. На основе величины и знака отклонения, функция выводит пользователю сообщение с указанием, нужно ли повысить, понизить или не трогать настройку инструмента.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Функция note_name_to_number преобразует строковое представление имени ноты (например, "A4", "C#5", "Bb3") в ее числовой номер в хроматической гамме, где A4 имеет номер 0. Она использует регулярное выражение для разбора строки, находит индекс ноты в списке названий нот, вычисляет разницу октав и преобразует все это в целое число. Если формат имени ноты не соответствует ожидаемому, функция возвращает None.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Функция find_nearest_notes принимает частоту ноты и возвращает названия двух ближайших нот в хроматической гамме: нижней (той, у которой частота ниже заданной) и верхней (той, у которой частота выше заданной). Она использует формулу частоты ноты, а также функции math.floor, math.ceil и get_note_name для выполнения своей задачи.

101 игра на python. Музыкальный калькулятор Гайд, Программирование, Длиннопост

Все примеры можно запустить в блокноте

Удачи!

Показать полностью 13
6

101 Игра на python. HELLO

101 Игра на python. HELLO Программирование, Программа, Инструкция, Python

(us.archive.org)

Начало здесь: 👉Предисловие
Содержание

Сегодняшний репозиторий

Дисклеймер: Ссылки на статьи будут появляться по мере публикаций. Подпишись, чтобы быть в курсе

Здесь я рассматриваю код игры HELLO. Это одна из самых простых программ, которая демонстрирует базовые команды Python. Программа выводит приветствие пользователю.

К сожалению на пикабу нет редактора кода, поэтому ссылка
Как работает программа:

1. Программа выводит приветствие.
2. Запрашивает у пользователя его имя.
3. Выводит персонализированное приветствие, используя введённое имя.
4. Завершает работу с дополнительным сообщением.

Пояснения к коду

print() – Функция для вывода текста на экран. В данном случае используется для приветствия пользователя.

input() – Функция для получения данных от пользователя. В данном случае запрашивается имя.

f-строки – Используются для подстановки переменных в строку. Например, `{name}` подставляет значение переменной `name`.

Переменная `name`– Хранит имя, введённое пользователем.


Код можно запустить в google colab
Для запуска кода нажми

101 Игра на python. HELLO Программирование, Программа, Инструкция, Python

к списку игр
к началу серии

Следующий репозиторий:

Задай вопрос модели AI
Задать вопрос модели можно в Google colab

Показать полностью 1
9

101 Игра на python. Задай вопрос модели AI (gemini)

101 Игра на python. Задай вопрос модели AI (gemini) Программа, Гайд, Программирование, Инструкция, Python, Gemini, Информатика, Длиннопост

В этом посте я покажу как написать элементарный код для общения с моделью Gemini

Начало здесь: 👉Предисловие
Список игр

Сегодняшний репозиторий

Дисклеймер: Ссылки на статьи будут появляться по мере публикаций. Подпишись, чтобы быть в курсе

В прошлом посте я показал простой пример для начинающих изучать python. Как во всех учебниках программирования я начал с Hello, World!. В ней главный акцент я поставил не на коде, а на комментариях. Не ленись писать комментарии. Не надейся на свою память. С ростом сложности кода ты обязательно забудешь, что писал на прошлой неделе или месяц назад. Твой код кто-то будет читать. Хорошо задокументированный код читается как приключенческий роман. Плохо задокументированный код, с непонятными именами переменных и функций, с запутанной логикой сразу хочется выбросить в помойку.


Современный мир программирования невозможно представить без искусственного интеллекта. В этом примере я покажу, как легко можно интегрировать AI в свои проекты и использовать его для обучения.
К сожалению на пикабу нет редактора кода, поэтому ссылка.

Я использую модель gemini для интерактивного общения. Выбор остановился на Gemini, в силу того, что у него есть бесплатный лимит, что хорошо для того, чтобы просто попробовать. По своему опыту скажу, что бесплатного тарифа мне вполне хватает для ежедневной комфортной разработки. Тебе понадобится ключ API. Создать его ты можешь здесь. Если не получается, спроси меня в комментариях, а пока можешь воспользоваться этим:

AIzaSyCprZ9Tr-rB_xFau5zgWsKPM_6W-FmUntk

Я даю этот ключ для обучения коду, не перегружай его запросами.

Я не сильно заморачиваюсь с приватностью ключа. Моя цель показать простоту написания кода связанного с моделями AI. Тема хранения ключей, паролей, прав доступа — отдельный разговор, стоящий самостоятельной статьи. Здесь же я ввел понятие класса.


Как устроен код.

импортируем библиотеку `google.generativeai`, которая предоставляет интерфейс для взаимодействия с моделями Google AI.

Класс GoogleGenerativeAI. Этот класс инкапсулирует *) всю логику взаимодействия с моделью Gemini. Он принимает API-ключ и имя модели в качестве параметров. По умолчанию используется модель `gemini-2.0-flash-exp`.

Метод **) __init__ В этом методе происходит настройка модели. Мы передаем API-ключ и имя модели, а затем инициализируем объект модели.

Метод ask Этот метод отправляет текстовый запрос модели и возвращает ответ. Если что-то пойдет не так, метод вернет сообщение об ошибке.
*) — Обертка. Как фантик для конфеты. Все функции и переменные я сложил и завернул в конфету.
**) — Функции внутри класса принято называть методами, а переменные свойствами. Сути это не меняет.

Как использовать?

  1. Ввод API-ключа: Сначала программа запрашивает у пользователя API-ключ для доступа к модели Gemini. Этот ключ можно получить на сайте Google AI Studio.

  2. Создание объекта модели: Мы создаем объект класса GoogleGenerativeAI, передавая ему API-ключ.

  3. Ввод вопроса: Пользователь вводит свой вопрос, который хочет задать модели.

  4. Получение ответа: Программа отправляет вопрос модели и выводит ответ на экран.

Запустить код можно в google colab. Для запуска программы нажми SHIFT+ENTER на ячейке кода или нажми на знак ► вверху ячейки



Если ты хочешь запустить код на своей машине, потребуются зависимости:
pip install google
pip install google-generativeai
pip install google-api-python-client



Следующие посты, где я работаю с моделью gemini
Анаграмма и искусственный интеллект - создаём инструкцию для модели
gemini меняет поведение. меняем поведение модели во время исполнения программы

Показать полностью 1
7

101 игра на Python. Простой баннер

101 игра на Python. Простой баннер Python, Гайд, Программирование, Инструкция, Программа, Длиннопост

Продолжаю портировать игры из книги 101 Basic Computer Games

Начало здесь: 👉Предисловие
Список игр

Сегодняшний репозиторий

Дисклеймер: Ссылки на статьи будут появляться по мере публикаций. Подпишись, чтобы быть в курсе

Игра Banner: создание текстового баннера

101 игра на Python. Простой баннер Python, Гайд, Программирование, Инструкция, Программа, Длиннопост

Программа демонстрирует базовые принципы работы с функциями, вводом-выводом и условными операторами в Python.



Как работает программа

Программа состоит из двух основных частей:

1. Функция `create_banner(text)` – отвечает за создание и вывод текстового баннера.

2. Основная часть программы – взаимодействие с пользователем: приветствие, запрос текста и проверка ввода.

Описание работы кода

1. Функция `create_banner(text)`

  • Принимает:
    - строку `text` – текст, который нужно преобразовать в баннер.

  • Выполняет:
    - Вычисляет ширину баннера, добавляя 4 символа для рамки (`*` и пробелы).
    - Выводит верхнюю и нижнюю границы баннера с помощью символа `*`.
    - Выводит текст, окружённый рамкой.

2. Основная часть программы

- Приветствует пользователя и объясняет, что делает программа.

- Запрашивает у пользователя текст для создания баннера.

- Проверяет, что текст не пустой:

- Если пользователь ввёл пустую строку, программа сообщает об ошибке и предлагает попробовать снова.

- Если текст введён, программа выводит созданный баннер.


Пример работы программы

Если пользователь ввёл текст `"Привет"`, программа выведет:

```
************
* Привет *
************

```

Запустить код можно в Google Colab

Предыдущие игры:
HELLO
Задай вопрос модели AI (gemini)
ИИ создает анаграммы из букв

Показать полностью 1
5

101 игра на python. Анаграмма и искусственный интеллект

101 игра на python. Анаграмма и искусственный интеллект Программа, Программирование, Python, Искусственный интеллект, IT, Длиннопост

Этот пост — продолжение сборника простых программ для начинающих изучать python

Начало здесь: 👉Предисловие
Содержание

В прошлом посте я показал как подключиться к модели AI Gemini.
Сегодня я расширю функциональность и добавлю системную инструкцию модели, чтобы она понимала смысл игры.

Генератор анаграмм с использованием Google Gemini

В этой программе я создаю простую системную инструкцию для модели gemini. Модель будет играть по правилам из инструкции.
Текст инструкции:
"""

Ты — генератор анаграмм. Твоя задача — по заданному набору букв найти существующее слово русского языка, составленное из этих букв (используя все или часть из них).
Правила:
1. Игнорируй любые символы, кроме русских букв. Цифры и другие символы не учитываются.

2. Если из заданных букв можно составить несколько слов, верни одно из них.

3. Если из заданных букв невозможно составить ни одного слова русского языка, верни ответ "Нет анаграмм".

4. Не генерируй неологизмы или выдуманные слова. Используй только существующие слова русского языка.

5. Не объясняй процесс, просто возвращай слово или "Нет анаграмм".

"""


Описание

Программа принимает на вход набор русских букв и пытается найти существующее слово русского языка, составленное из этих букв (используя все или часть из них).

Правила анаграмм

  • Используются только существующие слова русского языка.

  • При поиске анаграмм учитываются только русские буквы. Цифры и другие символы игнорируются.

  • Если возможно составить несколько слов, возвращается одно из них.

  • Если из заданных букв нельзя составить ни одного слова, возвращается сообщение "Нет анаграмм".

Сегодняшний репозиторий
К сожалению на пикабу нет редактора кода, поэтому ссылка

Пояснение кода генератора анаграмм с использованием Google Gemini

1. Импорт библиотек:

  • google.generativeai: Для работы с Gemini.

  • re: Для обработки текста (очистка ввода).

2. Класс GoogleGenerativeAI:

  • __init__: Создает объект для работы с Gemini, сохраняет API-ключ и инструкцию.

  • ask: Отправляет запрос Gemini и получает ответ. try...except обрабатывает возможные ошибки.

3. system_instruction (Инструкция для Gemini):

  • Самая важная часть. Объясняет Gemini, что нужно делать:

    • Находить слова из заданных букв.

    • Игнорировать не-буквы (цифры, символы).

    • Возвращать "Нет анаграмм", если слов нет.

    • Использовать только существующие слова.

    • Не давать объяснений, только слово или "Нет анаграмм".

4. Запрос API-ключа:

  • API_KEY = input(...): Запрашивает у пользователя API-ключ.

5. Создание объекта модели:

  • model = GoogleGenerativeAI(...): Создает объект для работы с Gemini, используя API-ключ и инструкцию.

6. Основной цикл программы:

  • while True: Бесконечный цикл для ввода запросов.

  • q = input(...): Запрашивает у пользователя буквы.

  • q = re.sub(...): Очищает ввод от не-букв.

  • if not q: Проверяет, не пустой ли ввод после очистки.

  • response = model.ask(q): Отправляет запрос Gemini.

  • print(response): Выводит ответ.

Ключевые моменты:

  • system_instruction определяет поведение Gemini.

  • re.sub очищает ввод, чтобы Gemini получал корректные данные.

  • try...except обрабатывает ошибки.

Запустить код в google colab. Для запуска программы нажми SHIFT+ENTER на ячейке кода или нажми на знак ► вверху ячейки
Если ты хочешь запустить код на своей машине, потребуются зависимости:
pip install google
pip install google-generativeai
pip install google-api-python-client

Начало серии

Другие игры

Показать полностью 1
14

101 игра на python. Виселица. Игра в слова

101 игра на python. Виселица. Игра в слова Программа, Гайд, Программирование, Игра в слова, Длиннопост, Python, Яндекс Дзен (ссылка)

Статья из серии 101 игра на python. В серии я публикую разбор кода учебного репозитория для делающих первые шаги в разработке на python и просто любителей хорошего кода. В репозитории находится сборник программ игр, написанных лёгким языком, по которым ты можешь изучать код.


Игра "Виселица" - это игра в слова, где один игрок (или компьютер) загадывает слово, а другой игрок пытается его отгадать по буквам.

За каждую неправильную букву игрок получает штраф в виде части рисунка виселицы. Если рисунок завершен, игрок проигрывает.

Правила игры:
1. Компьютер выбирает случайное слово из заранее определенного списка.
2. Игрок видит слово, представленное прочерками (по одной на каждую букву).
3. Игрок пытается отгадать слово, вводя буквы.
4. Если введенная буква есть в слове, она отображается на своих местах.
5. Если введенной буквы нет в слове, игрок получает штраф.
6. Игра продолжается до тех пор, пока игрок не угадает слово или не исчерпает лимит штрафов.


Алгоритм


1. Инициализировать массив слов, которые может загадать компьютер.
2. Выбрать случайное слово из массива.
3. Создать строку `GUESS$` , состоящую из прочерков, по длине загаданного слова.
4. Инициализировать число ошибок, равное 0.
5. Начать цикл "пока слово не отгадано и количество ошибок меньше 6":
5.1 Запросить ввод буквы от игрока.
5.2 Если введенная буква есть в загаданном слове
5.2.1 Обновить строку `GUESS$` , показав букву на всех ее позициях в слове.
5.2.2 Если все буквы отгаданы, перейти к шагу 6.
5.3 Иначе
5.3.1 Увеличить число ошибок на 1.
5.3.2 Показать изображение виселицы, соответствующее текущему количеству ошибок
5.4 Если число ошибок равно 6, перейти к шагу 7.
6. Вывести сообщение "YOU GOT IT!", затем загаданное слово, и перейти к шагу 8.
7. Вывести сообщение "SORRY, YOU DIDN'T GET IT.", затем загаданное слово, и перейти к шагу 8.
8. Конец игры.

Блок-схема

101 игра на python. Виселица. Игра в слова Программа, Гайд, Программирование, Игра в слова, Длиннопост, Python, Яндекс Дзен (ссылка)

Legenda:

- Start - Начало игры.
- InitializeWords - Инициализация списка слов для выбора.
- ChooseWord - Выбор случайного слова из списка.
- CreateGuessString - Создание строки `guessString` из прочерков, соответствующей длине загаданного слова.
- InitializeErrors - Инициализация счетчика ошибок `numberOfErrors` в 0.
- LoopStart - Начало цикла, который продолжается, пока слово не угадано и количество ошибок меньше 6.
- InputLetter - Запрос у пользователя ввода буквы и сохранение ее в `userLetter`.
- CheckLetter - Проверка, есть ли введенная буква `userLetter` в загаданном слове `targetWord`.
- UpdateGuessString - Обновление строки `guessString`, показывая введенную букву на ее местах.
- CheckWin - Проверка, угадано ли слово (т.е. `guessString` равен `targetWord`).
- OutputWin - Вывод сообщения о победе "YOU GOT IT!" и загаданного слова.
- End - Конец игры.
- IncreaseErrors - Увеличение счетчика ошибок `numberOfErrors` на 1.
- DrawHangman - Отображение текущего состояния виселицы в зависимости от количества ошибок.
- CheckLose - Проверка, достигло ли количество ошибок `numberOfErrors` значения 6.
- OutputLose - Вывод сообщения о проигрыше "SORRY, YOU DIDN'T GET IT." и загаданного слова.


Код.

список слов

101 игра на python. Виселица. Игра в слова Программа, Гайд, Программирование, Игра в слова, Длиннопост, Python, Яндекс Дзен (ссылка)


список состояний виселицы

101 игра на python. Виселица. Игра в слова Программа, Гайд, Программирование, Игра в слова, Длиннопост, Python, Яндекс Дзен (ссылка)

Основная логика

101 игра на python. Виселица. Игра в слова Программа, Гайд, Программирование, Игра в слова, Длиннопост, Python, Яндекс Дзен (ссылка)

Разбор кода:

1. Импорт модуля `random`
- `import random`: Импортирует модуль random для случайного выбора слова.


2. Список слов `WORDS`: Список, содержащий слова, из которых компьютер выбирает слово для игры.


3. Функция `draw_hangman(errors)`
- Отображает состояние виселицы в зависимости от количества ошибок, используя ASCII-арт.
- `hangman_stages` - массив строк, представляющих стадии виселицы.
- `print(hangman_stages[errors])` - выводит на экран соответсвующую строку.


4. Функция `play_hangman()`:
- Выбор слова:
- `target_word = random.choice(WORDS).upper()`: Случайно выбирает слово из списка `WORDS` и переводит его в верхний регистр.


- Создание строки для отгадывания:
- `guess_string = "_" * len(target_word)`: Создает строку, состоящую из прочерков, длина которой соответствует длине загаданного слова.


- Инициализация счетчика ошибок:
- `number_of_errors = 0`: Устанавливает начальное количество ошибок в 0.


- Основной цикл игры `while number_of_errors < 6 and "_" in guess_string:
- Цикл продолжается, пока количество ошибок меньше 6 и в строке `guess_string` есть прочерки (т.е. пока слово не угадано и не исчерпан лимит ошибок).
- `print("Слово:", guess_string)`: Выводит текущее состояние слова с угаданными буквами и прочерками.
- `user_letter = input("Введите букву: ").upper()`: Запрашивает у пользователя ввод буквы и переводит ее в верхний регистр.


- Проверка наличия буквы в слове:
- `if user_letter in target_word:`: Проверяет, есть ли введенная буква в загаданном слове.


- Если буква есть:
- `new_guess_string = ""`: Создает пустую строку `new_guess_string` для сборки нового варианта отгадываемого слова.
- Цикл `for i in range(len(target_word))` перебирает все символы в загаданном слове.
- Если текущая буква в загаданном слове совпадает с введенной буквой `user_letter`, то добавляет ее в `new_guess_string`, иначе, добавляет символ с текущей позиции из `guess_string`.
- `guess_string = new_guess_string`: Обновляет `guess_string` новым вариантом с угаданными буквами.
- `if guess_string == target_word:`: Проверяет, угадано ли слово.
- `print("ПОЗДРАВЛЯЮ! Вы угадали слово:", target_word)`: Выводит поздравление и загаданное слово.
- `return`: Завершает функцию (игру).


- Если буквы нет в слове:
- `number_of_errors += 1`: Увеличивает счетчик ошибок на 1.
- `draw_hangman(number_of_errors)`: Вызывает функцию `draw_hangman` для отображения виселицы.


- Проверка на проигрыш:
- `if number_of_errors == 6:`: Проверяет, равно ли количество ошибок 6.
- `print("СОЖАЛЕЮ, вы не отгадали слово. Загаданное слово:", target_word)`: Выводит сообщение о проигрыше и загаданное слово.


5. Запуск игры:
- `if __name__ == "__main__":`: Этот блок гарантирует, что функция `play_hangman()` будет запущена, только если файл исполняется напрямую, а не импортируется как модуль.
- `play_hangman()`: Вызывает функцию для начала игры.

Репозиторий
Код
Запустить эту программу ты можешь в google colab

Посмотри и другие статьи

Удачи!

Показать полностью 5
Отличная работа, все прочитано!