未来ハッカーというミニゲームをやってみた

2021年5月10日月曜日

JavaScript 日記

先日のこと。なんだかヤル気が起きないなぁ…という感じだったので、気分転換に「未来ハッカー」というミニRPGをやってみました。これは僕がプログラミング学習に使わせて頂いているAkichonプログラミング講座チャンネルさんが作成したミニゲームです。説明を見ると一時間くらいでクリアできるようなことが書いてありましたので気分転換に丁度良いかな?と。ただ実際にプレイしてみると思いのほか時間がかかりましたけど…。ゲームをやってみたい場合は↓の記事から。

OGP画像



なんだかんだでクリアできるだろう、と考え開始したわけですが…クリアできませんでした。正確には途中でクリアを断念ラスボス直前で思いのほか時間がかかったことで面倒になってしまったのです。今回はその経緯と簡単なゲーム紹介をしたいと思います。


指差しする犬


ゲーム序盤は四則演算するくらいなので本当に簡単です。僕はマウスでポチポチ押して操作していたので押し間違いとかがちょっと面倒でしたけど。ノーダメージでクリアするのは難しいと思います。できたら変態です。結構早い間隔でダメージが入るので初見でノーダメクリアは不可能。初見じゃなくても無理だと思う。ただ回復ポイントが結構多いのでダメージはあまり気にしないで良いと思います。そしてサクサク進めていき始まった中ボス戦…いきなり死亡。


落ち込み泣く男


序盤でいきなり負けるとは思っていなかったので結構ショックでした。レベルをもう一つ上げておけばいけたかも(レベルを上げると考えられる時間が増えるから)。最初は焦って頭の中が真っ白状態だったのですが、二度目の挑戦で中ボスにはリベンジ。答えが分かってみると良い問題だなぁ…と思いました。その後はレベル上げをしっかり行うことで死亡することなく順調に進めていきました。そうして迎えたラスボス直前の戦い。出てきたのは↓のコード。


プログラムコード


ちょっと分かりづらいかもしれないですが、一番左のrocker関数を実行したときにrの値が「111」になるように青枠がある変数値を書き換えるという問題。rockerにreturnがなかったりfunctionがfuncに省略されていたり…と色々ツッコミどころはありますが、そこはスルーで。ただ一つだけスルーできない箇所がある。それは_enka_関数内でreturn直前にr=x-luck;としているところ。パッと見でif文は無視して良いんだな…と思い考えていたわけですが、全然答えが出ない。おおよその数字を入れて戻り値を確認してみると予想外の数字が返ってくる。表示されているコードがおかしいのか僕が何かを見落としているのか…。間隔の短い攻撃と混乱から焦りでいっぱいだったわけですが、途中であることに気づきました。思いのほかHPに余裕があるな…そこで分かりやすい数字を入れて挙動を確かめ、ノンビリ考えていると↓の式を満たす値にすれば良いとわかりました。


20*rock + 8*rack - 5*luck  + 17 = 111


↑の式を満たす正の整数値を適当に打ち込んでみたらクリアできました。が、さらに雑魚戦をしなければならない展開に疲れてゲーム終了。↑のコードを考えるのに時間をかけ過ぎて眠る予定の時間を過ぎていたのです。たぶん一時間以上悩んでいたと思います。クリアは断念したわけですが、翌日に納得いかなかったコードの検証をしてみました。その結果、本来は↓のようなコードが正しかったのではないかな?と。



<script>
rocker();

function rocker(){
  let r = 0;//これも必要
  rock = 0;
  for(i=0;i<5;i++){
    v = _ilove(i);
    x = _enka_(v);
    r+=x;
    r+=rock;
    r+=rock;
    r+=rock;
    r+=rock;
  }
  console.log(r);
}

function _ilove(key){
  lock=[1,2,3,8,9];
  r=lock[key];
  return(r);
}

function _enka_(x){
  rack = 13;
  luck = 2;
  
  if(x<4){
    r=x*rack;
  }else{
    r=x+rack;
  }
  
  //r=x-luck;こちらは間違い
  r-=luck;//こちらが正しい
  return(r);
}

</script>


黄色で下線を引いてある部分です。r=x-luckではなくて内部的にはr=r-luckがされていたのだと思います。あと関数rocker内でrの変数宣言も必要です。そうしないと全てのrが共通のグローバル変数になってしまい、問題が解けなくなります。値が小数値でも良いなら解けるのですが、ゲーム内では正の整数だけみたいなので。しかし変数宣言されていないとややこしいですね。スコープの学習を促すためにわざと間違えたのかな?それとも実はJavaScriptじゃなくて別の言語で書かれたものだったり?まぁそのへんはよくわかりません。とりあえずモヤモヤは解決したので良しとする。気が向いたらまたプレイして今度はちゃんとクリアしようと思います。

最新の投稿

このブログを検索

ブログ アーカイブ

自己紹介

ひきこもっていたらお爺さんになりました…嘘です。プロフ写真はFaceAppで老化したものです。本人はもう少しだけ若いです。
ブログ管理者は15年程ひきこもっている、長期ひきこもりのオッサンです。現在ブログは休止中。再開は未定です。 詳細なプロフィール

QooQ