2017-11-25 113 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可能會以不同的方式處理。 –