2017-11-25 80 views
0

我想了解this俄罗斯方块的实现。需要帮助理解这个俄罗斯方块的实现

我有几个问题。

在update_score功能,

if ((score > LEVEL_UP * level)) ; then   # if level should be increased 
    ((level++))         # increment level 
    pkill -SIGUSR1 -f "/bin/bash $0" 

什么是使用具有在所有的调整延迟一个单独的进程的?为什么使用SIGUSR1SIGUSR2

在draw_piece函数中,为什么要乘以8?我不明白转换是如何发生的,或者如何在这里实现“轮换”的概念。

for ((i = 0; i < 8; i += 2)) { 
    # relative coordinates are retrieved based on orientation and added to absolute coordinates 
    ((x = $1 + ${piece[$3]:$((i + $4 * 8 + 1)):1} * 2)) 
    ((y = $2 + ${piece[$3]:$((i + $4 * 8)):1})) 
    xyprint $x $y "$5" 

    ... 
} 

我也不理解涉及的语法:here。

在clear_next中,为什么需要draw_next ${filled_cell//?/ }而不是${filled_cell}//意味着什么?

回答

3

我对shell脚本和编程一般初学者,我一直在试图理解这种实现俄罗斯方块的[壳]

不知怎的,我怀疑你会发现更容易程序开始。

为调整延迟有什么独立的过程?为什么要使用[SIGUSR1]和[SIGUSR2]?

我不认为有一个为调整延迟一个单独的进程,但对于实施计时器。即使程序等待播放器输入,定时器也必须运行,如果shell函数没有给出任何超时的方法,那么必须将其导出到另一个进程。所以,那么你得到的有在脚本的末尾,一分为计时器,用户输入处理,与实际的游戏逻辑,产量由前两个要到最后一个:

(ticker & reader) | (controller) 

bash的read确实有-t标志超时,所以如果它在Bash中实现,则可能不需要额外的计时器进程。但是,将计时器放在外部进程中也会使其与用户输入无关,所以每次用户点击按钮时,都会重置该超时值。解决这个问题需要一些方法来精确确定流逝的时间(或者在read上使用非常短的超时时间并计算滴答时间)。

SIGUSR1SIGUSR2只是“无辜”的信号,对整个系统没有意义,所以可以在这里使用它们。当然你也可以使用其他的,但如果他们想停止游戏,捕捉SIGINTSIGHUP会令用户恼火。

在draw_piece函数中,为什么要乘以8?

((x = $1 + ${piece[$3]:$((i + $4 * 8 + 1)):1} * 2)) 

piece阵列包含不同形状和碎片的取向。一块是4个大方块,每个方块需要两个坐标,所以我们每块/方位得到8个数字。因为,例如,对于S一块串0001111201101120,所以它有两个方向:

yx yx yx yx yx yx yx yx 
00 01 11 12 01 10 11 20 

而且一块看起来是这样的:

012  012 
0 xx. 0 .x. 
1 .xx 1 xx. 
2 ... 2 x.. 

${variable:position:length}符号从给定挑选一个子变量,所以程序从大字符串中获取它需要的单个数字。这是一种实现数组的奇怪方式。

在clear_next中,为什么需要draw_next ${filled_cell//?/ } ......? //意味着什么?

${parameter/foo/bar}构造是一种模式替换(参见例如Bash's manual on parameter expansion,查找“替换”)。无论匹配foo的值为parameter,用bar替换,结果都被展开。用双斜线替换所有的比赛,只用一个斜线,只有第一个。问号与文件名全局匹配任何字符,这样可以有效地创建一个与原始字符串一样长的空格字符串。

例如:

$ str="hallo hallo" 
$ echo "${str/a/e}" 
hello hallo 
$ echo "${str//a/e}" 
hello hello 
$ str="abc" 
$ echo "x${str//?/ }x" 
x x 
+0

谢谢!您能否解释涉及以下内容的语句的语法:在哪里尝试分配坐标?这似乎是程序中的一个常见元素,我无法用if-else – Enne

+0

@enne和'$ {::}'来解释它。子。编辑。 Bash手册的同一页面。 – ilkkachu

+0

在单独的进程中运行定时器没有多大用处,因为陷阱处理程序在'read'返回之前未被执行。但我承认除了'bash'以外的其他shell可能会以不同的方式处理。 –