php项目统计地面对抗谁胜出?

wen PHP项目 2

本文目录导读:

php项目统计地面对抗谁胜出?

  1. 场景一:数据存储在MySQL数据库
  2. 场景二:数据在PHP数组内(内存计算)
  3. 场景三:如果你要做实时预测Elo评分(对抗推演)

在PHP项目中统计“地面对抗谁胜出”,通常指的是空战/地面战斗模拟游戏对战数据体育竞技(如田径、足球)等场景,由于你没有给出具体的数据结构,我假设最常见的情况:在一个二维数组或数据库中,记录了多场比赛/对抗的结果,需要统计出地面(或某一方)的胜出次数和胜率

以下提供几种常见场景的PHP实现方案,并附有代码示例。


数据存储在MySQL数据库

假设有一张表 battles,字段如下:

  • id
  • attacker (进攻方,如‘空军’、‘陆军’)
  • defender (防守方)
  • winner (胜者,值为‘A’或‘B’或‘平局’)

需求:统计“地面部队”(无论作为攻击方还是防守方)在对抗中胜出的总次数。

<?php
// 假设已连接数据库 $conn
$conn = new mysqli('localhost', 'user', 'pass', 'game_db');
$sql = "SELECT 
            SUM(CASE WHEN (attacker = '地面' AND winner = 'A') 
                     OR (defender = '地面' AND winner = 'B') 
                THEN 1 ELSE 0 END) AS ground_wins,
            COUNT(*) AS total_battles
        FROM battles
        WHERE attacker = '地面' OR defender = '地面'";
$result = $conn->query($sql);
$row = $result->fetch_assoc();
$ground_wins = $row['ground_wins'];
$total = $row['total_battles'];
if ($total > 0) {
    $win_rate = round(($ground_wins / $total) * 100, 2);
    echo "地面部队参与了 {$total} 场对抗,胜出 {$ground_wins} 次,胜率:{$win_rate}%";
} else {
    echo "没有找到地面部队参与的对抗记录。";
}
?>

数据在PHP数组内(内存计算)

假设数组结构如下(例如从JSON或CSV解析而来):

$battles = [
    ['attacker' => '空军', 'defender' => '地面', 'winner' => '空军'],
    ['attacker' => '地面', 'defender' => '海军', 'winner' => '地面'],
    ['attacker' => '地面', 'defender' => '空军', 'winner' => '地面'],
    ['attacker' => '海军', 'defender' => '地面', 'winner' => '海军'],
    ['attacker' => '地面', 'defender' => '地面', 'winner' => '平局'],
];

统计逻辑(通用版本,可指定对手):

<?php
function getWinStats(array $battles, string $targetFaction, ?string $opponent = null) {
    $wins = 0;
    $losses = 0;
    $draws = 0;
    foreach ($battles as $battle) {
        // 跳过不涉及目标阵营的战斗
        if (!in_array($targetFaction, [$battle['attacker'], $battle['defender']])) {
            continue;
        }
        // 如果指定了对手,检查对手是否在场
        if ($opponent !== null) {
            $opponentPresent = ($battle['attacker'] === $opponent || $battle['defender'] === $opponent);
            if (!$opponentPresent) continue;
        }
        $winner = $battle['winner'];
        // 判断胜平负
        if ($winner === '平局') {
            $draws++;
        } else {
            // 检查目标阵营是不是胜者
            $isWinner = ($winner === $battle['attacker'] && $battle['attacker'] === $targetFaction) ||
                        ($winner === $battle['defender'] && $battle['defender'] === $targetFaction);
            if ($isWinner) {
                $wins++;
            } else {
                $losses++;
            }
        }
    }
    return [
        'wins' => $wins,
        'losses' => $losses,
        'draws' => $draws,
        'total' => $wins + $losses + $draws,
        'win_rate' => ($wins + $losses > 0) ? round(($wins / ($wins + $losses)) * 100, 2) : 0
    ];
}
// 使用示例:统计“地面”对“空军”的胜率
$stats = getWinStats($battles, '地面', '空军');
echo "地对空:胜 {$stats['wins']} 负 {$stats['losses']} 平 {$stats['draws']},胜率 {$stats['win_rate']}%";
// 统计“地面”对所有对手的总胜率
$overall = getWinStats($battles, '地面');
echo "地面总对抗:胜 {$overall['wins']} 负 {$overall['losses']},总胜率 {$overall['win_rate']}%";
?>

如果你要做实时预测Elo评分(对抗推演)

谁胜出”是指根据算法(如Elo、胜率、战力值)来预测地面部队是否会赢,那需要建立一个简单的评分系统:

<?php
class BattlePredictor {
    private array $factions = [];
    public function updateRating(string $faction, float $scoreChange): void {
        if (!isset($this->factions[$faction])) {
            $this->factions[$faction] = 1500; // 初始分
        }
        $this->factions[$faction] += $scoreChange;
    }
    // 预期胜率 (基于Elo公式)
    public function predictWinProbability(string $factionA, string $factionB): float {
        $ratingA = $this->factions[$factionA] ?? 1500;
        $ratingB = $this->factions[$factionB] ?? 1500;
        $expectedA = 1 / (1 + pow(10, ($ratingB - $ratingA) / 400));
        return $expectedA * 100; // 返回百分比
    }
}
$predictor = new BattlePredictor();
// 假设几场战绩更新后...
$predictor->updateRating('地面', +30);
$predictor->updateRating('空军', -10);
$prob = $predictor->predictWinProbability('地面', '空军');
echo "当前预测地面战胜空军的概率为: {$prob}%";
?>

  1. 明确数据结构:胜者字段(winner)是判断的唯一依据,必须保证其值标准(如'地面'、'空军'、'平局')。
  2. 区分总统计和单挑统计:如果只关心“对空军”,需要在统计时过滤对手。
  3. 复杂查询用SQL,简单业务用PHP数组遍历,代码性能差异不大。
  4. 如果是对抗型模拟,考虑引入概率算法而不仅是历史数据统计。

如果你能提供具体的数据表结构前端交互需求,我可以给出更精确的代码,这个回答覆盖了统计胜出、胜率和预测三种最常见情况。

抱歉,评论功能暂时关闭!