使用中介者模式开发一个组队游戏

63 阅读1分钟
    // 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()