如果你玩過角色扮演遊戲(RPG),一定知道角色有「血量」「等級」「金錢」這些數值,遇到怪物要判斷「打贏了嗎」,練功要「重複打怪很多次」。寫程式其實就是在做同樣的事——只是換成用文字告訴電腦該怎麼做。
這篇文章會用 VB.NET 這個語言,帶你認識程式最基礎的幾個概念。VB.NET 的語法很像英文句子(例如用 If...Then...Else、End If),對第一次寫程式的人來說算是比較好讀的一種。
準備工具
VB.NET 是微軟的語言,最簡單的開發方式是安裝免費的 Visual Studio Community(到官網下載,選「.NET 桌面開發」的項目就好)。安裝完之後,建立一個新專案,選 「主控台應用程式 (Console App)」,語言選 Visual Basic,就可以開始寫了。
主控台應用程式的意思是:程式執行時會跳出一個黑底白字的視窗,你在裡面看輸出、打輸入,很適合拿來練基礎語法。
第一支程式:Hello World
幾乎每個人學程式的第一步都是讓電腦印出一句話:
Module Program
Sub Main()
Console.WriteLine("哈囉,我是新手玩家!")
End Sub
End Module
逐行拆解:
Module Program:把程式碼包在一個叫Program的「模組」裡,先不用深究,記得每個 VB.NET 主控台程式都長這樣就好。Sub Main():這是程式真正開始執行的地方,遊戲開機時第一個載入的畫面。Console.WriteLine("..."):在黑色視窗印出一行文字。End Sub/End Module:VB.NET 的規矩是「開始什麼,就要用End 什麼來結束」,這裡開了Sub跟Module,就要各自收尾。
變數:幫角色存數值
變數就是拿一個盒子,裝一個數值,並且幫這個盒子取名字。在 VB.NET 裡用 Dim(Dimension 的縮寫,可以理解成「宣告」)來開一個盒子:
Dim playerName As String = "小明"
Dim hp As Integer = 100
Dim attackPower As Double = 12.5
Dim isAlive As Boolean = True
這裡出現了幾種常見的資料型別:
| 型別 | 用途 | 範例 |
|---|---|---|
String | 文字 | 角色名字 "小明" |
Integer | 整數 | 血量 100 |
Double | 小數 | 攻擊力 12.5 |
Boolean | 是非題(只有 True / False) | 是否存活 True |
盒子裡的數值之後可以再換掉:
hp = hp - 20 ' 被打了一下,扣 20 血
Console.WriteLine("目前血量:" & hp)
& 是 VB.NET 用來把文字跟數字接在一起的符號。另外你應該注意到了,' 開頭的那句沒有被執行——那是註解,是寫給人看的說明,電腦會直接忽略它。
從鍵盤讀取輸入
光是印東西不夠好玩,我們讓玩家可以自己輸入:
Console.Write("請輸入你的名字:")
Dim name As String = Console.ReadLine()
Console.WriteLine("歡迎進入遊戲," & name & "!")
Console.ReadLine() 會暫停程式,等玩家在視窗裡打字、按下 Enter,把打的內容存進變數裡。
判斷式:遇到怪物要怎麼辦
If...Then...Else 就是在做決定,跟中文的「如果…就…否則…」一模一樣:
Dim monsterHp As Integer = 30
Dim playerAttack As Integer = 45
If playerAttack >= monsterHp Then
Console.WriteLine("怪物被打倒了!獲得經驗值。")
Else
Console.WriteLine("怪物還沒死,換它攻擊你。")
End If
常用的比較符號:
| 符號 | 意思 |
|---|---|
= | 等於 |
<> | 不等於 |
> / < | 大於 / 小於 |
>= / <= | 大於等於 / 小於等於 |
如果條件不只一個,可以用 ElseIf 繼續接:
Dim score As Integer = 75
If score >= 90 Then
Console.WriteLine("評價:S")
ElseIf score >= 60 Then
Console.WriteLine("評價:及格")
Else
Console.WriteLine("評價:不及格,再努力!")
End If
迴圈:重複打怪練等
迴圈就是叫電腦「同一件事重複做很多次」,不用自己複製貼上。
For 迴圈:知道要重複幾次的時候用,例如「打 5 次怪」:
For round As Integer = 1 To 5
Console.WriteLine("第 " & round & " 回合,攻擊怪物!")
Next
這段會依序印出「第 1 回合」到「第 5 回合」,round 這個變數每跑一次就自動 +1。
While 迴圈:不知道要重複幾次,只知道「條件成立就繼續」的時候用,例如「血量沒歸零就一直打」:
Dim monsterHp As Integer = 50
While monsterHp > 0
monsterHp = monsterHp - 10
Console.WriteLine("攻擊一次!怪物剩餘血量:" & monsterHp)
End While
Console.WriteLine("怪物死亡!")
要特別小心:While 迴圈裡一定要有讓條件最終會變成 False 的動作(像上面每次都扣血),不然程式會永遠跑下去,這叫「無窮迴圈」。
陣列:一次管理很多角色
如果隊伍裡有好幾個角色,一個一個開變數太麻煩,可以用陣列把它們放進同一個籃子:
Dim teamNames() As String = {"戰士", "法師", "弓箭手"}
For i As Integer = 0 To teamNames.Length - 1
Console.WriteLine("隊員:" & teamNames(i))
Next
有兩個重點:
- 陣列的編號從 0 開始,所以
teamNames(0)是「戰士」,不是teamNames(1)。 teamNames.Length是陣列裡總共有幾個元素,這裡是 3。
Sub 跟 Function:把重複的動作包起來
如果「攻擊」這個動作到處都要用,與其每次都重寫一遍,不如包成一個「招式」,要用的時候直接喊招式名字就好。
Sub:做一件事,但不回傳任何結果:
Sub Attack(attackerName As String, damage As Integer)
Console.WriteLine(attackerName & " 造成了 " & damage & " 點傷害!")
End Sub
呼叫的時候:
Attack("戰士", 25)
Attack("法師", 40)
Function:做一件事,而且會回傳一個結果給你,很像數學裡的函數:
Function CalculateDamage(baseAttack As Integer, isCritical As Boolean) As Integer
If isCritical Then
Return baseAttack * 2
Else
Return baseAttack
End If
End Function
呼叫方式:
Dim finalDamage As Integer = CalculateDamage(20, True)
Console.WriteLine("實際傷害:" & finalDamage) ' 印出 40
Function 名字後面 As Integer 是在說「這個函式最後會交回來一個整數」,內部用 Return 把結果送出去。
小專案:猜數字遊戲
把上面學到的變數、迴圈、判斷式全部湊在一起,寫一個完整的小遊戲:電腦心裡想一個數字,玩家猜,猜錯就提示「太大」或「太小」。
Module Program
Sub Main()
Dim answer As Integer = 42
Dim guess As Integer = 0
Dim tryCount As Integer = 0
Console.WriteLine("我心裡想了一個 1 到 100 的數字,你來猜猜看!")
While guess <> answer
Console.Write("請輸入你猜的數字:")
guess = CInt(Console.ReadLine())
tryCount = tryCount + 1
If guess > answer Then
Console.WriteLine("太大了!")
ElseIf guess < answer Then
Console.WriteLine("太小了!")
Else
Console.WriteLine("答對了!你總共猜了 " & tryCount & " 次。")
End If
End While
End Sub
End Module
新出現的 CInt(...) 是在做型別轉換:Console.ReadLine() 讀進來的永遠是文字(String),但我們要拿它跟整數 answer 比大小,所以要先用 CInt 把文字轉成 Integer。
學到這裡,你已經會了
- 用
Dim開變數,裝不同型別的資料 - 用
Console.WriteLine/Console.ReadLine跟玩家互動 - 用
If...ElseIf...Else做判斷 - 用
For/While做重複的事 - 用陣列一次管理多筆資料
- 用
Sub/Function把程式拆成可以重複呼叫的小單元
這些幾乎是所有程式語言都會有的基本功,之後不管是學 Python、C#,還是 JavaScript,你會發現「變數、判斷、迴圈、函式」這四樣東西永遠都在,換的只是寫法。接下來可以試著自己改一改猜數字遊戲,例如限制猜的次數、加上「猜錯太多次就 Game Over」,動手改壞掉再修好,是學程式最快的方式。