Intereting Posts
Загрузка потока веб-камеры через ftp в реальном времени Где ядро ​​Unix? Команда работает в оболочке bash, но не в псевдониме Не удается переключить макет с помощью Win + Space после включения дополнительных типографских символов Как демоны вроде apache или bind открывают порты ниже 1024? Дженкинс за Nginx в Куберне Добавить новый раздел в LUKS + LVM Коррумпированная цепочка кластеров FAT32 после изменения размера с расставленным Почему vim вставляет 50 строк вместо 96? Как извлечь первую и последнюю строки в файле? Пытаясь пересадить bash в / mnt для chroot, что хочет bash, чтобы работать? Файлы, связанные с Thunderbird – механизм безопасности для локального хранилища Как определить, какие инструкции выполняет процесс? Инструмент для измерения качества энтропии? crontab устанавливает пользовательскую переменную, перенаправляет вывод и обнаруживает подключенную сеть

Есть ли способ выполнять команды при вводе пользователя?

Я довольно новичок в написании сценариев, и у меня вопрос высокого уровня о том, как что-то сделать.

Я хочу создать простую игру, подобную космическим захватчикам, с этими двумя основными функциями:

  1. Каждые несколько секунд от верхней части экрана выпадают пули.
  2. Пользователь может перемещать домашний корабль в нижней строке экрана и уклоняться от пуль.

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

Большая часть кода из основного цикла:

while true #gets user input and updates screen. do read -r -sn1 -t 1 USERIN case $USERIN in D) moveleft ;; C) moveright ;; esac updatescreen #(my code makes sure that at least a second has passed since the last "updatescreen" execution before running this) done 

Я хочу, чтобы экран обновлялся каждую секунду независимо от ввода пользователя. Прямо сейчас, программа изменчивая, когда она обновляется, потому что иногда ей приходится ждать дольше для входа в таймаут. Было бы неплохо иметь более низкий тайм-аут чтения, но если я опустил его, я получаю сообщение об ошибке: «неверная спецификация тайм-аута».

Есть ли способ обойти эту или, возможно, целую другую программную организацию?

Вам нужно многопоточность. Посмотрите на GNU Parallel

Я нашел решение. В принципе, вы запускаете цикл обновления в фоновом режиме и имеете основной цикл на переднем плане. Они могут взаимодействовать друг с другом с помощью команд trap / kill.

Я загрузил файл .sh в github, чтобы дать полный пример.

Вот измененный план того, как он работает:

Примечание: вам нужно использовать ctrl-c для выхода.

 #!/bin/bash update() { trap "move_left;" $LEFT trap "move_right;" $RIGHT while true; do #output whatever needed done } read_in() { trap "return;" SIGINT SIGQUIT while true; do read -s -n 1 key case key in C) kill -$RIGHT $game_pid ;; D) kill -$LEFT $game_pid ;; esac done } move_left() { #update position variable } move_right() { #update position variable } update & game_pid=$! read_in kill -9 $game_pid 

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