全プログラミングキッズ待望のゲームができた!コードで戦うゲーム

時々、思ったことはありませんか?

アニメとかゲームとかの設定でよくある、すごいプログラマーがいて、そのプログラミング力で敵を倒すやつ。やってみたいと…!

ガンダムSEEDみたいにモビルスーツのOSをチャチャッと書き換えて、敵に勝つやつですよ。

「男と生まれたからには誰でも一生のうち一度は夢見る「地上最強の男」」

ってよく聞きますよね(笑)。

まー私は女ですが、強さを決めるってなんかワクワクしますよね。( ˊᵕˋ )

競技プログラミングとかもありますが、

「なんかこう燃えないな~」

と思っていませんでしたか?

なんかもっと、直接バトルっぽいApexっぽいのがやりたいな~ とか!

(·:゚д゚:·)ハァハァ
すみません、中二病全開が過ぎましたね。

それがなんと、そんなゲームができたらしい。

JavaScriptを打ってキャラを操作する対戦ゲーム、Steamで配信 Rustなど計13以上の言語にも対応

https://www.itmedia.co.jp/news/articles/2204/08/news140.html

 

というわけで、早速やってみます。

最初につまづいたのが、

オール英語。

そっか。そりゃそうか。

なので操作方法とか、そもそもどうすればいいのかがわかんなかったところも多くありました。

APIのドキュメントも字が小さい(笑)

しかし、チュートリアルもついているのが優しい!これありがたかった~

自分のチームの部隊をどうやって動作させるか、などはチュートリアルにサンプルコードがあるので、それで大体わかります。

というわけで、早速作ってみました。

私が作ったコードは結局2時間ぐらい取り組んでチュートリアルをつぎはぎしたにすぎません…。

でも、対戦してそこそこ勝てた(笑)

下記の動画で、白いのが私のコマで、違う色が敵さんです。この動画では、2戦して、2戦とも勝てました v( ̄Д ̄)v イエイ (最初の敵さんはピクリとも動かなかったのと、2回目の敵さんは辛勝でしたね(笑))

 

 

これ、動作させている途中にコードを書き換えることはできません。

この動画で動作させているコードはこちら。javascript です。

import {getObjectsByPrototype} from '/game/utils';
import {findInRange} from '/game/utils';
import {Creep} from '/game/prototypes';
import {Flag} from '/arena/prototypes';
import { getTicks } from '/game/utils';
import { ERR_NOT_IN_RANGE, ATTACK, RANGED_ATTACK, HEAL, OK } from '/game/constants';

export function loop() {
    var enemyFlag = getObjectsByPrototype(Flag).find(object => !object.my);
    var myCreeps = getObjectsByPrototype(Creep).filter(object => object.my);
    for(var creep of myCreeps) {

        
        let targets = getObjectsByPrototype(Creep).filter(c => !c.my);

      if(creep.body.some(bodyPart => bodyPart.type == ATTACK)) {
         attack(creep, targets)
      }

      if(creep.body.some(bodyPart => bodyPart.type == RANGED_ATTACK)) {
         rangedAttack(creep, targets)
      }

      if(creep.body.some(bodyPart => bodyPart.type == HEAL)) {
         heal(myCreeps, creep)
      }

      creep.moveTo(enemyFlag);

    }
    console.log('Current tick:', getTicks());
}

function rangedAttack(creep, targets){
   let targetsInRange = findInRange(creep, targets, 3);
   let result
   if (targetsInRange.length >= 3) {
      result = creep.rangedMassAttack();
      console.log('遠隔全体攻撃 結果')
      console.log(result)
   } else if (targetsInRange.length > 0) {
      let result = creep.rangedAttack(targetsInRange[0]);
      console.log('遠隔攻撃 結果')
      console.log(result)
   }
}

function attack(creep, targets){
   let target = creep.findClosestByRange(targets);
   if (target){
      creep.move(target);
      const result = creep.attack(target);
      console.log('攻撃 結果')
      console.log(result)
   }
}

function heal(myCreeps, creep){
   var myDamagedCreeps = myCreeps.filter(i => i.hits < i.hitsMax);
   if(myDamagedCreeps.length > 0) {
      const heal_result = creep.heal(myDamagedCreeps[0])
      if(heal_result == ERR_NOT_IN_RANGE) {
         console.log('遠くてHealできないので近づきます')
         creep.moveTo(myDamagedCreeps[0]);
      }else if(heal_result == OK){
         console.log('Healした')
      }
   }
}

コードの説明を軽くすると、これを、PC内の所定のディレクトリにおいておけば、このゲームが勝手にサーバーにアップロードしてくれて動作するという仕組みみたいです。
なので、勝敗はもうPlayボタンを押したときに決まっているわけですね。

動作させるとタイムフレームが1個ずつ進み、loopという関数の中が実行されます。
console.logが使えて、出力内容は盤面の下に表示されます。

自分の部隊、敵さんの部隊はcreep というオブジェクトで、これの中にまたBody Partというものがあって、それにattack とかranged attack とかなどの属性があるようです。

ちょっとしょぼいコードではありますが、とりあえずやってみたい人の参考になればと思い、載せておきます!

やりこみ要素はもっとあって、例えば陣地の中にある塔からビームを出したり、その塔にエネルギーをチャージしたり(?)などもできるみたいです!

(すみません、時間の都合でチュートリアルの半分しかやってない)

 

Steamで配信中で、2000円ぐらいです。⊂(^-^)⊃

 

いや、でもこれ作った人達すごいわ。

感謝ですね!

 

余談ですが、今日は日曜日なんですけど、PHPerkaigiというPHPのオンラインの勉強会があったり、このゲームやったり、プログラミング三昧です。

それが楽しいんでいいんですけどね!⊂(^-^)⊃