---
# System prepended metadata

title: '[Dialog專案] 推理思考謎題'

---

# [Dialog專案] 推理思考謎題

### :small_blue_diamond: 專案緣起：這是一個推理小遊戲，玩家可以選擇簡單、普通、困難三種難度的謎題。

創作者：Thomas

創作日期：2023/6/17

最後更新：2023/6/19

適用系統：Ubuntu 20.04 up、Rucky Linux 8 up、CentOS 7 up  

## 程式碼內容

:::info
這個專案用了四個.sh檔來呈現
:::
vim game_start.sh #新增一個sh檔，並給予執行權限 (chmod +x game_start.sh)
:::success
dialog  --stdout --title "選擇難易度" --radiolist "單選" 10 30 3 1 "簡單" on  2 "普通" off  3 "困難" off  > 難度.txt
snh=$(cat 難度.txt)
case $snh in

        1)
                ./Simple.sh
        ;;
        2)
                ./Normal.sh
        ;;
        3)
                ./Hard.sh
        ;;
        *)
                echo "Error"2> error.txt
        ;;
esac
:::
vim Simple.sh #新增一個sh檔，並給予執行權限 (chmod +x Simple.sh)
:::success
n=2<br>
while true; do<br>
        dialog --title "簡單" --checklist "有甲、乙、丙、丁、戊五個人，每個人頭上戴一頂白帽子或者黑帽子，每個人只能看見別人頭上帽子的顏色，看不見自己頭上帽子的顏色。戴白帽子的人只能說真話，戴黑帽子只能說謊話。
        甲說：我看見三頂白帽子一頂黑帽子。乙說：我看見四頂黑帽子。
        丁說：我看見一頂白帽子三頂黑帽子。戊說：我看見四頂白帽子。
        請問誰戴了白帽子？（可複選）" 17 75 5 \
                1 "甲" off \
                2 "乙" off \
                3 "丙" off \
                4 "丁" off \
                5 "戊" off 2> selection.txt<br>
        result=$(cat selection.txt)

        if [[ $result == *"3"* && $result == *"4"* ]]; then
                dialog  --msgbox "恭喜答對！" 10 50
                break
        elif  [[ $n == 0 ]]; then
                dialog  --msgbox "請好好睡一覺後再回來挑戰吧。" 10 50
                break
        else
                dialog  --yesno "好可惜！您還有$n次機會，請問要繼續嘗試嗎？" 10 50
                response=$?
                n=$((n-1))
                if [[ $response -ne 0 ]]; then
                        dialog --title "" --msgbox "請好好睡一覺後再回來挑戰吧。" 10 50
                        break
                fi
        fi
done
:::
vim Normal.sh #新增一個sh檔，並給予執行權限 (chmod +x Normal.sh)
:::success

n=3<br>
while true; do
        dialog --title "普通" --inputbox "誠實村與騙人村在圓桌圍成一圈開會，主席問了三個問題：

1.「如果你『右手邊那個人，是誠實村的人』的話，請舉手」有4個人舉手<br>
2.「如果你『左手邊那個人，上一個問題有舉手』的話，請舉手」一樣有4個人舉手<br>
3.「如果你『前兩次都有舉手』的話，麻煩請再舉一次手」這次只有2個人舉手<br>

誠實村及騙人村參加會議的人數相等，並且主席自己舉了兩次手<br>
請問參加會議的總人數為何？" 17 75 2> selection.txt<br>

result=$(cat selection.txt)

                if [[ $result == *"8"* ]]; then
                        dialog  --msgbox "恭喜答對！" 10 50
                        break
                elif  [[ $n == 0 ]]; then
                        dialog  --msgbox "請好好睡一覺後再回來挑戰吧。" 10 50
                        break
                else
                        dialog  --yesno "好可惜！您還有$n次機會，請問要繼續嘗試嗎？" 10 50
                        response=$?
                        n=$((n-1))
                        if [[ $response -ne 0 ]]; then
                                dialog --title "" --msgbox "請好好睡一覺後再回來挑戰吧。" 10 50
                                break
                        fi
                fi
done
:::
vim Hard.sh #新增一個sh檔，並給予執行權限 (chmod +x Hard.sh)
:::success

dialog --title "困難" --msgbox "
在一棟合租房中，D於自己房間內遭到殺害，警方初步調查後得到以下線索：

一、被害人的手機不見了，推測是被兇手帶走。
二、床頭枕邊及桌上共3個指針式鬧鐘與2個電子鐘，5個鬧鐘設定的鬧鈴時間分別為8:50、8:55、9:00、9:05、9:10，全部處於鈴聲開啟的狀態。

合租房除了D還住了居民ABC，第一發現者A今天早上聽到鬧鐘依序響起卻都沒關，去了D房間查看才發現屍體。
警方對ABC進行了訊問，下面是三人的回答：" 15 75

dialog --title "警衛A" --msgbox "
我上完大夜班後想回家補眠，結果D先生房間的鬧鐘一直響，去敲門後發現門沒鎖，結果看到D先生躺在地上沒了呼吸，於是我立刻報警。剩下的鬧鐘大概響了10分鐘左右就停了。

關於D先生的異狀嗎？昨晚8點45分左右我們在玄關碰面，一問之下才知道D先生也被叫去值夜班，他看起來心情不好，但突然被叫去值班沒有人會感到高興吧。" 15 75

dialog --title "記者B" --msgbox "
早上我一直睡覺，直到被A先生叫醒後才知道發生命案。鬧鐘？我睡得很沉，所以沒聽到鬧鈴的聲音。

昨晚的狀況？我獨自一人在房間寫新聞稿，偶爾感覺到客廳有人出入的動靜，不過我專注在寫稿上，沒察覺出什麼異狀。" 15 75

dialog --title "大學生C" --msgbox "
早上8點出頭我就去學校參加社團活動，接到電話才曉得D先生的事情。

昨晚我出去吃晚餐順便散步，回來時發現D先生坐在客廳，他抱怨說公司打錯電話叫錯人，害他白跑一趟還沒看到自己很愛看的電視劇，聊了幾句後就各自回房間了。時間？大約是在9點45分左右的時候吧。" 15 75

dialog --title "關鍵線索" --msgbox "
結束三人的偵訊，烏探長再次回到案發現場。這時一旁的警員發現了一件事，鬧鈴設定9:00的指針式鬧鐘，比實際時間快了2分鐘，也就是說這個鬧鐘真正的響鈴時間是8:58。
警員只覺得是時鐘不準，沒有放在心中。不過烏探長卻認為不對勁，再三思考後，他發現三人之中有一人說了謊，極具嫌疑！
這個說謊的嫌疑人是哪一位？" 15 75

dialog --yesno "確定公布答案？" 5 40
if [ $? -eq 0 ]; then
        dialog --title "真相大白" --msgbox "
        這個指針式鬧鐘並不是早上起床用的，而是提醒被害人他喜歡的電視劇就要開播了。由於8:45出門、9:45回家還沒看到，因此那個電視劇是在9:00開播，所以鬧鐘才設在8:58的時候響起。而用來提醒早上9:00起床的鬧鐘已經被兇手帶走了，那就是被害人的手機>。
        回到案情，8:58的鬧鐘處於鈴聲開啟的狀態。代表被害人昨晚出門前忘記關鬧鐘，回來後也沒有再關掉，也就是說昨晚8:58那個鬧鐘在無人的房間鈴聲大作，這時A去值晚班，C也出門吃飯，然而B聲稱自己一直在房間寫作，卻「沒察覺到任何異狀」，很顯然是在說謊。" 15 75
fi
:::
### 操作畫面說明
:::info
請確保環境可以執行dialog（sudo apt install dialog），並輸入以下指令：<br>
./game_start.sh
:::

畫面一<br>![](https://hackmd.io/_uploads/rJa6-O6w2.png)<br>

畫面二<br>![](https://hackmd.io/_uploads/BkdwfO6vn.png)
<br>

畫面三<br>![](https://hackmd.io/_uploads/rJc2EuTv2.png)
<br>

畫面四<br>![](https://hackmd.io/_uploads/SkXxrdTD2.png)
<br>

畫面五<br>![](https://hackmd.io/_uploads/rkRlB_aP3.png)
<br>

畫面六<br>![](https://hackmd.io/_uploads/Hk--HdTPh.png)
<br>

畫面七<br>![](https://hackmd.io/_uploads/r1qbHuTw3.png)
<br>

畫面八<br>![](https://hackmd.io/_uploads/H1e0WSOaD3.png)
<br>

畫面九<br>![](https://hackmd.io/_uploads/HJrXS_pwh.png)
<br>

畫面十<br>![](https://hackmd.io/_uploads/rJHGSu6Ph.png)
<br>

畫面十一<br>![](https://hackmd.io/_uploads/rk_GSdpv3.png)
<br>

畫面十二<br>![](https://hackmd.io/_uploads/Bkafr_TPn.png)
<br>

          