像是它有如NPC般只能重覆一樣的話,能不能按照輸入做出不同回應呢?
人生總是充滿著各種選擇,導向不同的結局。小至今晚玩哪款遊戲好呢,大至要不要當勇者拯救公主呢~種種的分歧。
程式當然也是啦!如果主角血小於0就陣亡啦、隊伍存活人數等於0就gameover啦…等等。所以,當然是可以做出不同回應的!
前面也提到了,C語言是循序執行的語言,會從第一條指令開始按照順序來執行。所以先後是很重要的!
接下來要介紹的,便是控制整個運作流程用的語法之一!長得像這樣:
if(hp < 0)
{
printf("GAME OVER!\n");
}
意思是: 如果 hp < 0 成立,就在螢幕上顯示 GAME OVER!
注意到流程控制了嗎?並非每次執行都依序跑完所有程式碼,而是因應狀況不同做不同處理。
在流程上,就會出現分歧。
當然要來個歡樂分屍時間:
if <== 命運的分歧,從if開始
( <== 小括號擺分歧條件,條件成立時執行大括號圈住的指令;不成立時直接跳過
hp < 0 <== 命運分歧的決定條件
)
{ <== 在這對大括號中的,全是命運的分歧成立時,要執行的指令
printf("GAME OVER!\n"); <== 就只是個範例指令,換成什麼都行
}
既然可以處理分歧了,不如就來小試身手看看吧!以下是題目:
寫個程式嘲諷朋友,讓他輸入考試成績,然後輸出嘲笑他的話!
不到60就笑他吧哈哈哈哈~
建議先自己動手做做看喔!程式是需要不停地寫、不停地反省,才能真正練成!
單是看,就算能理解,也很容易寫不好的喔!
分析一下題目,不管要做出什麼回應,最重要的是: 先知道成績!
當然為了以防朋友笨笨看著小黑窗不知所措,要提醒他一下
所以整理步驟如下:
1. 提示使用者輸入成績
2. 等候使用者輸入
3. 判斷是否不到60分,如果是,嘲笑他!
提示的部份,用printf隨便印些字就成了,這個簡單!
等候使用者輸入,前面也寫過了,簡單!
判斷是否不到60分,用剛學的if,簡單!
嘲笑他,用printf,簡單!
所以寫起來會變成:
#include <stdio.h>
int main()
{
int score; <== 記憶成績用
printf("Dare you enter your score? "); <== 提示使用者輸入成績
scanf("%d", &score); <== 等候輸入一個整數,表示成績!
printf("your score is: %d\n", score);
if(score < 60) <== 60以及沒有60的命運分歧來啦!
{ <== 在這裡面放入未滿60分的話,想做的所有事情!
printf("hahaha you see see you, so WEAK!\n"); <== 寫得越機越好
}
scanf(" ");
return 0;
}
接著當然是F9實驗看看啦!哈哈~感覺如何啊!很想把執行檔寄給同學吧?
你可能會想說,就算有60分以上我也有想說的話啊,怎麼辦?
沒關係,if還有個好搭檔,叫做else,平常只跟在if後面出現,不能單獨存在,是個跟屁蟲。
寫起來像這樣:
if(hp < 0)
{
printf("GAME OVER!\n");
}
else
{
printf("you are still alive!\n");
}
在if的條件不滿足的情形,就會進到else部份。
所以當命運的分歧條件成立時,執行if的{}中的指令。
當條件不成立時,執行else的{}中的指令。
兩邊不可能同時執行。所以我們可以將題目改為:
寫個程式嘲諷朋友,讓他輸入考試成績,然後輸出嘲笑他的話!
不到60就笑他吧哈哈哈哈~
如果有60以上,就諷刺他一下也好啊?
步驟如下,只差一個地方:
1. 提示使用者輸入成績
2. 等候使用者輸入
3. 判斷是否不到60分,如果是,嘲笑他!
如果不是,諷刺他! <== 只多這一步
而這可以透過else解決,所以相當容易:
#include <stdio.h>
int main()
{
int score; <== 記憶成績用
printf("Dare you enter your score? "); <== 提示使用者輸入成績
scanf("%d", &score); <== 等候輸入一個整數,表示成績!
printf("your score is: %d\n", score);
if(score < 60) <== 60以及沒有60的命運分歧來啦!
{ <== 在這裡面放入未滿60分的話,想做的所有事情!
printf("hahaha you see see you, so WEAK!\n"); <== 寫得越機越好
}
else
{ <== 這裡面放60分以上的時候,想做的事!
printf("WTF!? you must CHEAT!\n"); <== 一樣越機越好,哈哈~
}
scanf(" ");
return 0;
}
簡單!當然寫完後要自己先測試一下~
都正常後就大功告成啦!
你可能會想說,萬一輸入10000分或是-20分之類的會怎麼樣?想也知道不可能出現這種鬼分數。如果要處理這種情況呢?讓我們把題目再修改一下:
寫個程式嘲諷朋友,讓他輸入考試成績,然後輸出嘲笑他的話!
如果分數不是0到100之間的數,就告訴那個白痴,不接受這種火星分數!
分數正常的話,不到60就笑他吧哈哈哈哈~
如果有60以上,就諷刺他一下也好啊?
步驟大致只差在分數判斷:
1. 提示使用者輸入成績
2. 等候使用者輸入
3. 判斷分數是否在0到100之間,如果是,跳到步驟4-1;如果不是,跳到步驟4-2。
4-1. 判斷分數是否小於60。如果是,輸出嘲笑考不到60分的話;
如果不是,輸出諷刺的話。
不論結果如何,皆跳至步驟5。
4-2. 輸出嘲笑連正確分數都打不好的話,並跳到步驟5。
5. 程式結束。
在步驟4,因步驟3而只會踏入其中一種分歧;不管結果如何皆回到共同的步驟5。
所以程式碼大致會長這樣:
if(score >= 0 && score <= 100) <== 步驟3的命運分歧,&&代表「而且」(AND)的意思
{ <== 步驟4-1
if(score < 60) <== 步驟4-1的分歧
{
printf("haha, so poor score!\n");
}
else
{
printf("not possible. you must be lying!\n");
}
}
else
{ <== 步驟4-2
printf("incorrect score. so poor you can't even tell a valid number!\n");
}
WTF!? if竟然有兩層!沒錯,就是兩層!但是整件事相當合理,皆由那5個步驟轉為程式碼而來。
由於{}中放的也是一連串的指令,所以再有if出現也不足為奇。這種現象稱為巢狀if。
雖然巢狀會比並列更為複雜,但是不用害怕!只要將完整步驟列出,再慢慢轉成程式碼即可!
所以在處理步驟3的分歧時,可以先不管{}裡面長什麼樣,是不是要有一個if。只要這對{}中,能做好步驟4-1和4-2,整個程式就會正確,這兩步要怎麼處理,到時再來煩惱!
在步驟4-1時,其實我們前面寫過了,完全一模一樣!這時不要管是不是在if裡面,只要知道在這個地方,做好步驟4-1該做的事即可!
因此,只要我們不要一步登天,把事情一口氣做到好,而是慢慢列出要做的事,一條一條循序實現,其實我們同一時間考慮的只會是一層的if,這樣就簡單的多!
別管什麼巢狀不巢狀的複雜事,只要老實循序完成每個步驟,在做某個步驟時不要想其它步驟的事,最後該是巢狀就會長成巢狀,無意間就完成了!根本不需要特別學習如何寫巢狀的if!
同樣,該是巢狀該是並列,只要你步驟列得合理,一步步實現,該長怎樣就會長怎樣,不用特別考慮也沒關係!
最後,再來追加一道自由奔放的練習題吧!寫個小遊戲!
有一種寫作方式是這樣的:
讓讀者扮演主角,故事的每一頁都是一個小章節,並在頁尾會給出兩個選項。
對於每個選項,分別告訴你,如果你選了該選項,你會跳到第X頁的劇情。
請你以程式來實現這個寫作方式,寫個簡單的小故事,給使用者玩玩。
當然,顯示頁數只是方便讀者跳頁。我們只需提供數字選項,不需提供頁數資訊,依使用者輸入的數字,決定跳到哪一段就可以了。
底下是一個小小的範例。
p1.
轟隆隆隆!
外頭不斷傳來爆炸與咆哮聲。唉,又到了這個時候了嗎?
「公主,不好了!魔王又復活攻進來啦!請儘快避難…呃!」
話還未說完,就被魔王從背後一刀斬成兩截。
「嘿嘿嘿…公主啊,好久不見啦。」
我…該怎麼做?
1. 「夠了!我受夠了每個月被復活魔王抓走的情節了!」說完拔劍往喉頭一刺… (跳p2.)
2. 「魔王大人…其實,我喜歡的是你啊!我已經不想再被勇者拆散了…」(跳p3.)
p2.
不料魔王一伸手,那閃電般的速度隨即奪走公主手中短劍。
「何必想不開呢!就算找不到滿意的勇者,也還有我在啊!」
「魔王你…嗚嗚…對不起,對不起…直到和那些勇者交往過後,才知道你的好…」
「公主…我們一起回魔王城吧。」
~END~
p3.
「我等你這句話很久了,公主…」
「魔王…我愛你…我不會再傻到要你冒生命危險綁架我,只為了找到帥氣體貼的勇者…」
「我也愛你,公主…不會再讓那些勇者欺負你了…我們回魔王城吧!」
「嗯!」
~END~
溫馨提示:
1. 注意畫面大小,寬度能塞多少字,能塞幾行
2. 丟掉頁數的想法,只用if-else控制整個流程
3. 故事先別太長,分歧先別太複雜!建議總章節數在3~8之間,不要超過!
4. 重要: 比較兩數是否相等,要寫像這樣:
select == 1
在C語言中,兩個等號連在一起,才是「等於」的意思。只有一個等號,是別的意思喔!
寫完也可以打包寄給朋友炫耀下喔!
不到60就笑他吧哈哈哈哈~
如果有60以上,就諷刺他一下也好啊?
步驟如下,只差一個地方:
1. 提示使用者輸入成績
2. 等候使用者輸入
3. 判斷是否不到60分,如果是,嘲笑他!
如果不是,諷刺他! <== 只多這一步
而這可以透過else解決,所以相當容易:
#include <stdio.h>
int main()
{
int score; <== 記憶成績用
printf("Dare you enter your score? "); <== 提示使用者輸入成績
scanf("%d", &score); <== 等候輸入一個整數,表示成績!
printf("your score is: %d\n", score);
if(score < 60) <== 60以及沒有60的命運分歧來啦!
{ <== 在這裡面放入未滿60分的話,想做的所有事情!
printf("hahaha you see see you, so WEAK!\n"); <== 寫得越機越好
}
else
{ <== 這裡面放60分以上的時候,想做的事!
printf("WTF!? you must CHEAT!\n"); <== 一樣越機越好,哈哈~
}
scanf(" ");
return 0;
}
簡單!當然寫完後要自己先測試一下~
都正常後就大功告成啦!
你可能會想說,萬一輸入10000分或是-20分之類的會怎麼樣?想也知道不可能出現這種鬼分數。如果要處理這種情況呢?讓我們把題目再修改一下:
寫個程式嘲諷朋友,讓他輸入考試成績,然後輸出嘲笑他的話!
如果分數不是0到100之間的數,就告訴那個白痴,不接受這種火星分數!
分數正常的話,不到60就笑他吧哈哈哈哈~
如果有60以上,就諷刺他一下也好啊?
步驟大致只差在分數判斷:
1. 提示使用者輸入成績
2. 等候使用者輸入
3. 判斷分數是否在0到100之間,如果是,跳到步驟4-1;如果不是,跳到步驟4-2。
4-1. 判斷分數是否小於60。如果是,輸出嘲笑考不到60分的話;
如果不是,輸出諷刺的話。
不論結果如何,皆跳至步驟5。
4-2. 輸出嘲笑連正確分數都打不好的話,並跳到步驟5。
5. 程式結束。
在步驟4,因步驟3而只會踏入其中一種分歧;不管結果如何皆回到共同的步驟5。
所以程式碼大致會長這樣:
if(score >= 0 && score <= 100) <== 步驟3的命運分歧,&&代表「而且」(AND)的意思
{ <== 步驟4-1
if(score < 60) <== 步驟4-1的分歧
{
printf("haha, so poor score!\n");
}
else
{
printf("not possible. you must be lying!\n");
}
}
else
{ <== 步驟4-2
printf("incorrect score. so poor you can't even tell a valid number!\n");
}
WTF!? if竟然有兩層!沒錯,就是兩層!但是整件事相當合理,皆由那5個步驟轉為程式碼而來。
由於{}中放的也是一連串的指令,所以再有if出現也不足為奇。這種現象稱為巢狀if。
雖然巢狀會比並列更為複雜,但是不用害怕!只要將完整步驟列出,再慢慢轉成程式碼即可!
所以在處理步驟3的分歧時,可以先不管{}裡面長什麼樣,是不是要有一個if。只要這對{}中,能做好步驟4-1和4-2,整個程式就會正確,這兩步要怎麼處理,到時再來煩惱!
在步驟4-1時,其實我們前面寫過了,完全一模一樣!這時不要管是不是在if裡面,只要知道在這個地方,做好步驟4-1該做的事即可!
因此,只要我們不要一步登天,把事情一口氣做到好,而是慢慢列出要做的事,一條一條循序實現,其實我們同一時間考慮的只會是一層的if,這樣就簡單的多!
別管什麼巢狀不巢狀的複雜事,只要老實循序完成每個步驟,在做某個步驟時不要想其它步驟的事,最後該是巢狀就會長成巢狀,無意間就完成了!根本不需要特別學習如何寫巢狀的if!
同樣,該是巢狀該是並列,只要你步驟列得合理,一步步實現,該長怎樣就會長怎樣,不用特別考慮也沒關係!
最後,再來追加一道自由奔放的練習題吧!寫個小遊戲!
有一種寫作方式是這樣的:
讓讀者扮演主角,故事的每一頁都是一個小章節,並在頁尾會給出兩個選項。
對於每個選項,分別告訴你,如果你選了該選項,你會跳到第X頁的劇情。
請你以程式來實現這個寫作方式,寫個簡單的小故事,給使用者玩玩。
當然,顯示頁數只是方便讀者跳頁。我們只需提供數字選項,不需提供頁數資訊,依使用者輸入的數字,決定跳到哪一段就可以了。
底下是一個小小的範例。
p1.
轟隆隆隆!
外頭不斷傳來爆炸與咆哮聲。唉,又到了這個時候了嗎?
「公主,不好了!魔王又復活攻進來啦!請儘快避難…呃!」
話還未說完,就被魔王從背後一刀斬成兩截。
「嘿嘿嘿…公主啊,好久不見啦。」
我…該怎麼做?
1. 「夠了!我受夠了每個月被復活魔王抓走的情節了!」說完拔劍往喉頭一刺… (跳p2.)
2. 「魔王大人…其實,我喜歡的是你啊!我已經不想再被勇者拆散了…」(跳p3.)
p2.
不料魔王一伸手,那閃電般的速度隨即奪走公主手中短劍。
「何必想不開呢!就算找不到滿意的勇者,也還有我在啊!」
「魔王你…嗚嗚…對不起,對不起…直到和那些勇者交往過後,才知道你的好…」
「公主…我們一起回魔王城吧。」
~END~
p3.
「我等你這句話很久了,公主…」
「魔王…我愛你…我不會再傻到要你冒生命危險綁架我,只為了找到帥氣體貼的勇者…」
「我也愛你,公主…不會再讓那些勇者欺負你了…我們回魔王城吧!」
「嗯!」
~END~
溫馨提示:
1. 注意畫面大小,寬度能塞多少字,能塞幾行
2. 丟掉頁數的想法,只用if-else控制整個流程
3. 故事先別太長,分歧先別太複雜!建議總章節數在3~8之間,不要超過!
4. 重要: 比較兩數是否相等,要寫像這樣:
select == 1
在C語言中,兩個等號連在一起,才是「等於」的意思。只有一個等號,是別的意思喔!
寫完也可以打包寄給朋友炫耀下喔!
沒有留言:
張貼留言