Python 飞机大战中的得分系统:计分规则、排行榜与数据存储实现
·
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
特殊奖励机制:
- 时间奖励:每存活30秒额外加50分 $$ \text{time_bonus} = \left\lfloor \frac{\text{game_time}}{30} \right\rfloor \times 50 $$
- 无损通关:未损失生命通关时分数翻倍
- 道具加成:拾取得分道具时临时启用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']}")
三、数据存储方案
-
本地JSON存储(基础方案)
# 数据结构示例 [ {"name": "Player1", "score": 15000, "date": "2023-07-15"}, {"name": "Player2", "score": 12000, "date": "2023-07-14"} ] -
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() -
云存储集成(网络版)
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()
五、优化建议
- 数据加密:对存储文件进行简单加密
import base64 encoded_data = base64.b64encode(json.dumps(data).encode()).decode() - 反作弊机制:
- 记录游戏时长验证分数合理性
- 检测异常分数跳跃
- 可视化增强:
- 使用Pygame绘制动态排行榜界面
- 添加分数变化动画特效
- 显示历史分数曲线图
实现要点:计分规则需平衡挑战性与成就感,数据存储应考虑跨平台兼容性,排行榜更新频率需优化性能。实际开发中建议采用SQLite+JSON混合存储方案,既保证查询效率又便于数据迁移。
更多推荐


所有评论(0)