我對 JS 類的了解非常有限,所以我不知道這是否可能。
我的目標是從玩家串列中生成兩個隨機且平衡(問題的關鍵)的團隊。
我的代碼解釋:
const player:它是一個物件陣列。每個人都是一個玩家,有一個名字和一個等級。
函式 diff(a, b):效用函式。它回傳整數之間的差異。
function shuffle(array) : 實用函式。它打亂陣列的內容。
class Team:生成團隊物件的類。它有一個屬性“玩家”,作為引數傳遞,以及一個屬性“層”,它是所有玩家層的總和。
function checkTeamsLevel(team1, team2):此函式檢查兩個團隊是否平衡良好。僅當兩個團隊層級之間的差異等于或小于 1 時,它才會回傳 true。
function generateTeams():這是應用程式的主要功能。它首先將玩家陣列洗牌,然后將它們拼接成兩個玩家陣列。然后它生成兩個團隊。在這一點上,一切都很好,但我們不確定團隊是否平衡。所以我的想法是運行一個while回圈來生成新的團隊,直到函式checkTeamsLevel()回傳true。此代碼不起作用,因為當此函式回傳 false 時,回圈不會停止。事實證明這是一個無限回圈。
我如何實體化 Team 類,直到它們通過我的 checkTeamsLevel() 函式的過濾器?這真的可能嗎?
這是我的代碼:
// Array of player objects
const players = [
{name: 'John', tier: 1},
{name: 'James', tier: 3},
{name: 'Louis', tier: 2},
{name: 'Rebeca', tier: 2},
{name: 'Peter', tier: 4},
{name: 'Oscar', tier: 3},
{name: 'Laura', tier: 1},
{name: 'Rebeca', tier: 2},
{name: 'Paula', tier: 2},
{name: 'Michael', tier: 4},
];
// Function to check difference between integers.
function diff(a, b) {
return (a > b) ? (a - b) : (b - a);
}
// Function to shuffle array contents.
function shuffle(array) {
var currentIndex = array.length;
var temporaryValue, randomIndex;while (0 !== currentIndex) {
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
// Team Class
class Team {
constructor(players) {
this.players = players;
this.tier = this.getTeamTier();
}
getTeamTier() {
return this.players.reduce((total, player) => total player.tier, 0);
}
}
// Function to check if two teams are balanced.
function checkTeamsLevel(team1, team2) {
let tierThreshold = 1;
return ((team1 && team2) && diff(team1.tier, team2.tier) <= tierThreshold);
}
// Function to generate 2 balanced teams
function generateTeams(players) {
// Shuffle players
shuffle(players);
// Divide players in 2 groups
let middleIndex = Math.ceil(players.length / 2);
let playersForTeam1 = players.splice(0, middleIndex);
let playersForTeam2 = players.splice(-middleIndex);
let team1 = new Team(playersForTeam1);
let team2 = new Team(playersForTeam2);
// This loop is not working.
// I have to do something to generate two teams with a tier difference bellow 2.
while (!checkTeamsLevel(team1, team2)) {
team1 = new Team('yellow', playersForTeam1);
team2 = new Team('black', playersForTeam2);
}
// Debug
console.log(team1);
console.log(team2);
console.log(checkTeamsLevel(team1, team2));
return [team1, team2];
}
// Run generateTeams
generateTeams(players);
uj5u.com熱心網友回復:
看看下面的代碼。它按您(可能)期望的那樣作業。請參閱代碼中的注釋。
// Array of player objects
const players = [
{ name: 'John', tier: 1 },
{ name: 'James', tier: 3 },
{ name: 'Louis', tier: 2 },
{ name: 'Rebeca', tier: 2 },
{ name: 'Peter', tier: 4 },
{ name: 'Oscar', tier: 3 },
{ name: 'Laura', tier: 1 },
{ name: 'Rebeca II', tier: 2 }, //duplicate name in OP
{ name: 'Paula', tier: 2 },
{ name: 'Michael', tier: 4 },
{name: 'Chris', tier: 6}//added to test odd number
];
//No need to code diff. Use Math.abs instead
// Function to shuffle array contents.
//No need. Easy to inline
// Team Class
class Team {
constructor(players) {
this.players = players;
this.teamTier = this.getTeamTier();
}
getTeamTier() {
return this.players.reduce((total, player) => total player.tier, 0);
}
}
// Function to check if two teams are balanced.
function checkTeamsLevel(team1, team2) {
let tierThreshold = 1;
return team1 && team2 && Math.abs(team1.teamTier - team2.teamTier) <= tierThreshold;
}
// Function to generate 2 balanced teams
function generateTeams(players) {
let cnt = 0;
do {
// Shuffle players
// .sort acts on the array
players.sort(() => Math.random() < 0.5 ? -1 : 1);
// Divide players in 2 groups
// use .floor instead of .ceil
let middleIndex = Math.floor(players.length / 2); //if the number of players is odd then then someone go out of game
//use slice; splice removes elements
let playersForTeam1 = players.slice(0, middleIndex);
let playersForTeam2 = players.slice(-middleIndex);
var team1 = new Team(playersForTeam1);
var team2 = new Team(playersForTeam2);
// I have to do something to generate two teams with a tier difference bellow 2.
cnt ;
console.log(cnt);
} while (!checkTeamsLevel(team1, team2) && /*limit the number of runs to avoid infinite loop */ cnt < 15);
// Debug
//console.log(team1);
//console.log(team2);
return [team1, team2];
}
// Run generateTeams
let [team1, team2] = generateTeams(players.slice());//slice to keep const players array immutable
console.log('team1', team1, '\nteam2', team2);
//check original players array
console.log('const players',players);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/528270.html
