Я немного новичок в Android и Java и пытаюсь создать функцию, которая генерирует случайную команду по крикету из 11 игроков с капитаном и вице-капитаном, соблюдая строгие правила, такие как
< li>минимальное и максимальное количество игроков на каждую роль,
максимальное количество игроков из одной команды
если соревнование небольшое, 80% игроков должны быть последовательными, а 20% – рискованными. игроков, а если соревнование мега-, 60% игроков будут стабильными, а 40% - рискованными игроками.
все команды должны быть уникальными
случайная комбинация игроков на основе команды, например 7-4,4-7,5-6 и 6-5 и т. д.
private void generateTeams(List
captains, List viceCaptains) {
if (!canGenerateTeams()) {
showErrorDialog(getString(R.string.error), getString(R.string.unable_to_generate_teams));
return;
}
int consistentRatio = contestType == 2 ? 80 : 60; // Small contest: 80-20, Mega contest: 60-40
// Prepare player pools
List allPlayers = new ArrayList(PlayersViewModelCricketAI.getBothTeamsPlayers().getValue());
allPlayers.removeAll(selectedPlayerOut); // Remove locked-out players
// Sort players by credits (higher credits first for consistent players)
allPlayers.sort((p1, p2) -> Double.compare(p2.getPlayerCredit(), p1.getPlayerCredit()));
// Divide players into consistent and risky groups
int splitIndex = (consistentRatio * allPlayers.size()) / 100;
List consistentPlayers = new ArrayList(allPlayers.subList(0, splitIndex));
List riskyPlayers = new ArrayList(allPlayers.subList(splitIndex, allPlayers.size()));
// Initialize team generation parameters
List generatedTeams = new ArrayList();
Set generatedTeamSignatures = new HashSet();
int maxPlayersFromOneTeam = MAX_PLAYERS_ONE_TEAM;
int requiredTeams = totalTeamsToCreate;
int attempts = 0;
int maxAttempts = (requiredTeams * 50);
Random random = new Random();
while (generatedTeams.size() < requiredTeams && attempts < maxAttempts) {
attempts++;
List teamPlayers = new ArrayList();
Set teamPlayerIds = new HashSet();
int team1Count = 0, team2Count = 0;
// Randomly choose a valid team combination (e.g., 7-4, 6-5, 5-6)
int team1Limit = 4 + random.nextInt(4); // Adjust range as needed
int team2Limit = TOTAL_PLAYERS - team1Limit;
// Add locked-in players
for (Player player : selectedPlayerIn) {
if (teamPlayers.size() < TOTAL_PLAYERS && !teamPlayerIds.contains(player.getPlayerId())) {
if (validatePositionConstraints(player, teamPlayers)) {
teamPlayers.add(player);
teamPlayerIds.add(player.getPlayerId());
if (player.getPlayerTeamNumber() == 1) team1Count++;
if (player.getPlayerTeamNumber() == 2) team2Count++;
}
}
}
// Add captain and vice-captain
Player captain = captains.get(random.nextInt(captains.size()));
Player viceCaptain = viceCaptains.get(random.nextInt(viceCaptains.size()));
// Ensure captain and vice-captain are not the same
if (captain.getPlayerId() != viceCaptain.getPlayerId()) {
if (!teamPlayerIds.contains(captain.getPlayerId()) && validatePositionConstraints(captain, teamPlayers)) {
teamPlayers.add(captain);
teamPlayerIds.add(captain.getPlayerId());
if (captain.getPlayerTeamNumber() == 1) team1Count++;
if (captain.getPlayerTeamNumber() == 2) team2Count++;
}
if (!teamPlayerIds.contains(viceCaptain.getPlayerId()) && validatePositionConstraints(viceCaptain, teamPlayers)) {
teamPlayers.add(viceCaptain);
teamPlayerIds.add(viceCaptain.getPlayerId());
if (viceCaptain.getPlayerTeamNumber() == 1) team1Count++;
if (viceCaptain.getPlayerTeamNumber() == 2) team2Count++;
}
}else{
continue;
}
// Fill remaining slots with consistent players
for (Player player : consistentPlayers) {
if (teamPlayers.size() >= TOTAL_PLAYERS) break;
if (!teamPlayerIds.contains(player.getPlayerId()) && validatePositionConstraints(player, teamPlayers)) {
if (player.getPlayerTeamNumber() == 1 && team1Count >= team1Limit) continue;
if (player.getPlayerTeamNumber() == 2 && team2Count >= team2Limit) continue;
teamPlayers.add(player);
teamPlayerIds.add(player.getPlayerId());
if (player.getPlayerTeamNumber() == 1) team1Count++;
if (player.getPlayerTeamNumber() == 2) team2Count++;
}
}
// Fill remaining slots with risky players
for (Player player : riskyPlayers) {
if (teamPlayers.size() >= TOTAL_PLAYERS) break;
if (!teamPlayerIds.contains(player.getPlayerId()) && validatePositionConstraints(player, teamPlayers)) {
if (player.getPlayerTeamNumber() == 1 && team1Count >= team1Limit) continue;
if (player.getPlayerTeamNumber() == 2 && team2Count >= team2Limit) continue;
teamPlayers.add(player);
teamPlayerIds.add(player.getPlayerId());
if (player.getPlayerTeamNumber() == 1) team1Count++;
if (player.getPlayerTeamNumber() == 2) team2Count++;
}
}
if (validateTeam(teamPlayers, maxPlayersFromOneTeam)) {
List playerIds = new ArrayList();
for (Player p : teamPlayers) {
playerIds.add(p.getPlayerId());
}
Collections.sort(playerIds);
String teamSignature = playerIds + "-" + captain.getPlayerId() + "-" + viceCaptain.getPlayerId();
// Check uniqueness
if (!generatedTeamSignatures.contains(teamSignature)) {
Team team = new Team();
team.players = new ArrayList(teamPlayers);
team.captainId = captain.getPlayerId();
team.viceCaptainId = viceCaptain.getPlayerId();
generatedTeams.add(team);
generatedTeamSignatures.add(teamSignature); // Track this team
}
}
}
Log.e("RESULTS","REQUIRED TEAMS: "+ totalTeamsToCreate +" GENERATED TEAMS: "+ generatedTeams.size()+" ATTEMPTS:"+attempts);
String content = getResources().getString(R.string.teams_count_confirmation, generatedTeams.size());
showSuccessDialog(content, generatedTeams);
}
как вы можете видеть, иногда он генерирует необходимые команды за меньшее количество попыток, а иногда даже за 1000 попыток не генерируется достаточно требуемых команд, игроков достаточно, но они делают случайные вещи, вызывающие дублирование команд и попытка терпит неудачу, поэтому я хочу улучшить свой код, чтобы он мог генерировать необходимые случайные вещи, строго следуя моим правилам. Дайте мне знать, если кто-нибудь здесь может мне помочь в том же вопросе.
Спасибо!
Я немного новичок в Android и Java и пытаюсь создать функцию, которая генерирует случайную команду по крикету из 11 игроков с капитаном и вице-капитаном, соблюдая строгие правила, такие как [list] < li>[b]минимальное и максимальное количество игроков на каждую роль,[/b] [*][b]максимальное количество игроков из одной команды[/b] [*]если соревнование небольшое, 80% игроков должны быть последовательными, а 20% – рискованными. игроков, а если соревнование мега-, 60% игроков будут стабильными, а 40% - рискованными игроками. [*][b]все команды должны быть уникальными[/b][*][b]случайная комбинация игроков на основе команды, например 7-4,4-7,5-6 и 6-5 и т. д.[/b] [/list] Теперь я сделал такую функцию: [code]private void generateTeams(List captains, List viceCaptains) { if (!canGenerateTeams()) { showErrorDialog(getString(R.string.error), getString(R.string.unable_to_generate_teams)); return; }
int consistentRatio = contestType == 2 ? 80 : 60; // Small contest: 80-20, Mega contest: 60-40
// Prepare player pools List allPlayers = new ArrayList(PlayersViewModelCricketAI.getBothTeamsPlayers().getValue()); allPlayers.removeAll(selectedPlayerOut); // Remove locked-out players
// Sort players by credits (higher credits first for consistent players) allPlayers.sort((p1, p2) -> Double.compare(p2.getPlayerCredit(), p1.getPlayerCredit()));
// Divide players into consistent and risky groups int splitIndex = (consistentRatio * allPlayers.size()) / 100; List consistentPlayers = new ArrayList(allPlayers.subList(0, splitIndex)); List riskyPlayers = new ArrayList(allPlayers.subList(splitIndex, allPlayers.size()));
// Initialize team generation parameters List generatedTeams = new ArrayList(); Set generatedTeamSignatures = new HashSet(); int maxPlayersFromOneTeam = MAX_PLAYERS_ONE_TEAM;
int requiredTeams = totalTeamsToCreate; int attempts = 0; int maxAttempts = (requiredTeams * 50);
Random random = new Random();
while (generatedTeams.size() < requiredTeams && attempts < maxAttempts) { attempts++;
List teamPlayers = new ArrayList(); Set teamPlayerIds = new HashSet(); int team1Count = 0, team2Count = 0;
// Randomly choose a valid team combination (e.g., 7-4, 6-5, 5-6) int team1Limit = 4 + random.nextInt(4); // Adjust range as needed int team2Limit = TOTAL_PLAYERS - team1Limit;
// Add locked-in players for (Player player : selectedPlayerIn) { if (teamPlayers.size() < TOTAL_PLAYERS && !teamPlayerIds.contains(player.getPlayerId())) { if (validatePositionConstraints(player, teamPlayers)) { teamPlayers.add(player); teamPlayerIds.add(player.getPlayerId());
if (player.getPlayerTeamNumber() == 1) team1Count++; if (player.getPlayerTeamNumber() == 2) team2Count++; } } }
// Add captain and vice-captain Player captain = captains.get(random.nextInt(captains.size())); Player viceCaptain = viceCaptains.get(random.nextInt(viceCaptains.size()));
// Ensure captain and vice-captain are not the same if (captain.getPlayerId() != viceCaptain.getPlayerId()) { if (!teamPlayerIds.contains(captain.getPlayerId()) && validatePositionConstraints(captain, teamPlayers)) { teamPlayers.add(captain); teamPlayerIds.add(captain.getPlayerId()); if (captain.getPlayerTeamNumber() == 1) team1Count++; if (captain.getPlayerTeamNumber() == 2) team2Count++; }
if (!teamPlayerIds.contains(viceCaptain.getPlayerId()) && validatePositionConstraints(viceCaptain, teamPlayers)) { teamPlayers.add(viceCaptain); teamPlayerIds.add(viceCaptain.getPlayerId()); if (viceCaptain.getPlayerTeamNumber() == 1) team1Count++; if (viceCaptain.getPlayerTeamNumber() == 2) team2Count++; } }else{ continue; }
// Fill remaining slots with consistent players for (Player player : consistentPlayers) { if (teamPlayers.size() >= TOTAL_PLAYERS) break;
if (!teamPlayerIds.contains(player.getPlayerId()) && validatePositionConstraints(player, teamPlayers)) { if (player.getPlayerTeamNumber() == 1 && team1Count >= team1Limit) continue; if (player.getPlayerTeamNumber() == 2 && team2Count >= team2Limit) continue;
teamPlayers.add(player); teamPlayerIds.add(player.getPlayerId()); if (player.getPlayerTeamNumber() == 1) team1Count++; if (player.getPlayerTeamNumber() == 2) team2Count++; } }
// Fill remaining slots with risky players for (Player player : riskyPlayers) { if (teamPlayers.size() >= TOTAL_PLAYERS) break;
if (!teamPlayerIds.contains(player.getPlayerId()) && validatePositionConstraints(player, teamPlayers)) { if (player.getPlayerTeamNumber() == 1 && team1Count >= team1Limit) continue; if (player.getPlayerTeamNumber() == 2 && team2Count >= team2Limit) continue;
teamPlayers.add(player); teamPlayerIds.add(player.getPlayerId()); if (player.getPlayerTeamNumber() == 1) team1Count++; if (player.getPlayerTeamNumber() == 2) team2Count++; } }
if (validateTeam(teamPlayers, maxPlayersFromOneTeam)) { List playerIds = new ArrayList(); for (Player p : teamPlayers) { playerIds.add(p.getPlayerId()); } Collections.sort(playerIds); String teamSignature = playerIds + "-" + captain.getPlayerId() + "-" + viceCaptain.getPlayerId();
// Check uniqueness if (!generatedTeamSignatures.contains(teamSignature)) { Team team = new Team(); team.players = new ArrayList(teamPlayers); team.captainId = captain.getPlayerId(); team.viceCaptainId = viceCaptain.getPlayerId(); generatedTeams.add(team); generatedTeamSignatures.add(teamSignature); // Track this team } } }
Я немного новичок в Android и Java и пытаюсь создать функцию, которая генерирует случайную команду по крикету из 11 игроков с капитаном и вице-капитаном, соблюдая строгие правила, такие как
минимальное и максимальное количество игроков на каждую...
У меня есть программа для игры в крикет, которая запрашивает у пользователя количество сыгранных оверов, а затем отслеживает раны, калитки и оверы. С этой частью все в порядке, но я не могу понять, как отслеживать каждого отбивающего и его пробежки....
Когда я пытаюсь получить доступ к Rounaz Cricket API, сервер отправляет меня обратно:
{
data : null,
status : false,
status_code : 403,
status_msg : AccessDenied ,
version : 2.0.2
}
Я получаю ключ доступа из своего приложения, нажимаю API...