Python: пишем игру «успей нажать клавишу»
В общем в рамках компании по попытке обучения одного товарища программированию, написал небольшую консольную игру, дабы с ним попробовать её воспроизвести.
Суть игры: компьютер загадывает случайную кнопку из списка и время за которое игрок должен успеть её нажать. Если игрок успевает нажать — ему добавляется балл.
Итак, для написания понадобится знать что такое циклы, массивы, случайные числа. Использовать будем модули keyboard, random и time
- keyboard — для получения нажатий клавиш на клавиатуре
- random — для получения случайных числел
- time — для расчета времени реакции
Для начала определим одномерный массив, в котором перечислим доступные для выбора компьютером клавиши.
1 |
keys=["q","w","e","r","t","y"]; |
Далее создадим бесконечный цикл, внутри которого будем выбирать случайную клавишу для нажатия:
1 2 3 4 5 6 7 8 |
import keyboard import random import time keys=["q","w","e","r","t","y"]; while True: key_to_press=keys[random.randint(0, len(keys)-1)] print(f"-нажми кнопку {key_to_press}") |
Что делает этот код? Бесконечно выводит в консоль сообщение о том, что нужно нажать случайно выбранную кнопку. Давайте теперь чуть переделаем код, чтобы случайно выбиралась не только клавиша которую нужноно нажать игроку, но и время за которое ему нужно её нажать:
1 2 3 4 5 6 7 8 9 10 |
import keyboard import random import time keys=["q","w","e","r","t","y"]; while True: key_to_press=keys[random.randint(0, len(keys)-1)] time_to_press=random.randint(1, 3) print(f"Нажми кнопку {key_to_press} за {time_to_press} секунды"); |
Что дальше? А дальше нам нужно объявить еще один цикл и ждать пока не истечет время отведенное для того чтобы игрок нажал кнопку. Для этого, перед началом цикла запомним время начала игры, и внутри цикла постоянно будем проверять, на сколько оно отличается от текущего времени:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import keyboard import random import time keys=["q","w","e","r","t","y"]; while True: key_to_press=keys[random.randint(0, len(keys)-1)] time_to_press=random.randint(1, 3) # время в секундах ожидания реакции print(f"Нажми кнопку {key_to_press} за {time_to_press} секунды"); start_time=time.time() # запоминаем время начала игры while True: if (time.time()-start_time>time_to_press): # разница между текущее временем и временем начала игры больше чем time_to_press, то игрок не успел нажать кнопку print("- ты проиграл, не успел нажать!") break; |
Теперь добавим чуточку интерактивности, а именно проверку, «а не нажата ли клавиша загаданная компьютером»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import keyboard import random import time keys=["q","w","e","r","t","y"]; while True: key_to_press=keys[random.randint(0, len(keys)-1)] time_to_press=random.randint(1, 3) # время в секундах ожидания реакции print(f"Нажми кнопку {key_to_press} за {time_to_press} секунды"); start_time=time.time() # запоминаем время начала игры while True: if (time.time()-start_time>time_to_press): # разница между текущее временем и временем начала игры больше чем time_to_press, то игрок не успел нажать кнопку print("- ты проиграл, не успел нажать!") break; if keyboard.is_pressed(key_to_press): print(f'-Ты выиграл!') break |
Ну и осталось чуток прилизать код, добавив возможность подсчета кто круче, компьютер или игрок:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import keyboard import random import time # создадим массив с доступными клавишами keys=["q","w","e","r","t","y"]; count_win_gamer=0 count_win_pc=0 while True: start_time=time.time() key_to_press=keys[random.randint(0, len(keys)-1)] time_to_press=random.randint(1, 3) print(f"Нажми кнопку {key_to_press} за {time_to_press} секунды"); win=False; while True: if (time.time()-start_time>time_to_press): print(f"- ты проиграл уже {count_win_pc} , не успел нажать! Общий счёт: {count_win_pc}/{count_win_gamer} (ты)") count_win_pc = count_win_pc + 1 break; if keyboard.is_pressed(key_to_press): count_win_gamer=count_win_gamer+1 print(f'-Ты выиграл уже {count_win_gamer} раз! Общий счёт: {count_win_pc}/{count_win_gamer} (ты)') win = True; break |
Ход игры: