本文目录导读:

在PHP项目中统计“地面对抗谁胜出”,通常指的是空战/地面战斗模拟、游戏对战数据或体育竞技(如田径、足球)等场景,由于你没有给出具体的数据结构,我假设最常见的情况:在一个二维数组或数据库中,记录了多场比赛/对抗的结果,需要统计出地面(或某一方)的胜出次数和胜率。
以下提供几种常见场景的PHP实现方案,并附有代码示例。
数据存储在MySQL数据库
假设有一张表 battles,字段如下:
idattacker(进攻方,如‘空军’、‘陆军’)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}%";
?>
- 明确数据结构:胜者字段(
winner)是判断的唯一依据,必须保证其值标准(如'地面'、'空军'、'平局')。 - 区分总统计和单挑统计:如果只关心“对空军”,需要在统计时过滤对手。
- 复杂查询用SQL,简单业务用PHP数组遍历,代码性能差异不大。
- 如果是对抗型模拟,考虑引入概率算法而不仅是历史数据统计。
如果你能提供具体的数据表结构或前端交互需求,我可以给出更精确的代码,这个回答覆盖了统计胜出、胜率和预测三种最常见情况。