Python 飞机大战得分系统实现

一、计分规则设计

核心计分机制:

class ScoreSystem:
    def __init__(self):
        self.score = 0
        self.combo = 0  # 连击计数器
        self.multiplier = 1  # 分数倍率
    
    def add_score(self, enemy_type):
        """根据敌机类型计算得分"""
        base_points = {
            'small': 100,
            'medium': 300,
            'large': 500,
            'boss': 2000
        }
        
        # 计算基础分 + 连击奖励
        points = base_points[enemy_type] + (self.combo * 10)
        self.score += points * self.multiplier
        
        # 更新连击状态
        self.combo += 1
        self._update_multiplier()
        
        return points
    
    def _update_multiplier(self):
        """根据连击数更新倍率"""
        if self.combo >= 15:
            self.multiplier = 3
        elif self.combo >= 8:
            self.multiplier = 2
        else:
            self.multiplier = 1
    
    def reset_combo(self):
        """中断连击时重置"""
        self.combo = 0
        self.multiplier = 1

特殊奖励机制:

  1. 时间奖励:每存活30秒额外加50分 $$ \text{time_bonus} = \left\lfloor \frac{\text{game_time}}{30} \right\rfloor \times 50 $$
  2. 无损通关:未损失生命通关时分数翻倍
  3. 道具加成:拾取得分道具时临时启用2倍分数
二、排行榜系统实现
import json
from operator import itemgetter

class Leaderboard:
    def __init__(self, file_path='leaderboard.json', max_entries=10):
        self.file_path = file_path
        self.max_entries = max_entries
        self.scores = self._load_scores()
    
    def _load_scores(self):
        """从文件加载排行榜数据"""
        try:
            with open(self.file_path, 'r') as f:
                return json.load(f)
        except (FileNotFoundError, json.JSONDecodeError):
            return []
    
    def _save_scores(self):
        """保存排行榜数据到文件"""
        with open(self.file_path, 'w') as f:
            json.dump(self.scores, f)
    
    def add_entry(self, player_name, score):
        """添加新记录并排序"""
        self.scores.append({'name': player_name, 'score': score})
        self.scores.sort(key=itemgetter('score'), reverse=True)
        self.scores = self.scores[:self.max_entries]
        self._save_scores()
    
    def display(self):
        """控制台显示排行榜"""
        print("===== 飞行英雄榜 =====")
        for i, entry in enumerate(self.scores, 1):
            print(f"{i}. {entry['name']}: {entry['score']}")

三、数据存储方案
  1. 本地JSON存储(基础方案)

    # 数据结构示例
    [
        {"name": "Player1", "score": 15000, "date": "2023-07-15"},
        {"name": "Player2", "score": 12000, "date": "2023-07-14"}
    ]
    

  2. SQLite数据库(进阶方案)

    import sqlite3
    
    def init_db():
        conn = sqlite3.connect('game_data.db')
        c = conn.cursor()
        c.execute('''CREATE TABLE IF NOT EXISTS scores
                   (id INTEGER PRIMARY KEY, 
                    name TEXT, 
                    score INTEGER,
                    date TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')
        conn.commit()
        conn.close()
    

  3. 云存储集成(网络版)

    import requests
    
    def upload_score(player_name, score):
        API_URL = "https://api.yourgame.com/scores"
        payload = {
            'name': player_name,
            'score': score,
            'token': 'SECURE_API_KEY'
        }
        response = requests.post(API_URL, json=payload)
        return response.status_code == 200
    

四、系统集成示例
# 游戏主循环中
score_system = ScoreSystem()
leaderboard = Leaderboard()

while game_running:
    # 敌机被击落时
    if enemy.destroyed:
        points = score_system.add_score(enemy.type)
        show_floating_text(f"+{points}!", enemy.position)
    
    # 玩家被击中时
    if player.hit:
        score_system.reset_combo()

# 游戏结束时
if score_system.score > leaderboard.scores[-1]['score']:
    player_name = input("恭喜上榜! 请输入名字: ")
    leaderboard.add_entry(player_name, score_system.score)

leaderboard.display()

五、优化建议
  1. 数据加密:对存储文件进行简单加密
    import base64
    encoded_data = base64.b64encode(json.dumps(data).encode()).decode()
    

  2. 反作弊机制
    • 记录游戏时长验证分数合理性
    • 检测异常分数跳跃
  3. 可视化增强
    • 使用Pygame绘制动态排行榜界面
    • 添加分数变化动画特效
    • 显示历史分数曲线图

实现要点:计分规则需平衡挑战性与成就感,数据存储应考虑跨平台兼容性,排行榜更新频率需优化性能。实际开发中建议采用SQLite+JSON混合存储方案,既保证查询效率又便于数据迁移。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐