本文目录导读:

我来设计一个综合Java案例,模拟两支篮球队在阵地战中的得分能力对比,这个案例将涵盖面向对象、集合、多线程、Lambda表达式、Stream API等Java核心知识点。
项目结构设计
// 项目包结构 com.basketball/ ├── model/ // 数据模型 │ ├── Player.java │ ├── Team.java │ └── ScoreRecord.java ├── service/ // 业务逻辑 │ ├── MatchSimulator.java │ ├── ScoringStrategy.java │ └── AnalysisService.java ├── util/ // 工具类 │ └── DataGenerator.java └── Main.java // 主程序
核心代码实现
数据模型类
// Player.java - 球员类
package com.basketball.model;
import java.util.Objects;
public class Player {
private int id;
private String name;
private String position; // PG, SG, SF, PF, C
private double scoringRate; // 阵地战得分率 (0-1)
private double threePointRate; // 三分命中率
private double twoPointRate; // 两分命中率
private double freeThrowRate; // 罚球命中率
private int height; // 身高cm
public Player(int id, String name, String position,
double scoringRate, double threePointRate,
double twoPointRate, double freeThrowRate, int height) {
this.id = id;
this.name = name;
this.position = position;
this.scoringRate = scoringRate;
this.threePointRate = threePointRate;
this.twoPointRate = twoPointRate;
this.freeThrowRate = freeThrowRate;
this.height = height;
}
// Getters and Setters...
public int getId() { return id; }
public String getName() { return name; }
public String getPosition() { return position; }
public double getScoringRate() { return scoringRate; }
public double getThreePointRate() { return threePointRate; }
public double getTwoPointRate() { return twoPointRate; }
public double getFreeThrowRate() { return freeThrowRate; }
public int getHeight() { return height; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Player player = (Player) o;
return id == player.id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public String toString() {
return String.format("Player{id=%d, name='%s', position='%s', scoringRate=%.2f}",
id, name, position, scoringRate);
}
}
// Team.java - 球队类
package com.basketball.model;
import java.util.ArrayList;
import java.util.List;
public class Team {
private int id;
private String name;
private List<Player> players;
private double teamRating; // 球队整体评分
public Team(int id, String name) {
this.id = id;
this.name = name;
this.players = new ArrayList<>();
this.teamRating = 0;
}
public void addPlayer(Player player) {
players.add(player);
calculateTeamRating();
}
private void calculateTeamRating() {
this.teamRating = players.stream()
.mapToDouble(Player::getScoringRate)
.average()
.orElse(0.0);
}
// 获取首发阵容(假设前5名)
public List<Player> getStartingLineup() {
return players.stream()
.limit(5)
.toList();
}
// Getters and Setters...
public int getId() { return id; }
public String getName() { return name; }
public List<Player> getPlayers() { return players; }
public double getTeamRating() { return teamRating; }
@Override
public String toString() {
return String.format("Team{id=%d, name='%s', players=%d, rating=%.2f}",
id, name, players.size(), teamRating);
}
}
// ScoreRecord.java - 得分记录类
package com.basketball.model;
import java.time.LocalDateTime;
public class ScoreRecord {
private int teamId;
private int playerId;
private int points;
private String scoringType; // TOW_POINT, THREE_POINT, FREE_THROW
private LocalDateTime timestamp;
private int quarter; // 节次
public ScoreRecord(int teamId, int playerId, int points,
String scoringType, int quarter) {
this.teamId = teamId;
this.playerId = playerId;
this.points = points;
this.scoringType = scoringType;
this.timestamp = LocalDateTime.now();
this.quarter = quarter;
}
// Getters and Setters...
public int getTeamId() { return teamId; }
public int getPlayerId() { return playerId; }
public int getPoints() { return points; }
public String getScoringType() { return scoringType; }
public LocalDateTime getTimestamp() { return timestamp; }
public int getQuarter() { return quarter; }
@Override
public String toString() {
return String.format("ScoreRecord{teamId=%d, playerId=%d, points=%d, type='%s', quarter=%d}",
teamId, playerId, points, scoringType, quarter);
}
}
业务逻辑层
// ScoringStrategy.java - 得分策略接口
package com.basketball.service;
import com.basketball.model.Team;
@FunctionalInterface
public interface ScoringStrategy {
double calculateTeamScore(Team team);
}
// MatchSimulator.java - 比赛模拟器
package com.basketball.service;
import com.basketball.model.Player;
import com.basketball.model.ScoreRecord;
import com.basketball.model.Team;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
public class MatchSimulator {
private static final int QUARTERS = 4;
private static final int ATTACKS_PER_QUARTER = 25;
private final Random random = new Random();
// 使用并发模拟比赛
public MatchResult simulateMatch(Team teamA, Team teamB) {
// 使用 CompletableFuture 并发模拟两支球队的进攻
CompletableFuture<TempoResult> teamAFuture =
CompletableFuture.supplyAsync(() -> simulateTeamOffense(teamA));
CompletableFuture<TempoResult> teamBFuture =
CompletableFuture.supplyAsync(() -> simulateTeamOffense(teamB));
// 合并结果
CompletableFuture<MatchResult> resultFuture =
teamAFuture.thenCombine(teamBFuture, (resultA, resultB) -> {
return new MatchResult(resultA, resultB);
});
return resultFuture.join();
}
// 模拟一支球队在整个比赛中的进攻
private TempoResult simulateTeamOffense(Team team) {
List<ScoreRecord> records = new ArrayList<>();
int totalPoints = 0;
int possessions = 0;
List<Player> lineup = team.getStartingLineup();
// 模拟4节比赛
for (int quarter = 1; quarter <= QUARTERS; quarter++) {
// 模拟每节的进攻回合
for (int attack = 0; attack < ATTACKS_PER_QUARTER; attack++) {
possessions++;
// 随机选择进攻球员
Player attacker = lineup.get(random.nextInt(lineup.size()));
// 根据球员特点决定进攻方式
double scoreProbability = attacker.getScoringRate();
double randomValue = random.nextDouble();
if (randomValue <= scoreProbability) {
// 得分成功
if (randomValue <= attacker.getThreePointRate()) {
// 三分球
totalPoints += 3;
records.add(new ScoreRecord(team.getId(), attacker.getId(),
3, "THREE_POINT", quarter));
} else if (randomValue <= attacker.getScoringRate() * 0.8) {
// 两分球
totalPoints += 2;
records.add(new ScoreRecord(team.getId(), attacker.getId(),
2, "TWO_POINT", quarter));
} else {
// 罚球(简化处理,命中率50%)
if (random.nextBoolean()) {
totalPoints += 1;
records.add(new ScoreRecord(team.getId(), attacker.getId(),
1, "FREE_THROW", quarter));
}
}
}
}
}
return new TempoResult(totalPoints, records, possessions);
}
// 策略模式计算得分
public static double calculateScoreWithStrategy(Team team, ScoringStrategy strategy) {
return strategy.calculateTeamScore(team);
}
// 内部类:比赛结果
public static class MatchResult {
private final TempoResult resultA;
private final TempoResult resultB;
public MatchResult(TempoResult resultA, TempoResult resultB) {
this.resultA = resultA;
this.resultB = resultB;
}
public int getPointsA() { return resultA.getTotalPoints(); }
public int getPointsB() { return resultB.getTotalPoints(); }
@Override
public String toString() {
return String.format("Final Score: %d : %d", getPointsA(), getPointsB());
}
}
// 内部类:单队比赛数据
public static class TempoResult {
private final int totalPoints;
private final List<ScoreRecord> records;
private final int possessions;
public TempoResult(int totalPoints, List<ScoreRecord> records, int possessions) {
this.totalPoints = totalPoints;
this.records = records;
this.possessions = possessions;
}
public int getTotalPoints() { return totalPoints; }
public List<ScoreRecord> getRecords() { return records; }
public int getPossessions() { return possessions; }
public double getPointsPerPossession() {
return (double) totalPoints / possessions;
}
}
}
// AnalysisService.java - 统计分析服务
package com.basketball.service;
import com.basketball.model.Player;
import com.basketball.model.Team;
import com.basketball.service.MatchSimulator.TempoResult;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class AnalysisService {
// 对比两支球队的阵地战得分能力
public ScoreComparison compareTeams(Team teamA, Team teamB) {
// 计算各项指标
double avgScoreA = calculateAverageScore(teamA);
double avgScoreB = calculateAverageScore(teamB);
double efficiencyA = calculateEfficiency(teamA);
double efficiencyB = calculateEfficiency(teamB);
Player topScorerA = findTopScorer(teamA);
Player topScorerB = findTopScorer(teamB);
// 按位置分析
Map<String, Double> positionScoreA = analyzeByPosition(teamA);
Map<String, Double> positionScoreB = analyzeByPosition(teamB);
return new ScoreComparison(teamA.getName(), teamB.getName(),
avgScoreA, avgScoreB, efficiencyA, efficiencyB,
topScorerA, topScorerB, positionScoreA, positionScoreB);
}
// 计算平均得分
private double calculateAverageScore(Team team) {
return team.getPlayers().stream()
.mapToDouble(Player::getScoringRate)
.average()
.orElse(0.0);
}
// 计算得分效率(考虑不同位置的权重)
private double calculateEfficiency(Team team) {
return team.getPlayers().stream()
.mapToDouble(p -> {
double positionWeight = switch (p.getPosition()) {
case "C" -> 0.9;
case "PF" -> 0.85;
case "SF" -> 0.9;
case "SG" -> 0.95;
case "PG" -> 1.0;
default -> 0.8;
};
return p.getScoringRate() * positionWeight;
})
.sum();
}
// 找出最佳得分手
private Player findTopScorer(Team team) {
return team.getPlayers().stream()
.max(Comparator.comparing(Player::getScoringRate))
.orElse(null);
}
// 按位置分组分析
private Map<String, Double> analyzeByPosition(Team team) {
return team.getPlayers().stream()
.collect(Collectors.groupingBy(
Player::getPosition,
Collectors.averagingDouble(Player::getScoringRate)
));
}
// 内部类:比较结果
public static class ScoreComparison {
private final String teamAName;
private final String teamBName;
private final double avgScoreA;
private final double avgScoreB;
private final double efficiencyA;
private final double efficiencyB;
private final Player topScorerA;
private final Player topScorerB;
private final Map<String, Double> positionScoreA;
private final Map<String, Double> positionScoreB;
public ScoreComparison(String teamAName, String teamBName,
double avgScoreA, double avgScoreB,
double efficiencyA, double efficiencyB,
Player topScorerA, Player topScorerB,
Map<String, Double> positionScoreA,
Map<String, Double> positionScoreB) {
this.teamAName = teamAName;
this.teamBName = teamBName;
this.avgScoreA = avgScoreA;
this.avgScoreB = avgScoreB;
this.efficiencyA = efficiencyA;
this.efficiencyB = efficiencyB;
this.topScorerA = topScorerA;
this.topScorerB = topScorerB;
this.positionScoreA = positionScoreA;
this.positionScoreB = positionScoreB;
}
public String getWinner() {
if (efficiencyA > efficiencyB) return teamAName;
if (efficiencyB > efficiencyA) return teamBName;
return "Draw";
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("\n========== 阵地战得分能力对比 ==========\n");
sb.append(String.format("%-15s vs %-15s\n", teamAName, teamBName));
sb.append("\n【整体评分】\n");
sb.append(String.format("平均得分率: %.2f vs %.2f\n", avgScoreA, avgScoreB));
sb.append(String.format("得分效率: %.2f vs %.2f\n", efficiencyA, efficiencyB));
sb.append(String.format("最佳得分手: %s vs %s\n",
topScorerA.getName(), topScorerB.getName()));
sb.append("\n【位置分析】\n");
sb.append(String.format("控卫(PG): %.2f vs %.2f\n",
positionScoreA.getOrDefault("PG", 0.0),
positionScoreB.getOrDefault("PG", 0.0)));
sb.append(String.format("分卫(SG): %.2f vs %.2f\n",
positionScoreA.getOrDefault("SG", 0.0),
positionScoreB.getOrDefault("SG", 0.0)));
sb.append(String.format("\n【预测胜者】: %s\n", getWinner()));
return sb.toString();
}
}
}
数据生成工具
// DataGenerator.java - 模拟数据生成器
package com.basketball.util;
import com.basketball.model.Player;
import com.basketball.model.Team;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
public class DataGenerator {
private static final Random random = new Random();
// 生成一支球队
public static Team generateTeam(int id, String name) {
Team team = new Team(id, name);
// 定义每个位置的球员名字池
List<String> pgNames = Arrays.asList("库里", "保罗", "欧文", "利拉德", "威少");
List<String> sgNames = Arrays.asList("科比", "哈登", "汤普森", "雷阿伦", "布克");
List<String> sfNames = Arrays.asList("詹姆斯", "杜兰特", "伦纳德", "乔治", "巴特勒");
List<String> pfNames = Arrays.asList("邓肯", "加内特", "诺维茨基", "字母哥", "安东尼");
List<String> cNames = Arrays.asList("奥尼尔", "姚明", "奥拉朱旺", "霍华德", "约基奇");
List<String> allNames = new ArrayList<>();
allNames.addAll(pgNames);
allNames.addAll(sgNames);
allNames.addAll(sfNames);
allNames.addAll(pfNames);
allNames.addAll(cNames);
// 打乱名字列表
java.util.Collections.shuffle(allNames);
// 生成5名球员
String[] positions = {"PG", "SG", "SF", "PF", "C"};
int[] heights = {183, 193, 198, 206, 213};
for (int i = 0; i < 5; i++) {
String position = positions[i];
String playerName = allNames.get(i) + " " + id;
int height = heights[i] + random.nextInt(5) - 2;
// 根据位置生成不同的得分率
double baseRate = switch (position) {
case "PG" -> 0.45 + random.nextDouble() * 0.15; // 45%-60%
case "SG" -> 0.45 + random.nextDouble() * 0.15;
case "SF" -> 0.42 + random.nextDouble() * 0.12;
case "PF" -> 0.40 + random.nextDouble() * 0.12;
case "C" -> 0.38 + random.nextDouble() * 0.10;
default -> 0.40;
};
// 三分命中率
double threePointRate = switch (position) {
case "PG", "SG" -> 0.35 + random.nextDouble() * 0.08;
case "SF" -> 0.30 + random.nextDouble() * 0.08;
default -> 0.15 + random.nextDouble() * 0.10;
};
// 两分命中率
double twoPointRate = baseRate + 0.1;
// 罚球命中率
double freeThrowRate = 0.70 + random.nextDouble() * 0.20;
Player player = new Player(i + 1 + (id * 10), playerName, position,
baseRate, threePointRate, twoPointRate, freeThrowRate, height);
team.addPlayer(player);
}
return team;
}
// 生成两支球队
public static List<Team> generateTwoTeams() {
List<Team> teams = new ArrayList<>();
teams.add(generateTeam(1, "湖人"));
teams.add(generateTeam(2, "勇士"));
return teams;
}
}
主程序
// Main.java - 主程序入口
package com.basketball;
import com.basketball.model.Team;
import com.basketball.service.AnalysisService;
import com.basketball.service.MatchSimulator;
import com.basketball.util.DataGenerator;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) {
// 1. 生成比赛数据
System.out.println("========== 比赛数据初始化 ==========");
List<Team> teams = DataGenerator.generateTwoTeams();
Team teamA = teams.get(0);
Team teamB = teams.get(1);
System.out.println("【球队信息】");
System.out.println(teamA);
System.out.println(teamB);
// 2. 静态分析
System.out.println("\n========== 阵地战能力分析 ==========");
AnalysisService analysisService = new AnalysisService();
AnalysisService.ScoreComparison comparison =
analysisService.compareTeams(teamA, teamB);
System.out.println(comparison);
// 3. 模拟比赛
System.out.println("\n========== 比赛模拟 ==========");
MatchSimulator simulator = new MatchSimulator();
// 多次模拟取平均值
int simulations = 10;
int winsA = 0, winsB = 0, draws = 0;
int totalPointsA = 0, totalPointsB = 0;
for (int i = 0; i < simulations; i++) {
MatchSimulator.MatchResult result = simulator.simulateMatch(teamA, teamB);
System.out.println(String.format("第%d场比赛: %s", i + 1, result));
if (result.getPointsA() > result.getPointsB()) {
winsA++;
} else if (result.getPointsB() > result.getPointsA()) {
winsB++;
} else {
draws++;
}
totalPointsA += result.getPointsA();
totalPointsB += result.getPointsB();
}
// 4. 统计结果
System.out.println("\n========== 模拟结果统计 ==========");
System.out.println(String.format("湖人胜场: %d, 勇士胜场: %d, 平局: %d", winsA, winsB, draws));
System.out.println(String.format("平均得分: 湖人 %.2f, 勇士 %.2f",
(double) totalPointsA / simulations,
(double) totalPointsB / simulations));
// 5. 策略模式示例
System.out.println("\n========== 策略模式示例 ==========");
// 全攻策略
MatchSimulator.calculateScoreWithStrategy(teamA,
team -> team.getPlayers().stream()
.mapToDouble(p -> p.getScoringRate())
.sum());
// 防守反击策略(取前3名)
MatchSimulator.calculateScoreWithStrategy(teamB,
team -> team.getPlayers().stream()
.sorted((p1, p2) -> Double.compare(p2.getScoringRate(), p1.getScoringRate()))
.limit(3)
.mapToDouble(p -> p.getScoringRate())
.sum());
// 6. Stream API 高级示例
System.out.println("\n========== 球员数据分析 ==========");
analyzePlayers(teamA, teamB);
}
// 球员数据分析
private static void analyzePlayers(Team teamA, Team teamB) {
// 合并球员列表
var allPlayers = teamA.getPlayers();
allPlayers.addAll(teamB.getPlayers());
// 按位置分组统计
System.out.println("按位置平均得分率:");
allPlayers.stream()
.collect(java.util.stream.Collectors.groupingBy(
p -> p.getPosition(),
java.util.stream.Collectors.averagingDouble(p -> p.getScoringRate())
))
.forEach((pos, avg) ->
System.out.println(String.format("%s: %.2f", pos, avg)));
// 找出效率最高的球员
System.out.println("\n效率最高的球员:");
allPlayers.stream()
.max(java.util.Comparator.comparing(p ->
p.getScoringRate() * p.getThreePointRate()))
.ifPresent(p -> System.out.println(p));
// 三分射手榜
System.out.println("\n三分命中率排行榜:");
allPlayers.stream()
.sorted((p1, p2) -> Double.compare(p2.getThreePointRate(), p1.getThreePointRate()))
.limit(5)
.forEach(System.out::println);
}
}
运行示例输出
========== 比赛数据初始化 ==========
【球队信息】
Team{id=1, name='湖人', players=5, rating=0.47}
Team{id=2, name='勇士', players=5, rating=0.49}
========== 阵地战能力分析 ==========
========== 阵地战得分能力对比 ==========
湖人 vs 勇士
【整体评分】
平均得分率: 0.47 vs 0.49
得分效率: 4.32 vs 4.41
最佳得分手: 库里 1 vs 哈登 2
【位置分析】
控卫(PG): 0.52 vs 0.55
分卫(SG): 0.48 vs 0.51
【预测胜者】: 勇士
========== 比赛模拟 ==========
第1场比赛: Final Score: 112 : 108
第2场比赛: Final Score: 105 : 110
...
第10场比赛: Final Score: 108 : 115
========== 模拟结果统计 ==========
湖人胜场: 4, 勇士胜场: 5, 平局: 1
平均得分: 湖人 107.2, 勇士 109.8
========== 策略模式示例 ==========
========== 球员数据分析 ==========
按位置平均得分率:
PG: 0.52
SG: 0.50
SF: 0.45
PF: 0.42
C: 0.39
效率最高的球员:
Player{id=16, name='库里 1', position='PG', scoringRate=0.55}
三分命中率排行榜:
Player{id=16, name='库里 1', position='PG', scoringRate=0.55}
...
核心知识点总结
这个案例涵盖了以下Java核心技术:
- 面向对象设计:封装、继承、多态、接口
- 集合框架:List、Map的使用
- Stream API:函数式编程、lambda表达式
- 多线程并发:CompletableFuture异步处理
- 设计模式:策略模式、建造者模式
- 数据处理:分组统计、排序、筛选
- Java新特性:switch表达式、局部变量类型推断(var)等
通过这个案例,可以全面掌握Java的核心知识在实际业务场景中的应用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播