如何在“团队”类中更改方法“踢”的逻辑。他在有英雄的队伍中选择一个随机目标(如果她还活着)并对其造成伤害,因此两支队伍(“游戏”类中的“ team1”和“ team2”)之间发生了战斗。有必要首先选择相同类型的球门,然后使用“踢”:从“ theam1”中选择“ archer”,从“ theam2”中选择“ archer”,然后从“ theam2”中选择“ archer”。如果“弓箭手”死了,那么偶然选择目标。
伪代码,我的意思是:
var simpletypeUnit = this.members.type[i];
if(simpletypeUnit.type == target.type && this.isAlive) {
simpletypeUnit.kick(target)
}else {
//random target selection
}
//constructor for creating a unit
function Unit(maxHealth, basicDamage,type) {
this.maxHealth = maxHealth;
this.currentHealth = maxHealth;
this.basicDamage = basicDamage;
this.type = type;
}
/*method for showing the status of life, true if the "health" is greater
than 0 and false if equal to or lower */
Unit.prototype.isAlive = function () {
return this.currentHealth > 0;
};
/* a method that
shows the level of health*/
Unit.prototype.getFormattedHealth = function () {
return this.currentHealth + "/" + this.maxHealth + " HP";
};
/*a method that returns the base damage of the hero and damage to the
weapon (if it is set)*/
Unit.prototype.getDamage = function () {
return this.basicDamage;
};
/* The method of hitting
the hero for the chosen purpose*/
Unit.prototype.kick = function (target) {
if (this.isAlive()) {
target.currentHealth = Math.max(0,
target.currentHealth - this.getDamage());
console.log(this.type + " hit " + this.type);
}
console.log(this.type + " hit " + target.type);
return this;
};
/*method for showing all the characteristics of the hero and changes
with them*/
Unit.prototype.toString = function () {
return "Type - " + this.type + ", is alive - " +
this.isAlive() + ", " + this.getFormattedHealth() +
', hero current damage - ' + this.getDamage() + ' points';
};
/*the constructors of the main types of units which we will use*/
function Archer(maxHealth, basicDamage) {
Unit.apply(this, arguments);
this.type = "archer";
}
function Swordsman(maxHealth, basicDamage) {
Unit.apply(this, arguments);
this.type = "swordsman";
}
function Mage(maxHealth, basicDamage) {
Unit.apply(this, arguments);
this.type = "mage";
}
Archer.prototype = Object.create(Unit.prototype);
Swordsman.prototype = Object.create(Unit.prototype);
Mage.prototype = Object.create(Unit.prototype);
/*We create units of which we will then write to the teams.
Three units per team*/
var archer = new Archer(60, 5);
var swordsman = new Swordsman(100, 10);
var mage = new Mage(40, 15);
var troll = new Archer(70, 5);
var orc = new Swordsman(150, 10);
var druid = new Mage(50, 15);
/*class for creating teams*/
function Team(name) {
this.name = name;
this.members = [];
}
/*method for adding a new unit with an arbitrary number of units*/
Team.prototype.addMember = function (...members) {
this.members.push(...members);
};
/*method of life of the team, if all participants have
"currentHealth" <0 then this method = "false"*/
Team.prototype.isAlive = function () {
return this.members.some(n => n.isAlive());
};
/*The method of random choice of the target, if the hero is alive,
then the target is randomly chosen and damage is done using
the "kick" method*/
Team.prototype.selectRandomTarget = function (targetTeam) {
var numberOfMembers = targetTeam.members.length;
var target = null;
while(target == null || !target.isAlive())
{
var randomIndex = Math.floor(Math.random() * numberOfMembers);
target = targetTeam.members[randomIndex];
}
return target;
};
/*method of damage, we go through the array of "members" and if the target
is alive, then we accidentally deal damage using the method "selectRandomTarget"*/
Team.prototype.kick = function(targetTeam) {
console.log(`\nTeam ${this.name} is attacking`);
for(var i=0; i < this.members.length; i++) {
var singleMember = this.members[i];
if(!this.isAlive()) break;
if(!singleMember.isAlive()) continue;
var target = this.selectRandomTarget(targetTeam);
singleMember.kick(target);
}
};
/*method to output information about the team*/
Team.prototype.toString = function () {
var res = "Name of team - " + this.name + '\n'
+ "life of a team : " + this.isAlive() + '\n'
+"members :\n";
for (var i=0; i<this.members.length; i++)
res += this.members[i]+"\n";
return res;
};
/*create team 1 and add units to it*/
var team1 = new Team('Alliance');
team1.addMember(archer,swordsman,mage);
/*create team 2 and add units to it*/
var team2 = new Team('Orcs');
team2.addMember(troll,orc,druid);
/*class that organizes a battle between two teams until
"currentHealth" of all units in the team will not be zero*/
function Game(team1, team2) {
this.team1 = team1;
this.team2 = team2;
}
/*the method in which the battle occurs until the
"isAlive" property of all participants of one of the commands
is equal to "false"*/
Game.prototype.battle = function() {
if (!this.team1.isAlive() || !this.team2.isAlive()) {
if (this.team1.isAlive()) {
alert("Team 1 is win");
}
if (this.team2.isAlive()) {
alert("Team 2 is win");
}
console.log(`THE BATTLE IS END :
${this.team1.toString()}
${this.team2.toString()}
${this.team1.name} - ${this.team1.members.length} -
${this.team1.members.map(n => n.currentHealth)}
${this.team2.name} - ${this.team2.members.length} -
${this.team2.members.map(n => n.currentHealth)}
`);
return;
}
team1.kick(team2);
team2.kick(team1);
requestAnimationFrame(this.battle.bind(this));
};
var game = new Game(team1, team2);
game.battle();
最佳答案
您可以在代码中添加这两个小的调整。如果我理解这个问题,这应该做您所需要的。
Unit.prototype.SelectSameType = function(targetTeam)
{ //Iterate through all the players and look for at least one of the same type that's alive
for(let i = 0; i < targetTeam.members.length; i++)
{
let target = targetTeam.members[i];
if(target.type === this.type && target.isAlive()) return target;
}
return null;
}
Team.prototype.kick = function(targetTeam) {
console.log(`\nTeam ${this.name} is attacking`);
for(var i=0; i < this.members.length; i++) {
var singleMember = this.members[i];
if(!this.isAlive() || !targetTeam.isAlive()) break;
if(!singleMember.isAlive()) continue;
//Check for the same type first
var target = singleMember.SelectSameType(targetTeam)
if(target === null) target = this.selectRandomTarget(targetTeam);
singleMember.kick(target);
}
};