Day6 左邊,指令太少了!搞什麼東西!


大家好,今天過得還好嗎?
相信看完Day5的你已經能捏出一個簡單的批次檔了
在今天Day6我會介紹一個我在高中的時候用批次檔寫的終極密碼猜數字小遊戲
(就是那種會告訴玩家範圍像是500~1500那種)

OK,在我把批次檔的東西丟上來前我會先講解這個批次檔的基本運作概念
這樣你等會在看的時候會比較有頭緒

終極密碼:
變數設置
這遊戲的玩法是會有最大最小值
所以很明顯地我們會需要兩個變數去紀錄"最大"和"最小"
然後我們還需要"要給人猜的數字"和"每次使用者猜的數字"
最後,如果你有需要的話還可以加上"使用者遊玩的次數"來計次
基本運作邏輯
當使用者輸入數字時會需要和最大最小值比較
如果輸入的數字超過最大值 → 回報錯誤
如果輸入的數字小於最小值 → 回報錯誤
(這樣就可以很快速地檢測出是不是在範圍內)
而如果使用者輸入的數字沒有問題的話
猜數字的次數+1
然後重新給定最新的最大或是最小值
(以1~10然後答案是數字8的例子為例)
1~10 猜5 → 5~10(最小值更新)
5~10 猜9 → 5~9 (最大值更新)

好...接下來是我批次檔的內容

@ECHO OFF
@TITLE 終極密碼
set /a T=0
set /a MIN=1
set /a MX=10000

:GNRNUM
set /a RND=%random%
if /i %RND% GTR 9999 goto GNRNUM
if /i %RND% LSS 2 goto GNRNUM

:ENTER
echo %MIN%~%MX%
set /p INPUT=猜數字:

:COMPARE
if /i %INPUT% GEQ %MX% goto ERROR
if /i %INPUT% LEQ %MIN% goto ERROR
set /a T=%T%+1
if /i %INPUT% EQU %RND% goto BANG
if /i %INPUT% GTR %RND% set /a MX=%INPUT%
if /i %INPUT% LSS %RND% set /a MIN=%INPUT%
CLS
goto ENTER

:ERROR
echo 不在範圍內的數值
goto ENTER

:BANG
CLS
echo %RND%
echo 共猜了%T%次
echo 恭喜過關!BANG!
pause

批次檔解釋:
(前面解釋過的語法這裡就不會再重複說明了)

一開始初始化:
設定遊玩次數(T)為0次
設定最小值(MIN為1)
設定最大值為10000

產生隨機要猜的數字
設定要猜的隨機數字(RND)
這裡會用到叫做%RANDOM%的環境變數,它會產生一個0到32767之間的十整數亂數
(把由%RANDOM%產生的值丟給RND變數)
如果不符合設定條件的話就跳回自己(GNRNUM標籤)重新產生一個數字
(goto的用法會在後面說明)

使用者輸入要猜的數字
給使用者看目前的最小最大值
把使用者輸入的東西丟給INPUT變數

比較
這裡會用到一個神奇的東西"goto"
簡單地說下goto的語法
goto 你要去的地方(標籤名稱)
好比說我需要去A這個地方的話你會需要這樣寫

rem 你會需要先建立一個叫做A的標籤(建立標籤的語法 → ":標籤名稱")
:A
rem 然後指定你要去的標籤名稱
goto A

註:不過使用goto時要特別注意執行的順序
因為批次檔的執行順序都是"由上往下",所以一定要記得可能會重複執行(回到剛剛執行的地方)
所以要記得設一個退出條件或是把這樣的情況考慮進去

好,了解了goto的語法後再來看這段會輕鬆很多
如果輸入的內容不在最大最小值的時候

跳到"錯誤"標籤並產生錯誤訊息後再跳回"輸入"標籤讓使用者重新輸入

如果沒這問題

猜數字次數+1

如果"輸入的數字"和"隨機產生要猜的數字"相同的話就跳去結束(BANG)標籤,然後遊戲結束
↓(如果不同)
重新給定最大最小值後跳回"輸入"標籤讓使用者重新輸入

好,相信看完Day6的你已經學會"條件處理、標籤的使用方法和一些基本的處理邏輯"了
那麼我們Day7見啦








你可能感興趣的文章

Deepest Leaves Sum

Deepest Leaves Sum

SQL-injection專論 (1) -- 帳密繞過與UNION攻擊

SQL-injection專論 (1) -- 帳密繞過與UNION攻擊

F2E合作社|圖文滿版區塊|網頁切版

F2E合作社|圖文滿版區塊|網頁切版






留言討論




elvishao0331 Feb 28, 2020

想問一下 /i 的用意是(?
因為上網好像都找不太到 /的用法 不知道是不是我下錯關鍵字

uuko Feb 28, 2020

/i 是會多新增別的功能
他內建只有 == (equal),
Ex uuko==uuko
equ(等於)”、“neq(不等於)”、“lss(小於)”、“leq(小於等於)”、“gtr(大於)”、“geq(大於等於)是他新增擴充的
Ex 1 gtr 3
Ps 我猜他字串比較是看ASCII code的
有興趣可去查查
然後 /i 判斷是不看大小寫的喔
希望有解決到你的問題,講錯的話剩下的請原文作者回答:D

vincent5753 Feb 29, 2020

嗯嗯,uuko在大方向說得沒錯歐
(先說聲抱歉,其實這裡可以不用加i參數的XD)
下i參數的用意主要在於"不想要比較英文字母的大小寫"的情況
你可以很快速地用這兩個指令看出差別

if i==I (echo 因為有比較大小寫所以不會成立)
if /i i==I (echo 大小寫不一樣可是會成立)

這種狀況就好比你要問使用者是否要做些什麼事情時會用的那個[Y/N]
這種東西實際上並不需要去在乎是大寫或是小寫
而equ、neq、lss這些指令並不需要搭配i參數就可以直接使用了
(你可以透過這三行指令快速地了解我所說的意思)

set a=1
set b=1
if %a% equ %b% (echo 一樣)

而字串比較的部分Windows是用什麼方式去比較其實一般使用者不知道也沒關係
但如果遇到像是需要比較字母先後順序的情況的話
比起"自己建一張表去比對"這種超費時的方法,"使用文字編碼來比對"會是個比較人性化也比較輕鬆的方法

希望有回答到你的問題




2
2
2