首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 網頁遊戲 Xnova (Ogame) 源碼解讀(十二):研究頁面 ResearchBuildingPage.php 邏輯解析

     編輯:PHP 相關知識

研究系統與建築系統最大的不同在於 **無建造隊列**:同一時間只能進行一項研究,完成後自動生效。本文詳細拆解 `ResearchBuildingPage.php` 的研究處理函數、頁面構造、用戶操作(開始/取消研究)及數據持久化流程。

一、研究預處理:HandleTechnologieBuild

每次請求入口調用,檢查當前研究是否完成:

  • 關鍵字段:`b_tech_planet` (研究星球 ID)、`b_tech` (完成時間戳)、`b_tech_id` (研究項 ID/字段名)。
  • 邏輯:若 `b_tech <= time()` → 研究完成 → 更新科技等級 (`$planet[$tech_id]++`) → 重置 `b_tech=0, b_tech_id=0` → 返回 `true` 允許開始新研究。

二、頁面構造:科技樹渲染循環

foreach ($techList as $techId => $techData) {
    // 1. 判斷是否為科技研究項 (排除建築、艦船等)
    // 2. 檢查前置條件 (vars.php 定義:需求建築等級、其他科技等級)
    // 3. 計算下一級資源消耗 (金屬/晶體/重氫) - 指數增長公式
    // 4. 計算研究時間 - 公式含實驗室等級加成
    // 5. 判斷是否可研究 (資源足夠、前置滿足、無正在進行的研究)

    // 6. 分支渲染:
    if (empty($currentResearch)) {
        // 無研究進行中 → 顯示「研究」按鈕 + 耗時/消耗
    } else {
        // 有研究進行中 → 顯示倒計時進度條 + 研究項名稱
    }
}

三、用戶操作分發

操作邏輯關鍵 SQL
開始研究 1. 安全校驗 (防偽造) 2. 計算消耗/時間 3. 扣除用戶資源 (`UPDATE planet SET metal=metal-...`) 4. 寫入研究字段:`b_tech_id=tech_id, b_tech=time()+duration, b_tech_planet=planet_id` 5. 記錄日誌 `UPDATE planet SET b_tech_id=?, b_tech=?, b_tech_planet=? WHERE id=?`
取消研究 1. 計算已消耗資源 (原消耗 * 進度比例 或 全額退還,視遊戲設置) 2. 退還資源 (`UPDATE planet SET metal=metal+...`) 3. 清空研究字段:`b_tech_id=0, b_tech=0, b_tech_planet=0` 4. 記錄日誌 `UPDATE planet SET b_tech_id=0, b_tech=0, b_tech_planet=0 WHERE id=?`

四、核心算法:資源消耗與時間計算

// 資源消耗指數增長 (典型 Ogame 公式)
$costMetal  = $baseMetal  * pow(2, $currentLevel);
$costCrystal = $baseCrystal * pow(2, $currentLevel);
$costDeuterium = $baseDeuterium * pow(2, $currentLevel);

// 研究時間 (秒) - 受實驗室等級加成
$baseTime = $costMetal + $costCrystal; // 簡化公式
$labLevel = $planet['lab']; // 實驗室等級
$duration = $baseTime / ($labLevel + 1) / $universeSpeed; // 宇宙速度倍率

五、與建築系統的關鍵差異對比

維度建築系統研究系統
隊列支持多項排隊 (字符串存儲)單項,無隊列
完成觸發請求駐動 `UpdatePlanetBatimentQueueList`請求駐動 `HandleTechnologieBuild`
取消機制可取消隊列中任意項 / 正在建造項只能取消當前唯一研究
前置條件建築等級、星球欄位、資源實驗室等級、其他科技等級、資源
效果生效建築等級+1 即時生效 (產量/存儲/防禦)科技等級+1 即時生效 (艦船解鎖/速度/資源加成)

六、安全與作弊防範

  • 參數驗證:`tech_id` 必須在合法科技列表中,`planet_id` 必須屬於當前用戶。
  • 資源檢查:服務端重新計算消耗,防止前端篡改發包。
  • 狀態鎖:`b_tech > 0` 時拒絕新研究請求,防並發競態。

七、擴展建議

  1. 研究隊列化:引入 `research_queue` 表,支持 VIP/官員功能「同時研究多項」。
  2. 科技樹可視化:前端用 D3.js/Canvas 繪製依賴圖,替代當前平鋪列表。
  3. 研究加速道具:引入「研究加速卡」道具,取消時可選「保留進度」或「全額退款」。

下期預告

下一篇進入 **造船廠頁面 `FleetBuildingPage.php`** :艦船/防禦建造隊列、船廠等級限制、資源/人口/船廠槽位多重約束、艦隊組裝邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved