2015-04-12 56 views
0

所以我做了一小段代碼,應該用另一個字符串中的字符替換下劃線(_)。如果你想知道目的,我打算製作Hang子手遊戲。Char by char循環取代BASH

x=0 
while [ $x -lt $LengthOfAnswer ]; do 
    if [ $Answer:$x:1 == $GuessedChar ]; then 
    Underscores=$(echo $Underscores | sed s/_/${Answer:$x:1}/$((x+1))) 
    fi 
done 

由此產生的結果是,第一次進行猜測,因此該循環結束,所有事情都按預期工作。然後,然後,結果開始採取奇怪的模式。

實施例:

回答是 「ABCDEF」

開始: 「_ _ _ _ _ _」

猜測 「一個」: 「一個_ _ _ _ _」

猜測 「b」: 「一個_ b _ _ _」

猜測 「C」: 「一個_ b _ç_」

當然,在這一點上應該是「A B C _ _ _」

如果任何人有需要做得到這個工作有什麼建議,我會很高興聽到這個消息。如果沒有別的選擇,只能改變我的結構,那麼請告訴我。

+1

你可以找到在bash [這裏](https://github.com/higuaro/bash-games/blob/master/hang.sh)製作的hang子手遊戲的實現。 – higuaro

+0

嗯,有一個評估正在進行在我的大學裏,我們都需要讓Hangman成爲對bash技能的測試。結構明智這是一件輕而易舉的事,但這裏的語言本身是最大的阻礙。 – SpiritBH

回答

1

感謝higuaro爲這個,與他的鏈接; Hangman Example

上下文的額外位幫我弄清楚這一個,來了以下解決方案:

x=0 
while [ $x -lt $LengthOfAnswer ]; do 
    if [ $Answer:$x:1 == $GuessedChar ]; then 
    Underscores="${Underscores:0:$x}$GuessedChar${Underscores:$((x+1))}" 
    fi 
    let "x++" 
done 
+0

這是一個無限循環?你沒有讓x更高,所以它不會達到$ lengthOfAnswer –

+0

@Sven B:哦,請原諒我,好點 – SpiritBH

0

嘗試使用SED,解決了很多問題。以下面的代碼爲起點。

secret="a b c d e f" 
guess="a" 

echo "${secret}" | sed 's/[^'${guess}' ]/_/g' 

# add each new guess to the quess string. Assume after trying "a", first "p" and "q" is tried before "b" is tried 
guess="apqb" 
echo "${secret}" | sed 's/[^'${guess}' ]/_/g' 

所有你需要做的就是讀取來自玩家的輸入,並檢查有效的輸入(一個字符,而不是空格,下劃線或類似的東西)。

+0

我剛剛發現了另一個不錯的解決方案:http://stackoverflow.com/questions/29444814/bash-show-charcaters-if - 不是,在串 –