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

PHP 網頁遊戲 Xnova (OGame) 原始碼解析(十):建築總覽 buildings.php 導航與佇列更新核心

     編輯:PHP 綜合知識

buildings.php 核心定位

非單一功能頁面,而是建築、研究、造船、防禦四大系統的導航分發器,透過參數決定進入哪個子功能。

主流程代碼解析

<?php
// 1. 更新星球建築佇列(核心邏輯)
UpdatePlanetBatimentQueueList($planetrow, $user);

// 2. 處理科技研究佇列
HandleTechnologieBuild($planetrow, $user);

// 3. 參數分發
switch ($_GET['mode'] ?? '') {
    case 'fleet':     FleetBuildingPage($planetrow, $user); break;      // 造船廠
    case 'research':  ResearchBuildingPage(...); break;                 // 研究所
    case 'defense':   DefensesBuildingPage($planetrow, $user); break;   // 防禦設施
    default:          BatimentBuildingPage($planetrow, $user); break;   // 建築列表
}

UpdatePlanetBatimentQueueList 詳細流程

<?php
function UpdatePlanetBatimentQueueList(&$CurrentPlanet, &$CurrentUser) {
    $RetValue = false;
    
    // 有建築佇列才處理
    if ($CurrentPlanet['b_building_id'] != 0) {
        while ($CurrentPlanet['b_building_id'] != 0) {
            // 當前建築完成時間已到
            if ($CurrentPlanet['b_building'] <= time()) {
                // 1. 先更新資源(時間差計算)
                PlanetResourceUpdate($CurrentUser, $CurrentPlanet, $CurrentPlanet['b_building'], false);
                
                // 2. 處理建築完成:升級、更新空間、清理佇列
                $IsDone = CheckPlanetBuildingQueue($CurrentPlanet, $CurrentUser);
                
                // 3. 若成功,處理佇列下一項
                if ($IsDone == true) {
                    SetNextQueueElementOnTop($CurrentPlanet, $CurrentUser);
                }
            } else {
                $RetValue = true; // 還有建築在進行中
                break;
            }
        }
    }
    return $RetValue;
}

CheckPlanetBuildingQueue 核心職責

  1. 解析 b_building_id 取得:建築類型、建造/拆除、目標等級、完成時間
  2. 更新建築等級(+1 或 -1)
  3. 更新星球最大空間與已用空間
  4. 清除當前建築完成時間、移除佇列首項
  5. 回傳 true 表示佇列還有後續項目

SetNextQueueElementOnTop 遞進邏輯

  1. 從佇列取得下一項建築資料
  2. 驗證可建造條件(資源、前置、空間)
  3. 計算建造時間、扣除資源
  4. 更新 b_building(完成時間)、b_building_id(剩餘佇列)
  5. 若資源不足/條件不滿足:發送遊戲內訊息通知玩家

架構設計亮點

設計優勢
被動觸發更新無需排程器、Cron、背景進程;玩家每次操作自然推進時間
佇列字串儲存簡單、無需額外表、適合輕量級遊戲
資源計算集中在 PlanetResourceUpdate單一職責、易維護、邏輯一致
作弊檢查整合在操作分發統一入口防範偽造請求

潛在問題與改進方向

  • 離線玩家資料停滯:需在關鍵路徑(間諜、聯盟、戰報)強制觸發更新
  • 佇列字串解析效能:大佇列時 explode 開銷大,建議改 JSON 或關聯表
  • 並發安全:無鎖機制,高併發可能導致資源重複扣除,建議資料庫層面樂觀鎖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved