Как сделать камень ножницы бумага паскаль
На этом уроке мы создадим игру "Камень, ножницы, бумага" с помощью Python.
Играя с компьютером, вы по очереди будете делать ход (выбирать камень, ножницы или бумагу) и программа будет сообщать, кто из вас выиграл.
Давайте вспомним правила:
- камень притупляет ножницы
- бумага накрывает камень
- ножницы режут бумагу.
Дождитесь появления окна с заголовком Trinket (это может занять некоторое время), и нажмите на кнопку Run, чтобы запустить выполнение программы.
Введите с клавиатуры одну из букв: к (камень), н (ножницы) или б (бумага) и нажмите Enter на клавиатуре, чтобы сделать свой ход, после чего ход сделает компьютер, и вы увидите результат раунда.
- создавать программы с разветвляющимися алгоритмами;
- использовать условный оператор if. elif. else
Напишем код, который позволит запомнить ход игрока и выдаст ход компьютера. Следуйте инструкции ниже.
Урок 2.1
Сделаем так, чтобы вывод ходов игрока и компьютера отображался в одинаковом формате и на одной строке. О том, как это сделать, читайте в следующей инструкции.
Урок 2.2
А теперь сделаем так, чтобы программа выдавала результат игры: сообщала нам кто победил - игрок или компьютер. Читайте инструкции и дополняйте свой код.
Урок 2.3
Как хорошо вы разобрались с условным оператором? Запомнили ли вы, как используется генератор случайных чисел? Сейчас проверим! Если вы справитесь со всеми испытаниями, то получите ссылку на дополнение, которое поможет вам прокачать свою игру.
Для ответа на вопрос викторины выберите вариант ответа и нажмите на голубую кнопку с изображением галочки в правом нижнем углу. Если ответ был дан правильно, на ее месте появится кнопка с изображением стрелки - нажмите на нее, чтобы перейти к следующему вопросу.
Расскажите как реализовать. Теоретически, код уже сам напишу. Как написать игру с роботом - знаю сам. А вот как реализовать 1-to-1 - непонимаю. Объясните пожалуйста.
2 ответа 2
- Делаете систему авторизации, например, с помощью сессий.
- Подключаете источник хранения данных, например БД (даже если вам не нужно сохранять результаты игр, сессия, к сожалению, не подойдет).
- Начало игры инициирует создание новой записи в БД с указанием вовлеченных игроков.
- После этого оба игрока могут просматривать ход игры на странице с известным им идентификатором игры (незавершенные игры, в которых участвует игрок, могут представляться, например, сразу после авторизации игрока).
- Для отображения текущего состояния можно производить периодические AJAX-запросы.
- Нажатие игроком нужной кнопки хода (камень, ножницы или бумага) приводит к обновлению записи игры, таким образом, следующий AJAX-запрос другого игрока покажет обновленное состояние (мол, "второй походил, ждем тебя").
- После указания обоих ходов, игра завершается, тот самый AJAX-запрос может, например, привести к редиректу на статическую (в том плане, что без AJAXa) страницу с результатом.
Есть два игрока. В самом простом случае будем использовать две переменные. $player1 , $player2 . Есть массив в котором хранятся все элементы игры - камень, ножницы, бумага и т.д. - $elements = ['камень','ножницы','бумага'] или ассоциативный массив, где будете присваивать определенный индекс, как числовой так и не числовой. Потом каждой переменной, т.е. игроку, присваиваем элемент из массива, который выбирается произвольно с помощью mt_rand и потом эти переменные сравниваются. Ну и еще нужно учесть приоритет элементов, т.е. камень может разбить ножницы, бумага может обернуть камень, а ножницы могут разрезать бумагу.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками алгоритм php или задайте свой вопрос.
Похожие
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2022 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2022.1.26.41266
Следуя этому руководству, вы:
Скорее всего, вы уже играли в эту игру. Возможно, с ее помощью вы решали, кто заплатит за ужин, или использовали ее для жеребьевки.
- камень бьет ножницы
- бумага оборачивает камень
- ножницы режут бумагу.
Теперь вы знакомы с правилами — пора подумать, как преобразовать их в код на Python!
Имея описание игры и ее правила, можно создать аналогичную компьютерную игру. Перед погружением в процесс мы импортируем модуль, который будет имитировать вашего противника — им станет компьютер:
Отлично! Теперь вы сможете использовать методы модуля random, чтобы имитировать противника. Что дальше? Так как пользователям нужно тоже иметь возможность совершать какие-то действия, нам нужно реализовать пользовательский ввод.
Ввод пользовательских данных
Ввод пользовательских данных в Python довольно прост. Он нужно для того, чтобы пользователь сделал выбор действия. После этого выбор записывается в переменную.
Пользователь получает предложение выбрать, после чего его вариант сохраняется в переменной. Пользователь сделал свой ход — теперь очередь компьютера.
Подключаем к игре компьютер
Это позволяет выбрать случайный элемент из списка действий. Также вы можете вывести в консоль варианты, которые сделали пользователь и компьютер:
Вывод этой информации в консоль может быть полезным пользователю. К тому же, вы ее можете использовать использовать для отладки. Вдруг что-то пойдет не так?
Определяем победителя
Оба игрока сделали свой ход — осталось выбрать победителя. Сделать это можно с помощью блока if-elif-else . Именно это позволит вам сравнить фигуры игроков и определить победителя:
Вы написали код, в котором реализован ввод данных пользователя, выбор случайного действия компьютера и, наконец, определение победителя. Но эта программа закончит свою работу после первой же партии.
Играем несколько партий подряд
В приведенном выше коде оставлены комментарии, обращающие ваше внимание на определенные строки. Давайте их разберем.
Очень важно проверить, не хочет ли пользователь сыграть еще одну партию. И, конечно же, закрыть игру, если пользователь наигрался. Без этой проверки пользователь будет вынужден играть до тех пор, пока он не закроет консоль вручную — с помощью Ctrl+C.
Проверка осуществляется с помощью строки “д” . Но это может вызвать у пользователя трудности — вдруг он введет “да” или “нет” . Проверка строки — дело хитрое, ведь вы никогда точно не узнаете, что пользователь может ввести в консоль. Например, трудно предугадать, в каком регистре будут буквы.
Пример сравнения нескольких строк:
Хмм… это не совсем то, что нам нужно. Будет грустно, если пользователь введет “да” , а его выкинет из игры.
Использование enum.IntEnum для хранения действий
Сравнение строк, как вы могли заметить, может вызвать проблемы. Именно поэтому нам нужно постараться этого избежать. Но ведь первое, что спрашивает программа, — это строка! А что, если пользователь введет “Камень” или “кАмень”? Регистр — это очень важно:
Поскольку регистр имеет значение, то “к” и “К” — не одно и то же. Одно из возможных решений — использование чисел. Привязка каждой фигуры к числу может уберечь вас от множества проблем:
Сравнение целых чисел не вызывает тех же проблем, так что возьмем это решение на вооружение. Теперь наш пользователь будет вводить числа, а сравнивать мы будем два значения:
Но input() возвращает строку! Нам нужно привести введенное значение в целочисленный тип с помощью int() . Работает это хорошо, но нужно объявлять переменные с осторожностью: иначе сравнение будет затруднительно. В данном случае для объявления класса с действиями лучше всего использовать enum.IntEnum .
С помощью enum.IntEnum вы можете создать атрибуты и связать с ними какое-либо значение — точно так же, как в примере выше. Так вы сгруппируете все действия в их собственных пространствах имен, в результате чего код станет чище и приятнее на вид.
Мы создали класс Action , в котором описали все действия. То есть, привязали каждое действие к числу.
Сравнение все еще очень простое — но сейчас у нас есть класс, связанный с действиями:
Так как значения одинаковы, результатом будет True . Имена, которые мы использовали, делают сравнение еще более очевидным.
Action можно использовать даже с int :
Action проверяет значение, которое мы передали, и возвращает соответствующее действие. Это полезно, ведь мы теперь можем принимать от пользователя даже целые числа и сопоставлять их с соответствующими действиями. Никаких беспокойств!
Блок-схема вашей программы
Блок-схемы не должны быть слишком сложными, а тем более включать в себя код. В них должно содержаться лишь желаемое поведение программы — это-то и должно помочь решить проблемы еще до их возникновения.
Каждый пользователь выбирает действие, а затем определяется победитель. Эта блок-схема описывает партию лишь в том виде, в котором мы ее запрограммировали. С реальной игрой она не имеет ничего общего. В реальной жизни игроки выбирают действия одновременно, а не по очереди, как показано на этой блок-схеме.
В программе, однако, все честно: выбор компьютера скрыт от пользователя и наоборот. Два игрока могут делать свой выбор в любое время — это никак не нарушает правил.
Блок-схемы помогают отслеживать ошибки еще до их возникновения. Их польза также заключается в том, что на этапе проектирования программы вы можете при необходимости расширить функционал. Ниже приведен пример блок-схемы, описывающей игру, которая не остановится до тех пор, пока пользователь этого не захочет:
Разбиваем код на функции
Создавать отдельную функцию для проверки, хочет ли пользователь сыграть снова, необязательно, но это не будет лишним. Начать можно с импорта random, если вы этого до сих пор не сделали, и объявления класса Action :
Надеемся, выглядит знакомо. А теперь приступим к функции get_user_selection() , которая не принимает никаких аргументов и возвращает Action :
Вместо этого можно использовать генераторы списков:
Теперь мы можем не беспокоиться о том, что в будущем придется добавлять или убирать какие-то действия.
Давайте проверим, как это работает! Сначала программа запрашивает ввод у пользователя, а потом возвращает выбранное им действие.
Теперь нужно написать функцию, в которой компьютер будет делать свой выбор. По аналогии с get_user_selection() , эта функция не принимает аргументов и возвращает Action. Так как диапазон значений выбора от 0 до 2, выбирать случайные значения мы будем из этого промежутка. В этом нам поможет random.randint() .
random.randint() возвращает случайное значение из заданного диапазона. С помощью len() можно очень легко определить верхнюю границу:
Поскольку значения начинаются с 0, а счет len() — с 1, следует вычесть единицу из len(Action) .
Если вы запустите этот кусочек кода, то приглашения к вводу не будет. Эта функция лишь вернет действие, связанное со случайным числом:
Неплохо! Теперь нам нужно определить победителя. Эта функция принимает два аргумента — выбор пользователя и компьютера. Она не должна ничего возвращать, от нее нужен лишь вывод результата сравнения в консоль:
Эта функция очень похожа на то, что мы писали раньше. Но сейчас нам не нужно беспокоиться из-за капризных строк — сравнение происходит напрямую.
Можем передать в эту функцию разные аргументы и посмотреть на результат:
Что произойдет, если пользователь введет 3 ? Ведь самое больше объявленное число это 2 :
Упс! Вы точно не хотите, чтобы это произошло. Вернемся к блок-схеме. Куда мы можем добавить логику, проверяющую правильность ввода?
Логичным будет проверить это сразу после ввода пользователя:
Если пользователь введет число, выходящее за пределы указанного диапазона, мы просто повторим 1 шаг. Единственное требование для пользователя — число должно быть от 0 до 2 включительно. Если ввод пользователя выходит за эти пределы, возбуждается исключение ValueError . Чтобы этого избежать, исключение нужно обработать.
Итак, мы объявили функции, которые отражают все шаги из блок-схемы. Логика теперь гораздо компактнее. Теперь все, что включает в себя цикл while , это:
Выглядит гораздо лучше, не так ли? Заметьте, что программа продолжает работу, даже если пользователь вводит некорректное число.
> Первым делом создаем локальные переменные:
%ходчел% = *тут ничего не пишем* (Предмет человека)
%ходбот% = *тут ничего не пишем* (Предмет бота)
%баланс% = 0 (если есть не создаем, баланс человека)
%кнмбот% = *тут ничего не пишем* (Для рандомного предмета у бота)
1. Показать кнопки
Скрин ниже
1. Установить переменную:
%ходчел% = Камень
Вы выбрали - %ходчел%
Ожидаем ход бота!
3. Переход в блок: КНБ2
1. Установить переменную:
%ходчел% = Ножницы
Вы выбрали - %ходчел%
Ожидаем ход бота!
3. Переход в блок: КНБ2
1. Установить переменную:
%ходчел% = Камень
Вы выбрали - %ходчел%
Ожидаем ход бота!
3. Переход в блок: КНБ2
Создаем блок КНБ2
1. Установить переменную:
%кнмбот% = %ранд(1, 3)%
Если %нмбот% равно 1, то:
1. Установить переменную:
%ходбот% = Камень
2. Переход в блок: КНБ3
Если %нмбот% равно 2, то:
1. Установить переменную:
%ходбот% = Ножницы
2. Переход в блок: КНБ3
Если %нмбот% равно 3, то:
1. Установить переменную:
%ходбот% = Бумага
2. Переход в блок: КНБ3
1. Создаем блок КНБ3
Если %ходбот% равно Камень
И %ходчел% равно Бумага, то:
Твой ход: %ходчел%
Ход бота: %ходбот%
2. Установить переменную:
%баланс% = %баланс% + 20
3. Выйти из цепочки
Если %ходбот% равно Ножницы
И %ходчел% равно Камень, то:
Твой ход: %ходчел%
Ход бота: %ходбот%
2. Установить переменную:
%баланс% = %баланс% + 20
3. Выйти из цепочки
Если %ходбот% равно Бумага
И %ходчел% равно Ножницы, то:
Слайды и текст этой презентации
Руководитель: Санакоева И.С.,
учитель информатики и ИКТ
Как я познакомилась с микрокомпьютером
Томас Курц и Джон Кемени.
Создатели языка Бейсик.
Никлаус Вирт.
Создатель языка Паскаль.
Бумага, камень и ножницы (поиск ошибок в программе)
ПОИСК ОШИБОК В ПРОГРАММЕ
CLS:C=0:RANDOMIZE TIMER
C=0
A=0
10: F=0
R=INT (RND*4+1)
IF R=1 THEN C$ = “БУМАГА”
IF R=2 THEN C$ = “КАМЕНЬ”
IF R=3 THEN C$ = “НОЖНИЦЫ”
PRINT “Я ГОТОВ”
PRINT “ЧТО ВЫ ВЫБИРАЕТЕ – БУМАГУ, КАМЕНЬ ИЛИ НОЖНИЦЫ”
INPUT A$
PRINT
IF C$= “БУМАГА” AND A$ = “НОЖНИЦЫ” THEN F=1
IF C$ = “КАМЕНЬ” AND A$=”БУМАГА” THEN F=1
IF A$=”НОЖНИЦЫ” AND A$ = “КАМЕНЬ” THEN F=1
IF C$=A$ THEN F=2
PRINT ”ВЫ ВЫБРАЛИ”; A$
PRINT “Я ВЫБРАЛ” ; B$
PRINT “ПОЭТОМУ”
IF F=0 THEN PRINT “Я ВЫИГРАЛ”
IF F=F THEN PRINT “ВЫ ВЫИГРАЛИ”
IF F=2 THEN PRINT “ПОЛУЧИЛАСЬ НИЧЬЯ”
IF F=0 THEN A=A+1
IF F=1 THEN C=C+1
PRINT “СЧЕТ ОЧКОВ”
PRINT “У МЕНЯ: ”;Y
PRINT “У ВАС: ”;A
IF C>10 AND A>10 THEN GOTO 10
PRINT “КОНЕЦ ИГРЫ”
Определяем случайное число из промежутка от 1 до 3. Следовательно,
R= INT(RND*2+1).
Должно быть
IF C$=“НОЖНИЦЫ” …
Если F=0, то выиграл компьютер и подсчет очков ведётся в переменной С.
Если F=1, то выиграл игрок и подсчет очков ведётся в переменной А.
У компьютера С очков.
Возврат к 10 строке нужно производить если у игроков очков меньше 10.
IF C
Программа без ошибок
CLS:RANDOMIZE TIMER
C=0
A=0
10: F=0
R=INT (RND*2+1)
IF R=1 THEN C$ = “БУМАГА”
IF R=2 THEN C$ = “КАМЕНЬ”
IF R=3 THEN C$ = “НОЖНИЦЫ”
PRINT “Я ГОТОВ”
PRINT “ЧТО ВЫ ВЫБИРАЕТЕ – БУМАГУ, КАМЕНЬ ИЛИ НОЖНИЦЫ”
INPUT A$
PRINT
IF C$= “БУМАГА” AND A$ = “НОЖНИЦЫ” THEN F=1
IF C$ = “КАМЕНЬ” AND A$=”БУМАГА” THEN F=1
IF C$ =”НОЖНИЦЫ” AND A$ = “КАМЕНЬ” THEN F=1
IF C$=A$ THEN F=2
PRINT ”ВЫ ВЫБРАЛИ”; A$
PRINT “Я ВЫБРАЛ” ; C$
PRINT “ПОЭТОМУ”
IF F=0 THEN PRINT “Я ВЫИГРАЛ”
IF F=1 THEN PRINT “ВЫ ВЫИГРАЛИ”
IF F=2 THEN PRINT “ПОЛУЧИЛАСЬ НИЧЬЯ”
IF F=0 THEN C=C+1
IF F=1 THEN A=A+1
PRINT “СЧЕТ ОЧКОВ”
PRINT “У МЕНЯ: ”; С
PRINT “У ВАС: ”;A
IF C
Сопоставим операторам языка Бейсик операторы языка Паскаль.
CLS:RANDOMIZE TIMER
C=0
A=0
10: F=0
R=INT (RND*2+1)
IF R=1 THEN C$ = “БУМАГА”
IF R=2 THEN C$ = “КАМЕНЬ”
IF R=3 THEN C$ = “НОЖНИЦЫ”
PRINT “Я ГОТОВ”
PRINT “ЧТО ВЫ ВЫБИРАЕТЕ – БУМАГУ, КАМЕНЬ ИЛИ НОЖНИЦЫ”
INPUT A$
PRINT
IF C$= “БУМАГА” AND A$ = “НОЖНИЦЫ” THEN F=1
IF C$ = “КАМЕНЬ” AND A$=”БУМАГА” THEN F=1
IF C$ =”НОЖНИЦЫ” AND A$ = “КАМЕНЬ” THEN F=1
IF C$=A$ THEN F=2
PRINT ”ВЫ ВЫБРАЛИ”; A$
PRINT “Я ВЫБРАЛ” ; C$
PRINT “ПОЭТОМУ”
IF F=0 THEN PRINT “Я ВЫИГРАЛ”
IF F=1 THEN PRINT “ВЫ ВЫИГРАЛИ”
IF F=2 THEN PRINT “ПОЛУЧИЛАСЬ НИЧЬЯ”
IF F=0 THEN C=C+1
IF F=1 THEN A=A+1
PRINT “СЧЕТ ОЧКОВ”
PRINT “У МЕНЯ: ”; С
PRINT “У ВАС: ”;A
IF C
Графика в Паскале
Система ABC Pascal обладает великолепной графической библиотекой. Для ее подключения после заголовка программы необходимо написать Uses GraphABC. Модуль GraphABC содержит константы, типы, процедуры и функции для рисования в графическом окне
Вывод текста в графическом окне осуществляется оператором TextOut(x, y, ‘строка’). Этот оператор выводит строку текста в позицию (х,у) (точка (х,у) задает верхний левый угол прямоугольника который будет содержать текст).
Действия со шрифтами позволяют выполнять операторы:
SetFontName(‘name’) – устанавливает наименование шрифта;
SetFontColor(color) – устанавливает цвет шрифта;
SetFontSize(sz) – устанавливает размер шрифта в пунктах;
SetFontStyle(fs) – устанавливает стиль шрифта.
По умолчанию установлен шрифт, имеющий наименование MS Sans Serif.
Наиболее распространенные шрифты – это Times, Arial, Courier New. Наименование шрифта можно набирать без учета регистра.
Бейсик или Паскаль: какой язык выбрать?
Нет структурной записи программы.
Использование оператора GOTO позволяет совершать произвольные переходы.
Программы работают только внутри оболочки
Требуется обязательное объявление переменных в начале программы с указанием их типа.
Структурная запись программы.
Есть компилятор, позволяющий работать программе вне среды программирования.
Нет средств создания внешних библиотек.
Отсутствуют ссылочные типы и динамические переменные.
Возможность создания подпрограмм.
Наличие внешних библиотек.
Наличие ссылочных типов и динамических переменных.
Процедуры и функции.
Так какой же из языков всё таки выбрать ? Я считаю, что каждый сам выбирает то, что ему удобнее. Поэтому хорош будет тот язык, в котором ты лучше разбираешься.
Читайте также: