iT邦幫忙

0

【解題紀錄】楓之谷技能點數計算

  • 分享至 

  • xImage
  •  

嗨,大家好,我是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;
    }
      
}

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言