「小希小希~我回來啦!想我嗎?」
『主人還差 300 元才足以購買新遊戲喔!加油加油~』

「小希主人肚子餓了~」
『主人還差 300 元才足以購買新遊戲喔!加油加油~』

「小希陪我玩陪我玩~」
『主人還差 300 元才足以購買新遊戲喔!加油加油~』

且不論內心如何,
表現出來毫無反應,就只是個 NPC。

因為流程上就是一直線通到結局。
如同詛咒般的宿命,沒有任何其它的可能性。

如果有,只會是自盡而已。

為了不讓小希過著如此悲慘的人生,
這次我們要教他做出抉擇。

小至玩哪款遊戲好?
大至要送心愛的主人什麼樣的遊戲才能提升好感度…等。
人生總是需要一些抉擇,以及抉擇帶來的變化。

這就是奧義流程控制的一式。

#include <stdio.h>

int main()
{
	int money, price;
	printf("Master, how much do you have? What's the price of the new game?\n");
	scanf("%d%d", &money, &price);
	if (money >= price)
	{
		printf("Congratulations!! You can buy it NOW!!\n");
	}
	else
	{
		printf("Master, you need %d more money. fight, fight!\n", price-money);
	}
	return 0;
}

奧義.命運導引

在碰上 if 之後,小希便會面臨命運的抉擇。
() 中訴說著小希如何抉擇的關鍵。

就是 money >= price 這個條件。

如果小希判斷主人的錢足夠,他就會恭喜主人。
如果不夠,會幫忙計算出差額並鼓勵主人。

變得貼心了呢。真是個好孩子。

if 在條件滿足時,會將流程導向歸屬於 if 的分支。
條件不滿足的話,歸屬於 if 的分支將被跳過。

若 if 之後跟著 else 的話,
條件不滿足時,會將流程導向歸屬於 else 的分支。

在流程依條件流向其中一方之後,
另一方會被跳過

魚與熊掌是不能兼得的。

else 是可有可無的
在沒有跟著 else 的情況下,
不滿足條件就不做任何事。

不加 else 等同於追加沒有指令的 else

分支的境界線

流向明確後,重要的自然就是指令們的歸屬了。

{} 正是用來圈地的境界線。

被 if 之後的 {} 所囊括的一切,
便是歸屬於 if 這條岔道之下,必須經歷的一切。

同理,被 else 之後的 {} 所圈下的領地,
便是歸屬於 else 這條岔道下的未來。

岔路的岔路的岔路

岔路的前方,被圈定的世界中,
仍然是一塊可以寫下任何咒文的領域。

只要我們想要,就可以任意開枝散葉,
在分歧中做出更細微的分歧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

int main()
{
	int money, price;
	printf("Master, how much do you have? What's the price of the new game?\n");
	scanf("%d%d", &money, &price);
	if (money >= price)
	{
		if (money == price)
		{
			printf("Congratulations!! Master, just match! This must be DESTINY!!");
		}
		else
		{
			printf("Congratulations!! You can buy it NOW with $%d remain!!\n", money-price);
		}
	}
	else
	{
		printf("Master, you need %d more money. Fight, fight!\n", price-money);
	}
	return 0;
}

注意在 C 中,判斷相等必須用 == 才行。

單只有一個等號的情況,並不是判斷相等用的。
在習慣之前可能會經常犯這錯誤,
記得分歧走錯時,可以先檢查一下。

歸屬的秩序『縮排』

在分歧越來越多層時,為了能較容易判讀,
我們在每一層 {} 下,會多內縮一層。

這個動作稱為縮排

透過縮排,可以明確地看出歸屬關係與範圍。
當然,它不是必要的;也不影響歸屬關係。
不影響咒文的判讀,只影響主人的閱讀而已。

或許在短短十多行咒文下,沒有什麼感覺;
在日後動輒數百數千行的複雜程度下,

『是否容易閱讀』會極大地影響『是否容易出錯』『是否容易找到出錯處』。

大部份時候不用花心思去排,
Dev CPP 也會自動幫我們處理。

必要時可以透過輸入 tab (註1) 來內縮。
內縮過頭時,也可以把前面的 tab 刪掉一些。

如果你想挑戰不縮排的Lunatic惡夢難度,
C 也能容許便是。

但在需要合作、請他人協助除錯,
或請他人幫忙檢討咒文寫法等情況,
需要讓別人看到自己寫的咒文時,

沒有做好縮排是非常不禮貌而且不應該的行為。

當然也有故意想讓人無法解讀,
以此來保護咒文內容的情形。

我想現階段是可以完全不考慮這件事的。

實戰演練 - 帶分歧的小說

有了 if 之後,小希開始有判斷能力了,
可以因應情況給出不同回應。

互動能力也變得更強了。
這次的練習,就來試試更豐富的互動吧!

有一種寫作方式是這樣的:

在一本書上,讓讀者扮演著主角,
以主角的視點看故事,並且代替主角進行抉擇。
故事會根據讀者的選擇產生變化。

故事從第一頁開始進行,
每一頁是一個劇情片段。

每一頁的頁尾會有主角可以採取的行動,
依據不同的行動會跳到不同的頁數。

照著這個順序閱讀,走到最後的結局。
串起來剛好是一個完整的故事,
依主角的選擇產生變化。

底下是一個極簡單的範例。

  • p1.

轟隆隆隆!
外頭不斷傳來爆炸與咆哮聲。唉,又到了這個時候了嗎?
「公主,不好了!魔王又復活攻進來啦!請儘快避難…呃!」
話還未說完,就被魔王從背後一刀斬成兩截。
「嘿嘿嘿…公主啊,好久不見啦。」
我…該怎麼做?

  1. 「夠了!我受夠了每個月被復活魔王抓走的情節了!」說完拔劍往喉頭一刺… (跳p2.)
  2. 「魔王大人…其實,我喜歡的是你啊!我已經不想再被勇者拆散了…」(跳p3.)
  • p2.

不料魔王一伸手,那閃電般的速度隨即奪走公主手中短劍。
「何必想不開呢!就算找不到滿意的勇者,也還有我在啊!」
「魔王你…嗚嗚…對不起,對不起…直到和那些勇者交往過後,才知道你的好…」
「公主…我們一起回魔王城吧。」
~END~

  • p3.

「我等你這句話很久了,公主…」
「魔王…我愛你…我不會再傻到要你冒生命危險綁架我,只為了找到帥氣體貼的勇者…」
「我也愛你,公主…不會再讓那些勇者欺負你了…我們回魔王城吧!」
「嗯!」
~END~

雖然如果不使用中文很難發揮…
另外附上一些溫馨提示:

  • 不要編太複雜的故事,第一次先控制在全分歧加總 3-7
  • 不要讓故事往回跳
  • 不要讓分支太複雜,讓後續發展完全獨立會比較好控制
  • 編寫咒文時不必帶入頁數的概念,那是書本的硬體限制

順利的話,記得好好地把咒文收藏下來。
說不定能拿編譯後的執行檔作為遊戲作品發佈呢。

  • *註1

    縮排通常使用 tab,位於 Q 的左邊。

    tab 一般會補齊 4 格空白的長度,
    所以也常用來對齊。

    但是 tab 在不同地方,長度可能不同;
    像 windows 內建的記事本,就是 8 格空白長度。

    有些人會習慣用空白來縮排,
    這樣可以維持長度一致。
    編輯器也多半可以設成按 tab 插入相應數量的空白。

    也有人覺得四格在複雜點的程式碼會太靠右,
    以兩格的長度進行縮排。

    雖然只是習慣問題,
    編輯器也通常都可以自由設定,
    同一份檔案最好統一使用同一種縮排