嗨,大家好,我是KevinLee,一位正在轉職軟體工程師路上的遊戲技術美術。
我決定在這裡記錄每一個練習過的題目與實作內容,作為未來回顧與檢視的素材,也希望能透過整理與分享,加深自己對程式設計的理解。
如果內容中有任何可以改進或討論的地方,歡迎指教與交流,謝謝大家!
📅 2026/01/14
🏷️ C++、leetcode、while
✍️ KevinLee
🧩 Topic from "Zerojudge"
🎯在線上遊戲《楓之谷》中,角色依照等級與轉職階段可獲得技能點數,規則如下:
(1)所有角色從1級初心者開始,初心者不會獲得任何技能點數。
(2)8級可轉職為法師;10 級可轉職為劍士、弓箭手、盜賊。
(3)第一次轉職後:
> 轉職當下可獲得1點技能點數
> 之後每次升級可獲得3點技能點數
> 30 級完成第二次轉職,可獲得1點技能點數
> 70 級完成第三次轉職,可獲得1點技能點數
> 120 級完成第四次轉職,可獲得3點技能點數
> 角色最高等級為200級
> 假設每個人都一定會乖乖轉職的情況下
輸入說明:
本題有三個測資點,每個測資點有多組測試資料。
每組測試資料一行,包含兩個正整數:
(1)職業代碼(0~4)
(2)等級(1 ≤ lv ≤ 200)
職業代碼:
0:初心者 1:劍士 2:法師 3:弓箭手 4:盜賊
輸出說明:
對每組測試資料,輸出一行整數,表示該角色從1級到lv為止總共會獲得的技能點數。
範例輸入#1: | 範例輸出 #1
0 1 0
0 9 0
0 200 0
1 10 1
3 11 4
4 29 58
4 30 62
2 30 68
1 50 122
3 70 183
2 120 342
4 200 576
📜 邏輯紀錄
根據題目,基本一定要有三個變數,分別記錄職業、等級與技能點數
int career, level;
int skillPoint = 0;
仔細看題目,比較特別的只有0:初心者及2:法師,其他職業都是從lv10一轉,因此先以多數為範例設想。
順著邏輯可以拆分成以下:
(1)lv10以前,都拿不到技能點數。
(2)除了lv10(一轉)只會拿到一點技能點數,其他升等都會拿到3點。
(3)二轉、三轉、四轉都會額外拿到點數。
以下以完整程式碼含註解解釋:
#include<iostream>
using namespace std;
int GetLevelBouns(int level, int firstTurn)//判斷等級是幾轉,獲得額外的技能點數
{
if (level < firstTurn) return 0;//還沒轉職
else if (level >= firstTurn && level < 30) return 1;//一轉
else if (level >= 30 && level < 70) return 2;//二轉
else if (level >= 70 && level < 120) return 3;//三轉
else return 6;//四轉
}
int CalculateSkillPoint(int career, int level)//計算技能點數的函式
{
int skillPoint = 0;
int firstTurn = (career == 2) ? 8 : 10;
//判斷職業是否是法師,是的話,第一次轉職是lv8
if (career == 0)//職業為初心者,不管lv?都拿不到技能點數
{
return 0;
}
skillPoint = 3 * max(0, level - firstTurn);
//每次升等的3點 * (現在等級 - 初心者的等級)
//max,當level - firstTurn < 0,代表還是初心者
skillPoint += GetLevelBouns(level, firstTurn);//計算完整技能點數
return skillPoint;
}
int main()
{
int career, level;
int skillPoint = 0;
while (cin >> career >> level)//題目會有多筆測資,因此使用while
{
skillPoint = CalculateSkillPoint(career, level);
cout << skillPoint << endl;
}
}