ããã«ã¡ã¯ãå人ãã¡ïŒ
å°ãåãŸã§ããããã¢ã¯ã·ã§ã³ãéžæããåé¡ã解決ããããã«ãã¥ãŒã©ã«ãããã¯ãŒã¯ã䜿çšããç§ã®çµéšãå
±æããŸããã åé¡ã®æ¬è³ªã«ã€ããŠè©³ãã
ã¯ãèšäºã®æåã®éšåãã芧ãã ããã
ãããŠã次ã®äœæ¥æ®µéã«ã€ããŠã話ãããŸãïŒ
決å®æš
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã§ã®å€±æããïŒãããéåžžã«æçšãªïŒçµéšã®åŸã決å®æšãšã²ãŒã çè«ã®ç 究ãå§ããŸããã ãã®åé¡ãç 究ããéçšã§ãç§ã¯å€ãã®ã¢ã€ãã¢ãšæŠå¿µãæã¡ãŸãããã次ã®ããšã«æ±ºããŸããã
- ãããã«ã¯ãããªãŒã®æåã®ã¬ãã«ã§ããç¥ãããã¢ã¯ã·ã§ã³ïŒããŒãïŒã®ã»ããããããŸãã ãããã¯ãããããçŸåšã®ã²ãŒã ç¶æ³ã«æé©ãªãã®ãéžæããã¢ã¯ã·ã§ã³ã§ãã
- ãããã¯åã¢ã¯ã·ã§ã³ã®ãã·ãã¥ã¬ãŒã·ã§ã³ããè¡ããŸãã ãå¿ã®äžã§ããããããããšããŠããŸãã ãã®ã¢ã¯ã·ã§ã³ã®çµæã¯ãã²ãŒã ã®ç¶æ³ã®å€åãã€ãŸãç°å¢ã®å¥ã®ç¶æ
ãžã®ç§»è¡ã«ãªããŸãã
- æ°ããç¶æ
ã¯ãç¶æ³ãè©äŸ¡ããæ©èœã«è»¢éããããã®çµæã¯ç¹å®ã®å€ãã€ãŸãã¢ã¯ã·ã§ã³ã®ã¹ã³ã¢ã«ãªããŸãã
- ã¹ã³ã¢ãèšç®ããåŸããããã¯æ°ããä»®æ³ç¶æ³ãããã§ã«å®è¡ã§ããã¢ã¯ã·ã§ã³ã®ãªã¹ããçæããŸãã 次ã«ããããã移åãå®äºãã以å€ã®ããšãã§ããããã«ãªããŸã§ãã¹ããã2ãš3ãååž°çã«ç¹°ãè¿ããŸãã
- åãããªãŒã¬ãã«ã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã®ãã€ã³ããèšç®ããããšãæ倧ã¹ã³ã¢ã¯ããªãŒã®èŠªã¬ãã«ã«æ»ããã¢ã¯ã·ã§ã³ã®åãªã¹ããçæããã¢ã¯ã·ã§ã³ã®ã¹ã³ã¢å€ã«å ç®ãããŸãã ãããã£ãŠã ã¹ã³ã¢å€ã¯ãããªãŒã®æ¥µç«¯ãªæããæ ¹ãŸã§ããããã¢ãããããããã«èŠããŸãã
- ããªãŒã®ééãå®äºãããšããã®æç¹ã§ããããå®è¡ã§ããåã¢ã¯ã·ã§ã³ã«ã¹ã³ã¢ãä»ããããŸãã ããã§ãæ倧ã¹ã³ã¢ã®ã¢ã¯ã·ã§ã³ãéžæããŠé©çšããã ãã§ãã
以äžã¯ããã®ã¢ã«ãŽãªãºã ã説æããååž°é¢æ°ã§ãã
ããããã®ã³ãŒãfunction buildActionBranch (situation) { var actionList = createActionList(situation); for(var i = 0; i < actionList.length; i++){ if(actionList[i].type !== "endTurn") { actionList[i].branch = buildActionBranch(actionList[i].newSituation); actionList[i].score = actionList[i].selfScore + actionList[i].branch[0].score; } else { actionList[i].score = actionList[i].selfScore; } } actionList.sort(function (a, b) { if (a.score <= b.score) { return 1; } else if (a.score > b.score) { return -1; } }); return actionList; }
ããã¯ãååž°é¢æ°ã®æŠç¥å³ã«ãããŸãããå®éãããªãŒã®æ§ç¯ã«ã¯åŸ®åŠãªéãããããŸããããã«ã€ããŠã¯åŸã§èª¬æããŸãã ãŸãã決å®æšã«é¢ããããŒã¿ããã¡ã€ã«ã«æžã蟌ãããã®é¢æ°ãå®è£
ããŸãããããã«ãããåŸã§ã©ã®ããã«èŠããããæ確ã«ç¢ºèªã§ããŸãã
ãã·ãžã§ã³ããªãŒïŒJSONãã¡ã€ã«ãµã€ãºïŒ4kbïŒãã®ããªãŒã¯ç§»åçšã«æ§ç¯ãããŠããããã£ã©ã¯ã¿ãŒã¯ãã§ã«å°ããšãã«ã®ãŒãæ¶è²»ããŠãããéžæã§ãããªãã·ã§ã³ã¯5ã€ã ãã§ãããå
ãåœãŠããæ©èœã䜿çšããŠç§»åãå®äºãããšã3ã€ã®é£æ¥ã»ã«ã«ç§»åããŸãã åããŒãã§ãã¢ã¯ã·ã§ã³ã®ååã
ã¹ã³ã¢ ïŒäžã®å³ïŒããã³
selfScoreïŒäžã®å³ïŒã確èªã§ããŸãã ã«ãŒãã¬ãã«ã§
ã¹ã³ã¢ãã©ã®ããã«åœ¢æãããããç°¡åã«è¿œè·¡ã§ããŸãã ãã¹ãŠã®é
åã
scoreã§ãœãŒããããŠãããšããäºå®ã«ãããæé©ãªãœãªã¥ãŒã·ã§ã³ã¯åžžã«äžçªäžã«ãããŸãã å¥ã®ããªãŒãæ€èšããŠãã ããã
æé©ãªãœãªã¥ãŒã·ã§ã³ãéããããªãŒïŒJSONãã¡ã€ã«ãµã€ãºïŒ169kbïŒæ®å¿µãªãããé«ãçŽ80,000ãã¯ã»ã«ãããããããã®å Žåã®å®å
šãªããªãŒã衚瀺ããããšã¯ã§ããŸããã éãããã©ã³ããå³ããå·Šã«èŠãŠãããŸãããã
377ïŒã¿ãŒã³çµäºïŒ+ 378ïŒç§»åïŒ+ 373ïŒDefender Of The Faithãã£ã¹ãïŒ+ 312ïŒãã£ã¹ãPunishment DueïŒ+ 218ïŒç§»åïŒ= 1658
移åã¢ã¯ã·ã§ã³ã®å Žåã
ã¹ã³ã¢å€ã¯1660ã§ãã衚瀺æã®æ°åã®æŽæ°å€ãžã®äžžãã«ãããå·®ã¯2ãã€ã³ãã§ãã ããªãŒã®æåã®ã¬ãã«ã®
selfScoreå€ãèŠãŠã¿ãŸããã
ãselfScoreã218ã®moveã¢ã¯ã·ã§ã³ã¯ãè¿é£ããŒãã®äžã§æ倧ã§ã¯ãããŸããã ãã®ã¬ãã«ã§ã®æåã®ã¢ã¯ã·ã§ã³ã¯ãDefender Of The FaithïŒ
selfScore = 244ïŒã䜿çšããããšã§ãã ãã ãã
移åã¢ã¯ã·ã§ã³ã®åèšã¹ã³ã¢ïŒ1660察1652ïŒã¯äŸç¶ãšããŠå€§ãã
ãªããŸãã ã³ãŒã¹å
šäœã®ã¢ã¯ã·ã§ã³ãèããªããã°ããã®ç¶æ³ã§èœåã䜿çšããããšã¯ããã»ã©æé©ã§ã¯ãªãããšãããããŸãã
次ã«ããã®ã¢ã«ãŽãªãºã ã®ããŸããŸãªåŽé¢ã詳ããèŠãŠã¿ãŸãããã
ç¶æ³ã®è©äŸ¡
ç¶æ³ãè©äŸ¡ããã«ã¯ã次ã®æ©èœã䜿çšããŸãã
ããããã®ã³ãŒã function situationCost (activeChar, myTeam, enemyTeam, wallPositions){ var score = 0; var effectScores = 0;
ãã®ã¡ãœããã¯ãæŠéã«é¢äžãããã¹ãŠã®ãã£ã©ã¯ã¿ãŒãå®è¡ããããŸããŸãªãã©ã¡ãŒã¿ãŒã«å¯ŸããŠäžå®ã®ãã€ã³ããç²åŸããŸãã
ã¢ã¯ã·ã§ã³ã·ãã¥ã¬ãŒã·ã§ã³
ãããã¢ã¯ã·ã§ã³ã®çµæãè©äŸ¡ããã«ã¯ïŒ
- ç°å¢ã®ç¶æ
ãå®å
šã«ã³ããŒããŠããã以éã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ãå
ã®ç¶æ
ã«å€åããªãããã«ããŸã
- ã¢ã¯ã·ã§ã³ïŒèœåã®ç§»åãŸãã¯äœ¿çšïŒã®ã·ãã¥ã¬ãŒã·ã§ã³ãå®è¡ããŸã
- è©äŸ¡é¢æ°ã䜿çšããŠç°å¢ã®æ°ããç¶æ
ãè©äŸ¡ããŸã
ããšã§ã³ããŒã«æ»ããŸãããããã§ã¯ãã²ãŒã ã§æãåçŽãªã¡ã«ããºã ã®1ã€ã§ãããDie By The Swordãã®äŸã«åºã¥ããŠãã·ãã¥ã¬ãŒã·ã§ã³ãäœã§ãããã詳ããèŠãŠãããŸãã
ã²ãŒã å
ã®åèœåã«ã¯ããã¡ãŒãžãäžããããå埩ããããå¹æãé©çšããããã
ãã£ã¹ãæ©èœããããŸãã
ãDie By The Swordãã®
ãã£ã¹ãé¢æ°ãèŠãŠã¿ãŸãããã
ããããã®ã³ãŒã cast : function (caster, target, myTeam, enemyTeam, walls) { caster.spendEnergy(this.energyCost()); caster.spendMana(this.manaCost()); this.cd = this.cooldown(); if(caster.checkHit()){ var physDamage = randomService.randomInt(caster.minDamage * (1 + this.variant * 0.35), caster.maxDamage * (1 + this.variant * 0.35)); var critical = caster.checkCrit(); if(critical){ physDamage = caster.applyCrit(physDamage); } physDamage = target.applyResistance(physDamage, false); caster.soundBuffer.push(this.name); target.takeDamage(physDamage, caster, {name: this.name, icon: this.icon(), role: this.role()}, true, true, critical, myTeam, enemyTeam); } else { caster.afterMiss(target.charName, {name: this.name, icon: this.icon(), role: this.role()}, myTeam, enemyTeam); } caster.afterCast(this.name, myTeam, enemyTeam); }
ãã®é¢æ°å
ã«ã¯ãã©ã³ãã ãªæ§è³ªã®å°ãªããšã3ã€ã®æäœïŒæå·ã®å€å®ããããã®å€å®ãã¯ãªãã£ã«ã«ãããã®å€å®ïŒãããã³ã¯ã©ã€ã¢ã³ãã§åçãããµãŠã³ãã®è¿œå ãªã©ã®å®çšçãªæ¹æ³ãããããšãããããŸãã åœç¶ãçµæãäºæž¬ããããšã«ãªããšããã®é¢æ°ã䜿çšã§ããŸããã ãããã£ãŠã
ãã£ã¹ãé¢æ°ã«å ããŠãåèœåã«ã¯
castSimulationããã
ãŸã ã
caster.spendEnergy(this.energyCost()); caster.spendMana(this.manaCost()); this.cd = this.cooldown(); var physDamage = (caster.minDamage * (1 + this.variant * 0.35) + caster.maxDamage * (1 + this.variant * 0.35)) / 2; physDamage = caster.hitChance * ((1 - caster.critChance) * physDamage + caster.critChance * (1.5 + caster.critChance) * physDamage); physDamage = target.applyResistance(physDamage, false); target.takeDamageSimulation(physDamage, caster, true, true, myTeam, enemyTeam); caster.afterCastSimulation(this.name);
åãæ¹æ³ãåãã®åäœãã·ãã¥ã¬ãŒãããããã«äœ¿çšãããŸã-åã«äžå¿
èŠãªãã®ãåãåããã©ã³ãã ãªæ¹æ³ãæ°åŠçæåŸ
ã«çœ®ãæããŸãã
æé©å
åºæ¬çãªã¢ã«ãŽãªãºã ãæ§ç¯ãããåŸãç§ã¯æåã«ãããã移åãæ€èšããè¡åãèµ·ããããšãèŠãŸããã ç¹å®ã®ç¶æ³ã§äœããã¹ãããèªåãã¡ãã©ã®ããã«æ±ºå®ããããèŠãã®ã¯ãšãŠãã¯ãŒã«ã§ããã ãããããã®åŸã次ã®åé¡ãçªç¶æµ®äžããŸãã-æã
圌ãã¯ãã£ããé·ããšæã
Node.jsããªãŒã®èšç®ãå¿ããããã«pingã€ãã³ããçºçããªãããã
Socket.ioãã¯ã©ãã·ã¥ããŸãã æé©åãè¡ãæéã§ãã
1ïŒãããŒãªãªãŒã¹
ç§ãæåã«æãã€ããã®ã¯ãããªãŒã®æ§ç¯ãéåæã«ããããšã§ããã
éåæã©ã€ãã©ãªãš
eachOfã¡ãœããã䜿çšããŠãã¢ã¯ã·ã§ã³ãªã¹ããééãããã¹ãŠã®ãã¹ãéåæã«å€æãããã¹ãŠã®
ã³ãŒã«ããã¯ã«æ»ããŸãã ããããããã¯æªåããã ãã§ã:(ããªãŒã¯ããé
ããååã®æéã§æ§ç¯ãããæ·±ãããªãŒã®éåææ§ç¯ã®ãããã°ã¯å¥ã®æ¢æ±ã§ã...
ãã®åŸã
process.nextTickã®å®éšãéå§ããããŸããŸãªã³ãŒããã©ããããããšããŸããããå¹æã«æ°ä»ããŸããã§ããã
ãã®çµæãç§ã¯æ¬¡ã®ã¹ããŒã ã«å°éããŸããïŒ
- ã¢ã¯ã·ã§ã³ã®æåã®ãªã¹ãã«ã€ããŠã¯ãéåæçã«ãã©ã³ãã®æ§ç¯ãéå§ããŸãã
- ãã¹ãŠã®ãã¹ãããããã©ã³ãã«ã€ããŠãããªãŒã®æ§ç¯ã¯åæçã§ãã
ããããã®ã³ãŒã function buildActionBranchAsync(myTeam, enemyTeam, activeCharId, wallPositions, cb){ var self = this; var actionList = self.createActionList(myTeam, enemyTeam, activeCharId, wallPositions); async.eachOf(actionList, function(actionInList, index, cb){ process.nextTick(function() { if(actionInList.type != "endTurn" ) { actionInList.branch = self.buildActionBranchSync(actionInList.myTeamState, actionInList.enemyTeamState, actionInList.activeCharId, wallPositions); if(actionInList.branch && actionInList.branch[0]) { actionInList.score = actionInList.selfScore + actionInList.branch[0].score; } else { actionInList.score = actionInList.selfScore; } } else { actionInList.score = actionInList.selfScore; } cb(null, null); }); }, function(err, temp){ if(err){ return console.error(err); } actionList.sort(function (a, b) { if (a.score <= b.score) { return 1; } else if (a.score > b.score) { return -1; } }); cb(actionList); }) }
ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãç§ãã¬ãã¥ãŒãããã®ã®äžã§æé«ã®ãã®ã§ããããšãå€æããŸããããäŸç¶ãšããŠãããã¯ãããŠããŸãã ãœã±ããã¯ç§»åã®é·ããçèãã§èœäžãç¶ããŸãã ããªãŒãæ§ç¯ãã
process.nextTickã䜿çšããã¢ãŒããã¯ãã£ã®å€æŽã«é¢ããã¢ã€ãã¢ããæã¡ã®æ¹ãããã°ãåãã§ãæäŒãããŸãïŒ
2ïŒã¡ã¢ãªã解æŸãã
å¥ã®åé¡ã¯ãããããé·ãéèããŠããããã
JavaScriptããŒãã®çš®é¡ã®ãšã©ãŒ
ãã¡ã¢ãªäžè¶³ã«ãªãããšã§ããã ãã·ãžã§ã³ããªãŒãããã©ã«ãã®512 MBã®ã¡ã¢ãªã¹ããŒã¹ã«åãŸããªããããRAMã®ãªãŒããŒãããŒãããããšã¯æããã§ãã ãã¡ãããå²ãåœãŠãããã¹ããŒã¹ãæ¡åŒµããããšãã§ããŸãããããã¯ãŸã ééã£ãŠããŸããæå°éã«æããããã«ããŠãã ããã ç§ã®ã¢ãŒããã¯ãã£ã®åŒ±ç¹ã¯ãããªãŒãæ§ç¯ããããšãã®ãã¹ãŠã®æŠéç¶æ³ã®ç¶æ
ãä¿åããªããã°ãªããªãã£ãããšã§ãã ãŸãããªããžã§ã¯ãã¯ã·ãã¥ã¬ãŒã·ã§ã³ã®åã«å®å
šã«ã³ããŒããããããã¡ã¢ãªã¯åã«è©°ãŸã£ãŠããŸãã ç§ãæåã«ããããšã¯ãããªãŒãæ§ç¯ããåã«ãªããžã§ã¯ãã®ééãæžããããšã§ããã ãã®ãããããšãã°ãã·ãã¥ã¬ãŒã·ã§ã³ã«ãŸã£ããé¢ä¿ããªã
Characterãªããžã§ã¯ãã®ããããã£ãããã€ããããŸããã€ã³ãã³ããªããã°ãžã®ã¡ãã»ãŒãžã®é
åãåçãããµãŠã³ãã®é
åããã£ã©ã¯ã¿ãŒã®ãã¬ãŒã ã®è²ãªã©ã§ãã ããã§ãããªãŒãæ§ç¯ããåã«ããã£ã©ã¯ã¿ãŒãªããžã§ã¯ãã次ã®ããã«è§£æŸãããŸãã
ããããã®ã³ãŒã function lightWeightTeamBeforeSimulation(team){ delete team.teamName; delete team.lead; for(var i = 0; i < team.characters.length; i++){ var char = team.characters[i]; delete char.battleTextBuffer; delete char.logBuffer; delete char.soundBuffer; delete char.battleColor; delete char.charName; delete char.gender; delete char.isBot; delete char.portrait; delete char.race; delete char.role; delete char.state; delete char.calcParamsByPoint; delete char.calcItem; delete char.updateMods; delete char.removeRandomBuff; delete char.removeRandomDebuff; delete char.removeAllDebuffs; delete char.removeRandomDOT; delete char.stealRandomBuff; delete char.afterDealingDamage; delete char.afterDamageTaken; delete char.afterMiss; delete char.removeImmobilization; delete char.afterCast; delete char.getSize; for(var j = 0; j < char.abilities.length; j++){ var ability = char.abilities[j]; delete ability.cast; delete ability.icon; delete ability.role; } for(j = 0; j < char.buffs.length; j++){ var effect = char.buffs[j]; delete effect.icon; delete effect.role; delete effect.apply; } for(j = 0; j < char.debuffs.length; j++){ var effect = char.debuffs[j]; delete effect.icon; delete effect.role; delete effect.apply; } } return team; }
ãããã£ãŠãåæåã®ãªããžã§ã¯ãã®ãµã€ãºã40ïŒ
以äžåæžããããšãã§ããŸããã ããããããã§ãç§ãå®å
šãªèšæ¶ããæããŸããã§ããã ãã®åé¡ã«ã€ããŠååãšè©±ãåã£ããšããããã©ã³ããã¡ã¢ãªã«ä¿åããŠãã¢ã¯ã·ã§ã³ã®ãªã¹ããè¿ãããåŸã¯æå³ããªãããšãããããŸããã çµå±ã®ãšãããç§ãã¡ã¯æãæåãããœãªã¥ãŒã·ã§ã³ã«ã®ã¿èå³ããããæ®ãã¯äžèŠã§ãã ããã§ãçµæãè¿ããçŽåŸã«ããã©ã³ããåé€ãããŸãïŒ
ããããã®ã³ãŒã function buildActionBranchSync: function(myTeam, enemyTeam, activeCharId, wallPositions){ var actionList = this.createActionList(myTeam, enemyTeam, activeCharId, wallPositions); for(var z = 0; z < actionList.length; z++){ actionList[z].branch = this.buildActionBranchSync(actionList[z].myTeamState, actionList[z].enemyTeamState, actionList[z].activeCharId, wallPositions); actionList[z].score = actionList[z].selfScore + actionList[z].branch[0].score; delete actionList[z].branch; } return actionList; }
ãã®åŸãã¡ã¢ãªãªãŒããŒãããŒãæ°žé ã«å¿ããŠããŸããã
3ïŒã¢ã¯ã·ã§ã³ã®ãªã¹ããççž®ãã
以åã®ãã¹ãŠã®æé©åã«ããããããã移åã«ã€ããŠèããããšã¯ãŸã çŽ30ç§ããããŸãã:(次ã®ã¹ãããã¯ãç¶æ³ã«å¿ããŠäœ¿çšã®èš±å®¹æ§ã説æããåèœåã«è¿œå ã®
usageLogicé¢æ°ãè¿œå ããããš
ã§ãã ããã®æ©èœãå«ãã¢ã¯ã·ã§ã³ã®ãªã¹ããäœæããåã«ã次ã®ãã¹ããå®è¡ããŸãã
usageLogic: function(target) { return target.curHealth < target.maxHealth * 0.6; }
ãããã£ãŠããããã¯ããã¹ããŒãã«ãªããéžæããã¢ã¯ã·ã§ã³ã®æ°ã倧å¹
ã«åæžãããŸããã ããã«ãããããããå€æ°ã®ã¢ã¯ã·ã§ã³ãçæãã1ã€ã®èœåããããŸããã
ãã¹ããŒããªãã©ã€ããæ©èœã䜿çšãããšããã£ã©ã¯ã¿ãŒãåšå²6ã»ã«ã®ååŸå
ã®äœçœ®ã«å ç±ã§ããŸããææªã®å Žåããã®æ©èœã«ãã£ãŠ35ã®ã¢ã¯ã·ã§ã³ãçæãããããšãããããŸãã ããã§ã®æ±ºå®æšã¯éåžžã«åºãã§ãã ãœãªã¥ãŒã·ã§ã³ã¯ãèœåã®
usageLogicé¢æ°ã®å®è£
ãçµããåŸãèªç¶ã«
çãŸããŸããã å®éã移åã«å€±æãããã€ã³ããé€å€ããããšãã§ããŸãã äœçœ®ã®éã¿ãš
calculatePositionWeighté¢æ°ã«ã€ããŠã¯ãã§ã«è¿°ã¹ãŸããã ãããã£ãŠã移åå¯èœãªã»ã«ã®ãªã¹ããäœæãã段éã§ãããããã®åçæ§ãè©äŸ¡ããæã匱ãããžã·ã§ã³ãé€å€ã§ããŸãã
ããããã®ã³ãŒã var bestMovePoints = []; var movePoints = arenaService.findMovePoints(myTeam, enemyTeam, activeChar, false, wallPositions); for(var i = 0; i < movePoints.length; i++){ var weights = arenaService.calculatePositionWeight(movePoints[i], activeChar, myTeam.characters, enemyTeam.characters, arenaService.getOptimalRange(activeChar), wallPositions); bestMovePoints.push({ point: movePoints[i], weightScore: weights[0] * 6 + weights[1] * 4 }) } bestMovePoints.sort(function (a, b) { if (a.weightScore <= b.weightScore) { return 1; } else if (a.weightScore > b.weightScore) { return -1; } }); bestMovePoints = bestMovePoints.slice(0, 3); for(j = 0; j < bestMovePoints.length; j++){ }
ç§ã¯ãã®ã¢ãããŒãããéåžžã®åããšãã£ã©ã¯ã¿ãŒãåããèœåã®äž¡æ¹ã«é©çšããŸããïŒ
ãå
ã®é床ã ïŒã
4ïŒæèã®éŸå€
ãã®æé©åãè¡ã£ãŠãã審è°ãé
ããå ŽåããããŸãã
ãåæ¢ããããªããèœåã¯ã850ãŠãããã®ãšãã«ã®ãŒãå埩ããŸãããã®èœåã䜿çšããå¯èœæ§ã¯ãæèæéã2åãããã«ã¯3åã«å¢ãããŸãã äœããã®ã¢ã¯ã·ã§ã³ã®åŸããšãã«ã®ãŒãã»ãŒå®å
šã«å埩ããã³ãŒã¹ãæ¹ããŠèããããšãã§ããŸãã
ãã®ãããªãé·ãã審è°ãé¿ããããã«ãããªãŒãæ§ç¯ããããã®ãããå€æéãå°å
¥ããŸããã çŸæç¹ã§ã¯3ç§ã§ãã ã¢ã¯ã·ã§ã³ã®ãªãã·ã§ã³ãæã€æ°ãããã©ã³ããæ§ç¯ããåã«ãä»åãã§ãã¯ããŸãã
ãããè¶
ããå Žåãããã«ããªãŒãæ§ç¯ããããšã¯ã§ããããããã¯ãã§ã«ã«ãŠã³ããããã®ãèæ
®ããŠã¢ã¯ã·ã§ã³ãéžæããã ãã§ãããããã£ãŠãããŸããŸãªãã©ãããã©ãŒã ã§ã®ããã©ãŒãã³ã¹ã®åé¡ã解決ããŸãããããŒã«ã«ãã·ã³ã§ããªãŒãæ§ç¯ããé床ã¯1ç§ãããçŽ2000ã¢ã¯ã·ã§ã³ã§ãããç¡æãµãã¹ã¯ãªãã·ã§ã³ã®Herokuã¯ã©ãŠãã§ã¯1ç§ãããçŽ700ã¢ã¯ã·ã§ã³ã§ãããã©ãããã©ãŒã ãæäŸããã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ãå€ãã»ã©ããããã¯å²ãåœãŠããã3ç§ã§è§£æ±ºã§ããã¢ã¯ã·ã§ã³ãå¢ããŸããããããããšãã§ããªããŠãããããã¯ãŸã åããç¶ããããããã¬ã€ã€ãŒã«ãšã£ãŠã¯æ°ä»ãããã«æ®ãã§ãããããããã«
ãã®ããã決å®æšã䜿çšããŠåé¡ã解決ããããšãã§ããŸããããã®ã¢ãããŒãã®é·æãšçæãç解ããŠã¿ãŸããããå©ç¹ïŒ- ãããã®ãæèã®æµããå
šäœã远跡ãããšã©ãŒãèŠã€ããããšãã§ããŸã
- åèœåãå¹æãç¶æ³è©äŸ¡ãã€ã³ãã埮調æŽããããšã§ãæŠéã®ãã©ã³ã¹ãå¶åŸ¡ã§ããŸã
- ãã¬ãŒãã³ã°ãµã³ãã«ã®ããŒã¿ãåéããããããŒã¿ããŒã¹ã«ãµã³ãã«ãä¿åãããããå¿
èŠã¯ãããŸããã
- ããŒã¿ããŒã¹ã«ãã¥ãŒã©ã«ãããã¯ãŒã¯ã¢ãã«ãä¿åããå¿
èŠã¯ãããŸãã
- AIããããã«é©å¿ãããå¿
èŠãªããæ°ããèœåãç°¡åã«è¿œå ã§ããŸãã
æ¬ ç¹ïŒ- åã¢ã¯ã·ã§ã³ã«ã€ããŠãããªãŒããŒãããæ§ç¯ããå¿
èŠããããŸãããããã¯ãµãŒããŒãªãœãŒã¹ã«ãšã£ãŠéåžžã«é«äŸ¡ã§ã
- ãããã¯èšç·ŽãããŠããŸããã圌ãã¯åãééããäœåºŠãç¹°ãè¿ããŸãã
- å
éšã®ææ決å®ã¢ã«ãŽãªãºã ããããã°ããã³æ§æããå¿
èŠããããŸã
ãã¡ãããåŠç¿äžè¶³ã¯ç§ãéåžžã«æãããŸãããã ãããã¥ãŒã©ã«ãããã¯ãŒã¯ãšçµã¿åãããŠãã·ãžã§ã³ããªãŒã䜿çšããŠAIãæ¹åããã¢ã€ãã¢ããããŸããçŸæç¹ã§ã¯ãç¶æ³ãè©äŸ¡ããæ©èœã«ã¯ãã²ãŒã ç¶æ³ã®ç¹å®ã®ããããã£ã®ãã€ã³ãæ°ã決å®ããäžå®ã®å€ããããŸããããšãã°ããã¬ãŒã€ãŒã®ãã«ã¹ãŠãããæ°ã®ã¹ã³ã¢ãã€ã³ãïŒ score += activeChar.curHealth / activeChar.maxHealth * 110;
ççŽã«èšã£ãŠã110ãšããæ°åã¯å€©äºããæ¥ããã®ã§ãä»ã®å®æ°ãšã»ãŒãã©ã³ã¹ãåããŠããŸããããããå€æŽããŠãããã®åäœãã©ã®ããã«å€åãããã確èªããããšã誰ãçŠããŠããŸãããææ決å®æ©èœãããã¹ãŠã®å®æ°ãåéãããšããã®ãã²ãã ããååŸããŸãããã®åŸãããŸããŸãªãã²ãã ãã§äžé£ã®å®éšãè¡ããã»ãšãã©ã®æŠéã§åå©ãããã®ãèŠã€ããããå®éã®ãã¬ã€ã€ãŒãšã®æŠéçµæã«åºã¥ããŠæé©ãªãã²ãã ãã®éžæãèªååããããšãã§ããŸããããããããã¯ãŸã£ããç°ãªã話ã«ãªããŸãããããã®èšäºããã¹ã¿ãŒããŠããã ããããããšãããããŸããç§ã®çµéšãããããžã§ã¯ãã«äººå·¥ç¥èœãæã¡èŸŒã¿ããåå¿è
ã®ã²ãŒã éçºè
ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸããPS . , . , .