Задача 10 — Напишите игру — текстовый квест

Напишите игру — текстовый квест.
Игрок находится в квартире, его задача — покинуть ее.
Игрок свободно перемещается по квартире, пока не покинет ее.
В квартире есть три комнаты (спальня, кухня, ванна) и коридор. В ванну можно попасть из коридора и спальни. В спальню можно попасть из ванны и коридора. На кухню можно попасть только из коридора. Коридор связан со всеми комнатами, но в нем дополнительно есть дверь наружу. На кухне открыто окно. Если игрок пытается выбраться через него, то разбивается и проигрывает

Пример:
Вы в спальне. Куда идем?
1 — в ванну
2 — в коридор
2

Вы в коридоре. Куда идем?
1 — в спальню
2 — в ванну
3 — на кухню
4 — в дверь
2

Вы в ванне. Куда идем?
1 — в коридор
2 — в спальню
2

Вы в спальне…

Решение:

# Вариант 1
def play_again():
  print('Хотите попробовать ещё разок?')
  while True:
    play = int(input('1 - Да\n2 - Нет\n'))
    if play == 1:
      run_game()
      break
    #elif play == 2:
    else:
      print('Игра закончена. Приходите поиграть ещё.')
      break

# Пришлось добавить обработку не цифр
def get_step(options):
  choise = 0
  while True:
    while True:
      try:
        choise = int(input('Куда пойти? '))
        break
      except Exception:
        print("Не верно указан маршрут. Попробуйте ещё раз.")
    if choise in options:
      break
  return choise


def bedroom():
  print('Вы в спалне. Перед вами 2 двери, куда идём:\n1 - в ванную\n2 - в каридор')
  door = get_step([1, 2])
  if door == 1:
    bathroom()
  #elif door == 2:
  else:
    coridors()


def kitchen():
  print('Вы на кухне. Перед вами каридор и окно, куда идём:\n1 - в каридор\n2 - в окно')
  door = get_step([1, 2])
  if door == 1:
    coridors()
  #elif door == 2:
  else:
    print('Выход в окно был не обдумманым. Вы разбились.')
  play_again()


def coridors():
  print('Вы в коридоре. Куда идём?\n1 - в спальню\n2 - в ванну\n3 - на кухню\n4 - в дверь')
  door = get_step([1, 2, 3, 4])
  if door == 1:
    bedroom()
  elif door == 2:
    bathroom()
  elif door == 3:
    kitchen()
  elif door == 4:
    print('Вы открываете дверь. Удивительно, она не заперта! Вы выиграли.')
    play_again()


def bathroom():
  print('Вы в ванне. Куда идём?\n1 — в коридор\n2 — в спальню')
  door = get_step([1, 2])
  if door == 1:
    coridors()
  #elif door == 2:
  else:
    bedroom()


def run_game():
  print('Добро пожаловать в Квест.\nПеред вами 3 двери, куда идём:\n1 - в спальню\n2 - на кухню\n3 - в ванную')
  door = get_step([1, 2, 3])
  if door == 1:
    bedroom()
  elif door == 2:
    kitchen()
  else:
    bathroom()

run_game()



И ещё одно решение:

# Вариант 2
level = {
  0:('Вы в незнакомой квартире. И вам нужно выбраться', {'осмотреться':1}),
  1:('Вы в спальне. Куда пойти?', {'в ванную':2, 'в коридор':4}),
  2:('Вы в ванной. Куда пойти?', {'в спальню':1, 'в коридор':4}),
  3:('Вы на кухне. Здесь есть окно. Куда пойти?', {'в окно':5, 'в коридор':4}),
  4:('Вы в коридоре. Куда пойти?', {'в ванную':2, 'в спальню':1, 'на кухню':3, 'в дверь':6}),
  5:('Вы разбиваете окно, выпрыгиваете в него и падаете. Причем долго - этаж был далеко не первый. Вы проиграли.', {'заново?':0}),
  6:('Вы открываете дверь. Удивительно, она не заперта! Вы выиграли.', {'заново?':0})
  }

def change(lvl):
    play_again = True
    a, b, c = level[lvl], {}, 1
    print(a[0])
    for i in a[1]:
        print('%s - %s' % (c, i))
        b[str(c)], c = a[1][i], c + 1
    while 1:
        d = input()
        if d in b:
          break
        elif d == '0':
          play_again = False
          break
        else:
          print('Неправильно набран номер!')
    if play_again:
      change(b[d])

change(0)


Задача 9. Недоделка

Вы пришли на работу в контору по разработке игр, целевая аудитория которых — дети и их родители. У прошлого программиста было задание сделать две игры в одном приложении, чтобы пользователь мог выбирать одну из них. Однако программист, на место которого вы пришли, перед увольнением не успел сделать эту задачу и оставил только небольшой шаблон проекта.
Используя этот шаблон, реализуйте игры «Камень, ножницы, бумага» и «Угадай число».

Правила игры «Камень, ножницы, бумага»:
Программа запрашивает у пользователя строку и выводит победил он или проиграл.
Камень бьёт ножницы, ножницы режут бумагу, бумага кроет камень.

Правила игры “Угадай число”:
Программа запрашивает у пользователя число до тех пор, пока он его не отгадает.

Решение:

import random


def rock_paper_scissors():
  you_win = ' Вы проиграли.'
  comp_win = ' Вы проиграли.'
  stone_win = 'Камень бьет ножницы!'
  paper_win = 'Бумага оборачивает камень!'
  scissors_win = 'Ножницы режут бумагу!'
  possible_actions = ['камень', 'бумага', 'ножницы']
  computer_action = random.choice(possible_actions)

  user_action = int(input("Сделайте выбор — 1 - камень, 2 - бумага или 3 - ножницы: "))
  #user_action = possible_actions[user_action - 1]
  if user_action == 1:
    user_action = 'камень'
  elif user_action == 2:
    user_action = 'бумага'
  #elif user_action == 3:
  else:
    user_action = 'ножницы'

  print(f"Вы выбрали {user_action}, компьютер выбрал {computer_action}.")

  if user_action == computer_action:
    print(f'Оба пользователя выбрали {user_action}. Ничья!!')
  elif user_action == 'камень':
    if computer_action == 'ножницы':
      print(stone_win + you_win)
    else:
      print(paper_win + comp_win)
  elif user_action == 'бумага':
    if computer_action == 'камень':
      print(paper_win + you_win)
    else:
      print(scissors_win + comp_win)
  elif user_action == 'ножницы':
    if computer_action == 'бумага':
      print(scissors_win + you_win)
    else:
      print(stone_win + comp_win)

def guess_the_number():
  rnd_number = random.randint(1, 10)
  popitka = 0

  while True:
    user_number = int(input('Введите число (от 1 до 10): '))
    popitka += 1
    #if user_number != rnd_number:
    #  print('Не угадали. Попробуйте ещё раз!')
    if user_number > rnd_number:
      print('Число больше, чем нужно. Попробуйте ещё раз!')
    elif user_number < rnd_number:
      print('Число меньше, чем нужно. Попробуйте ещё раз!')
    elif user_number == rnd_number:
      break

  print(f'Вы угадали! Загаданное число было {rnd_number}. Число попыток: {popitka}')

def mainMenu():
  menu = 'В какую игру хотите выграть?\n1 - Камень, ножницы, бумага\n2 - Угадай число'
  print(menu)
  game = int(input('Ваш выбор: '))
  if game == 1:
    rock_paper_scissors()
  #elif game == 2:
  else:
    guess_the_number()

mainMenu()


Задача 8. НОД

Напишите функцию, вычисляющую наибольший общий делитель двух чисел.

Решение 1:

# Ленивый вариант
import math


first = int(input('Введите первое число: '))
second = int(input('Введите второе число: '))
print('НОД от {0} и до {1} равен {2}.'.format(first, second, \
      math.gcd(first, second)))


Решение 2:

# Со своей функцией
def get_gcd(a, b):
  gcd = 1
  for i in range(1,a+1):
    if a % i == 0 and b % i == 0:
      gcd = i
  return gcd


first = int(input('Введите первое число: '))
second = int(input('Введите второе число: '))
print('НОД от {0} и до {1} равен {2}.'.format(first, second, \
      get_gcd(first, second)))


Задача 7. Опять?

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

Конечно же, вы решили снова помочь бедняге.
Напишите для него такую программу.

Решение:

def minimum_number():
  a = int(input('Введите первое число: '))
  b = int(input('Введите второе число: '))
  minimum = (a + b - abs(a - b)) // 2
  print('Минимальное число: ', minimum)

minimum_number()


Задача 6. Монетка

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

Даны два действительных числа x и y. Напишите функцию, которая проверяет, принадлежит ли точка с координатами (x,y) заштрихованному квадрату (включая его границу). Если точка принадлежит квадрату, выведите сообщение “Монетка где-то рядом”, иначе выведите сообщение “Монетки в области нет”.

На рисунке сетка проведена с шагом 1.

Задача 6. Монетка

Решение:

def check_coordinate(x, y):
  if abs(x) > area or abs(y) > area:
    print('Монетки в области нет.')
  else:
    print('Монетка где-то рядом.')

area = 1

coordinate_x = int(input('Введите координату X: '))
coordinate_y = int(input('Введите координату Y: '))
check_coordinate(coordinate_x, coordinate_y)


Задача 5. Текстовый редактор

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

Напишите функцию count_letters, которая принимает на вход текст и подсчитывает, какое в нём количество цифр K и букв N.

Функция должна вывести на экран информацию о найденных буквах и цифрах в определенном формате.

Пример:
Введите текст: 100 лет в обед
Какую цифру ищем? 0
Какую букву ищем? л

Количество цифр 0: 2
Количество букв л: 1

Решение:

# Ленивый вариант без циклов
def count_letters2(text, n, l):
  count_number = text.count(str(n))
  count_letter = text.count(l)
  print(f'\nКоличество цифр {n}: {count_number}')
  print(f'Количество букв {n}: {count_letter}')

# Вариант с циклом
def count_letters(text, n, l):
  count_number = 0
  count_letter = 0
  for i in text:
    if i == str(n):
      count_number += 1
    if i == l:
      count_letter += 1
  print(f'\nКоличество цифр {n}: {count_number}')
  print(f'Количество букв {n}: {count_letter}')


text = input('Введите текст: ')
number = int(input('Какую цифру ищем? '))
letter = input('Какую букву ищем? ')
count_letters(text, number, letter)
count_letters2(text, number, letter)


Задача 4. Число наоборот

Вводится последовательность чисел, которая оканчивается нулём. Реализуйте функцию, которая принимает в качестве аргумента каждое число, переворачивает его и выводит на экран.

Пример:
Введите число: 1234
Число наоборот: 4321
Введите число: 1000
Число наоборот: 0001
Введите число: 0
Программа завершена!

Дополнительно: добейтесь такого вывода чисел, если в его начале идут нули.
Введите число: 1230
Число наоборот: 321

Кстати, нули, которые мы убрали, называются ведущими.

Решение:

def print_back(n):
  s = list(str(n))
  s = list(map(int, s))
  new_number = ''
  for i in range(len(s) - 1, -1, -1):
    new_number += str(s[i])
  print('Число наоборот:', int(new_number))


while True:
  number = int(input('Введите число: '))
  if number == 0:
    print('Программа завершена!')
    break
  elif number < 0:
    print_back(abs(number))
  else:
    print_back(number)
  print('')


Задача 3. Апгрейд калькулятора

Степан, как и большая часть населения планеты, для расчёта суммы и разности чисел использует калькулятор.

Однако в работе ему нужно делать не только обычные действия вроде сложения и вычитания, а делать что-то вручную он уже устал.

Поэтому Степан решил немного расширить функциональность своего калькулятора.
Напишите программу, которая спрашивает у пользователя число и действие, которое нужно с ним сделать: вывести сумму его цифр, вывести максимальную цифру или вывести минимальную цифру.

Каждое действие оформите в виде отдельной функции, а основную программу зациклите.

Решение:

menu = 'Доступные операции:\n \
A - Вывести сумму его цифр\n \
B - Вывести максиамльную цифру\n \
C - Вывести минимальную цифру\n \
Q - Выход'

def get_number_array(n):
  # Не хотелось циклом перебирать
  s = list(str(n))
  s = list(map(int, s))
  return s

def print_summ(n):
  print('Сумма чисел:', sum(get_number_array(n)))

def print_max(n):
  print('Максимальное число:', max(get_number_array(n)))

def print_min(n):
  print('Минимальное число:', min(get_number_array(n)))

def get_operation():
  print(menu)
  operation = input('Что сделать: ').upper()
  if (operation != 'A' and \
      operation != 'B' and \
      operation != 'C' and \
      operation != 'Q'):
    get_operation()
  return operation

while True:
  number = int(input('Введите число: '))
  if number == 0:
    break
  operation = get_operation()
  if operation == 'A':
    print_summ(number)
  elif operation == 'B':
    print_max(number)
  elif operation == 'C':
    print_min(number)
  elif operation == 'Q':
    break
  print()


Задача 2. Функция в функции

Евгений проходит специальный тест по программированию. У него всё шло хорошо, пока он не наткнулся на тему “Функции”.

Задание звучит так:
Основная ветка программы, не считая заголовков функций, состоит из одной строки кода.

Это вызов функции test().
В ней запрашивается на ввод целое число.
Если оно положительное, то вызывается функция positive(), тело которой содержит команду вывода на экран слова «Положительное».
Если число отрицательное, то вызывается функция negative(), ее тело содержит выражение вывода на экран слова «Отрицательное».

Помогите Евгению и реализуйте такую программ

Решение:

def test():
  number = int(input('Введите число: '))
  if number > 0:
    positive()
  elif number < 0:
    negative()
  else:
    print('Я вас не совсем понял. ;)')
    test()

def positive():
  print('Положительное')

def negative():
  print('Отрицательное')

test()


Задача 1. Сумма чисел

Напишите функцию summa_n, которая принимает одно целое положительное число N и выводит сумму всех чисел от 1 до N включительно.

Пример работы программы:
Введите число: 5
Я знаю, что сумма чисел от 1 до 5 равна 15

Решение:

def summ_to(n):
  s = 0
  for i in range(1, n + 1):
    s += i
  print(f'\nЯ знаю, что сумма чисел от 1 до {n} равна {s}')

end = int(input('Введите число: '))
summ_to(end)


Задача 10. За что?

Вы встретились со своим старым другом, который тоже изучает программирование, правда, в другом учебном заведении. За чашкой кофе он пожаловался вам, что сумасбродный препод дал им задание написать программу, которая из двух введённых чисел определяет наибольшее, не используя при этом условных операторов, циклов и встроенную функцию max.
Радуясь, что на вашем курсе такого не требуют, вы всё-таки решаете помочь своему другу.

Напишите для него эту программу.

Пример:
Введите первое число: 10
Введите второе число: 5

Наибольшее число: 10

Решение:

a = int(input('Введите первое число: '))
b = int(input('Введите второе число: '))

print('Наибольшее число:', (a // b * a + b // a * b) // (a // b + b // a))


Задача 9. Уравнение

Даны действительные коэффициенты a, b, c, при этом a≠0. Решите квадратное уравнение ax^2+bx+c=0 и выведите все его корни. Если уравнение имеет два корня, выведите два корня в порядке возрастания, если один корень — выведите одно число, если нет корней — не выводите ничего

Решение:

import math


a = float(input('Введите число A: '))
b = float(input('Введите число B: '))
c = float(input('Введите число C: '))

if a != 0:
  d = b ** 2 - (4 * a * c)
  if d == 0:
    x = -b / (2 * a)
    print(x)
  elif d > 0:
    x1 = float(((-b) + math.sqrt(d)) / (2 * a))
    x2 = float(((-b) - math.sqrt(d)) / (2 * a))
    k1 = x1.is_integer()
    k2 = x2.is_integer()
    if k1 and not k2:
      if x1 > x2:
        print('{0:.6f}'.format(x2), x1)
      else:
        print(x1, '{0:.6f}'.format(x2))
    elif not k1 and k2:
      if x2 > x1:
        print('{0:.6f}'.format(x1), x2)
      else:
        print(x2, '{0:.6f}'.format(x1))
    elif not k1 and not k2:
      if x1 > x2:
        print('{0:.6f}'.format(x2), '{0:.6f}'.format(x1))
      else:
        print('{0:.6f}'.format(x1), '{0:.6f}'.format(x2))
    else:
      if x1 > x2:
        print(int(x2), int(x1))
      else:
        print(int(x1), int(x2))


Задача 8. Часы

С начала суток часовая стрелка повернулась на угол в α градусов. Определите на какой угол повернулась минутная стрелка с начала последнего часа. Входные и выходные данные — действительные числа. При решении этой задачи нельзя пользоваться условными операторами и циклами.

Решение:

# 360 / 12 = 30 угол 1 часа

alpha = float(input('Введите угол часовой стрелки: '))
print(alpha % 30 * 12)


Задача 7. Ход конём

В рамках разработки шахматного ИИ стоит новая задача. По заданным вещественным координатам коня# и второй точки программа должна определить может ли конь ходить в эту точку.

Используйте как можно меньше конструкций if и логических операторов.
Обеспечьте контроль ввода.
Введите местоположение коня:
0.071
0.118
Введите местоположение точки на доске:
0.213
0.068

Конь в клетке (0, 1). Точка в клетке (2, 0).
Да, конь может ходить в эту точку.

Решение:

print('Введите местоположение коня:')
figura_x = float(input('X: '))
figura_y = float(input('Y: '))
print('Введите местоположение точки на доске:')
point_x = float(input('X: '))
point_y = float(input('Y: '))

fx_square = int(figura_x * 10)
fy_square = int(figura_y * 10)
px_square = int(point_x * 10)
py_square = int(point_y * 10)

print(f'Конь в клетке ({fx_square}, {fy_square}). Точка в клетке ({px_square}, {py_square}).')
if abs((figura_x - point_x) * (figura_y - point_y)) == 2:
  print('Нет, конь не может ходить в эту точку.')
else:
  print('Да, конь может ходить в эту точку.')


Задача 6. Метеостанция

Для удобства работы сотрудников международной метеостанции каждый день нужно распечатывать различные таблицы соответствия градусов по шкале Цельсия и Фаренгейта.

Напишите программу, которая принимает на вход три целых числа в градусах Цельсия: нижняя граница температуры, верхняя граница температуры и шаг.

Программа выводит на экран таблицу соответствия градусов Цельсия градусам Фаренгейта от нижней до верхней границы с указанным шагом.

Обеспечьте контроль ввода. Верхняя граница должна печататься, даже если последний шаг “перепрыгнул“ ее.
Известно, что 0С соответствует 32F, а каждый градус Цельсия эквивалентен 1.8 градусам Фаренгейта.

Пример:
Ввод:
Нижняя граница: 0
Верхняя граница: 50
Шаг: 20

Вывод:
C     F
0     32
20    68
40    104
50    122

Решение:

print('Ввод:')
start = int(input('Нижняя граница: '))
stop = int(input('Верхняя граница: '))
step = int(input('Шаг: '))

print('\nВывод:')
print('C\t\t F')
for count in range(start, stop + step, step):
  if count > stop:
    count = stop
  result = round(count * 1.8 + 32)
  print(count, '\t\t', result)