// const players = []
// function Player (name, teamColor) {
// this.name = name
// this.teamColor = teamColor
// this.partners = []
// this.enemies = []
// this.state = 'live'
// }
// Player.prototype.win = function() {
// console.log('winner: '+ this.name)
// }
// Player.prototype.lose = function() {
// console.log('loser: '+ this.name)
// }
// Player.prototype.die = function() {
// let all_dead = true
// this.state = 'dead'
// for(let i = 0, partner; partner = this.partners[i++];) {
// if( partner.state !== 'dead') {
// all_dead = false
// break;
// }
// }
// if (all_dead) {
// this.lose()
// for(let i = 0, partner; partner = this.partners[i++];) {
// partner.lose()
// }
// for ( var i = 0, enemy; enemy = this.enemies[ i++ ]; ){
// enemy.win()
// }
// }
// }
// const PlayerFactory = function(name, teamColor) {
// const newPlayer = new Player(name, teamColor)
// // 通知所有的玩家,有新队员加入
// for(let i = 0, player; player = players[i++];) {
// if (player.teamColor === newPlayer.teamColor) {
// // 相互添加到队友列表
// player.partners.push(newPlayer)
// newPlayer.partners.push(player)
// } else {
// player.enemies.push( newPlayer )
// newPlayer.enemies.push( player )
// }
// }
// players.push(newPlayer)
// return newPlayer
// }
function Player (name, teamColor) {
this.name = name
this.teamColor = teamColor
this.state = 'live'
}
Player.prototype.win = function() {
console.log('winner: '+ this.name)
}
Player.prototype.lose = function() {
console.log('loser: '+ this.name)
}
Player.prototype.die = function() {
this.state = 'dead'
// 给中介发送消息,玩家死亡
playerDirector.reciveMessage( 'playerDead', this );
}
Player.prototype.remove = function(){
// 给中介者发送消息,移除一个玩家
playerDirector.reciveMessage( 'removePlayer', this );
};
Player.prototype.changeTeam = function( color ){
//给中介者发送消息,玩家换队
playerDirector.reciveMessage( 'changeTeam', this, color );
};
const PlayerFactory = function(name, teamColor) {
const newPlayer = new Player(name, teamColor)
// 给中介发消息,新增玩家
playerDirector.reciveMessage( 'addPlayer', newPlayer )
return newPlayer
}
const playerDirector = (function() {
const operations = {} // 中介可以执行的操作
const players = {} // 所有的玩家
// 新增一个玩家
operations.addPlayer = function(player) {
const teamColor = player.teamColor
players[teamColor] = players[teamColor] || []
players[teamColor].push(player)
}
// 玩家死亡
operations.playerDead = function(player) {
const teamColor = player.teamColor
const teamPlayers = players[teamColor]
let all_dead = true
for(let i = 0, teamPlayer; teamPlayer = teamPlayers[i++];) {
if( teamPlayer.state !== 'dead') {
all_dead = false
break;
}
}
if (all_dead) {
for(let i = 0, teamPlayer; teamPlayer = teamPlayers[i++];) {
teamPlayer.lose()
}
for (const color in players ) {
if (color !== teamColor) {
const otherTeamPlayers = players[color]
for(let i = 0, otherTeamPlayer; otherTeamPlayer = otherTeamPlayers[i++];) {
otherTeamPlayer.win()
}
}
}
}
}
// 移除一个玩家
operations.removePlayer = function(player) {
const teamColor = player.teamColor
teamPlayers = players[ teamColor ] || []
for (let i = teamPlayers.length - 1; i >= 0; i--) {
if(teamPlayers[i] === player) {
teamPlayers.splice( i, 1 )
}
}
}
// 玩家换队
operations.changeTeam = function(player, newTeamColor) {
operations.removePlayer(player)
player.teamColor = newTeamColor
operations.addPlayer(player)
}
const reciveMessage = function() {
// arguments 的第一个参数为消息名称
const message = Array.prototype.shift.call(arguments)
operations[message].apply(this, arguments)
}
return {
reciveMessage
}
})()
// 红队
const player1 = PlayerFactory('红一', 'red')
const player2 = PlayerFactory('红二', 'red')
const player3 = PlayerFactory('红三', 'red')
const player4 = PlayerFactory('红四', 'red')
// 蓝队
const player5 = PlayerFactory('蓝一', 'blue')
const player6 = PlayerFactory('蓝二', 'blue')
const player7 = PlayerFactory('蓝三', 'blue')
const player8 = PlayerFactory('蓝四', 'blue')
// 红队死亡
// player1.die()
// player2.die()
// player3.die()
// player4.die()
// player1.remove();
// player2.remove();
// player3.die();
// player4.die()
player1.changeTeam( 'blue' );
player2.die();
player3.die();
player4.die()