有没有办法在获取用户输入的同时执行命令?

有没有办法在获取用户输入的同时执行命令?

我对脚本编写相当陌生,并且我有一个关于如何做某事的高级问题。

我想设计一个类似于太空侵略者的简单游戏,目前有以下两个主要功能:

  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

我希望屏幕每秒更新一次,独立于用户输入。现在,程序更新时会断断续续,因为有时需要等待更长的时间才能输入超时。如果读取超时值较低就好了,但如果我降低它,则会收到错误:“无效的超时规范”。

有没有办法解决这个问题,或者可能是一个完全不同的程序组织?

答案1

你需要多线程。看一下GNU 并行

答案2

我找到了解决方案。基本上,您在后台运行更新循环,并在前台运行主循环。它们可以使用 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

使用上面链接的示例脚本作为工作示例版本,但您已经拥有了!只是对程序架构进行了一些修改。

相关内容