alienHRNの訓練日記

IT業界初心者で勉強中。

◆20200812 回復量が敵攻撃力に追いつかないDQ

簡易版ドラゴンクエストを利用した問題演習

 
問題1
画像を指定したキャラに変更
問題2
ライフがマイナスになった時に0になるように設定
問題3
回復処理を作成(HTML側で回復のボタンは作成済み)
問題4
回復値がキャラの最大HPを超えないように設定
 
追加問題1
勝敗判定を行い、判定後にボタンを消す設定
追加問題2
負けたキャラの画像を消すように設定
 
 
一通り解いてみたが、キャラを好きに変更したり死んだ時の画像に切り替え
たりもできるのでいろいろいじってみると面白いかも。
 
回復ボタンを駆使しながらゾーマを攻略しようとしても回復量がしょぼすぎる
ので全く役にたたない・・・。
 
 
〇この問題で得た知識・できるようになったこと
・キャラクター、職種、最大HP等を配列で管理する
・何回も使う変数は宣言して簡単に入力できるようにする

document.getElementById('ID名')

             .setAttributee('src', 配列名.画像名);

 →画像をブラウザに表示させる

 

document.getElementById('ID名')

             .innerHTML=配列名.配列の中の配列;

 →文字をブラウザに表示させる

 
・document.getElementById("ID名")
             .style.visibility = "hidden";
 →HTMLの'ID名'の部分をJSファイルから非表示設定する

・関数の設定・関数の呼び出しの記述の仕方
 
 
 
JSファイル

// プレイヤーリスト
var playerList = [
  { name: 'ライアン', job: '戦士', maxLife: 600, life: 600, attack: 1200, magic: 100, aliveImg: 'img/p_01.gif', deadImg: 'img/p_01dead.gif' },
  { name: 'クリフト', job: '僧侶', maxLife: 400, life: 400, attack: 500, magic: 800, aliveImg: 'img/p_02.gif', deadImg: 'img/p_02dead.gif' },
  { name: 'アリーナ', job: '武闘家', maxLife: 600, life: 600, attack: 1200, magic: 100, aliveImg: 'img/p_03.gif', deadImg: 'img/p_03dead.gif' },
];

// 出現する敵リスト
var enemyList = [
  { name: 'バラモス', maxLife: 4000, life: 3500, attack: 400, dead: 0, aliveImg: 'img/e_01.gif', damageImg: 'img/e_01damage.gif' },
  { name: 'ゾーマ', maxLife: 4500, life: 4000, attack: 450, dead: 0, aliveImg: 'img/e_02.gif', damageImg: 'img/e_02damage.gif' },
  { name: 'デスピサロ', maxLife: 5000, life: 4500, attack: 500, dead: 0, aliveImg: 'img/e_03.gif', damageImg: 'img/e_03damage.gif' },
];



// playerの番号(pNum)とenemyの番号(eNum)を宣言をしておくことで
// 番号を変えるだけで画像・HPが入れ替わるようになる
var pNum = 0
var eNum = 1




// プレイヤー画面表示
document.getElementById('playerImg').setAttribute('src', playerList[pNum].aliveImg);
document.getElementById('playerName').innerHTML = playerList[pNum].name;
document.getElementById('playerLife').innerHTML = playerList[pNum].life;


// 敵画面表示
// 問題1
// ゾーマを表示すること
document.getElementById('enemyImg').setAttribute('src', enemyList[eNum].aliveImg);
document.getElementById('enemyName').innerHTML = enemyList[eNum].name;
document.getElementById('enemyLife').innerHTML = enemyList[eNum].life;
// ここでは何も操作しない。上記のvar eNumを1に設定するだけでゾーマが表示される。







function attack() {
  // 問題2
  // 敵のライフがマイナスになった場合「0」に修正して表示すること
  console.log('攻撃');
  var attackPoint = Math.floor(Math.random() * playerList[pNum].attack);
  console.log(attackPoint);
  enemyList[eNum].life -= attackPoint;
  document.getElementById('enemyLife').innerHTML = enemyList[eNum].life;


  // if文を使って0未満になった時にコンソールとブラウザ上に.dead(HP=0)を
//表示するように設定する
  if (enemyList[eNum].life < 0) {
    console.log(enemyList[eNum].dead);
    document.getElementById('enemyLife').innerHTML = enemyList[eNum].dead;
  }


  enemyAttack();
  // ↑敵の攻撃。 enemyAttack()の設定は下部に記述アリ

}


function recover() {
  console.log('回復');
  // 問題3
  // 攻撃を参考に回復処理を作成すること
  // ※回復に使用する値はプレイヤーのmagic値を使用する
  // ※回復時も敵の攻撃を受けるようにする



  var healPoint = Math.floor(Math.random() * playerList[pNum].magic);

  console.log(healPoint);
  playerList[pNum].life += healPoint;
  document.getElementById('playerLife').innerHTML = playerList[pNum].life;
  enemyAttack();
  // ↑回復時の敵の攻撃


  // 問題4
  // 回復値がプレイヤーのmaxLife値を超えないようにすること


  // 回復した際に自分のHPがMaxHPを超えた場合、MaxHPを表示するように設定。
  if (playerList[pNum].life > playerList[pNum].maxLife) {
    console.log(playerList[pNum].maxLife);
    document.getElementById('playerLife').innerHTML = playerList[pNum].maxLife;
  };

}



// 敵攻撃設定
function enemyAttack() {
  console.log('敵攻撃');
  var enemyAttackPoint = Math.floor(Math.random() * enemyList[eNum].attack);
  console.log(enemyAttackPoint);
  playerList[pNum].life -= enemyAttackPoint;
  if (playerList[pNum].life < 0) {
    playerList[pNum].life = 0;
  }
  document.getElementById('playerLife').innerHTML = playerList[pNum].life;
}









// 追加問題1
// 勝敗判定をして勝敗決定後はボタンを非表示にすること

// 非表示にするためのコードは
// document.getElementById("ID名").style.visibility = "hidden";

// ※今回は使わないが表示するためのコードは
// document.getElementById("ID名").style.visibility = "hidden";


// 追加問題2
// 勝敗判定後負けたほうを非表示にすること



document.getElementById("controller").style.visibility = "visibility";
function attack() {
  console.log('攻撃');
  var attackPoint = Math.floor(Math.random() * playerList[pNum].attack);
  console.log(attackPoint);
  enemyList[eNum].life -= attackPoint;
  document.getElementById('enemyLife').innerHTML = enemyList[eNum].life;


  if (enemyList[eNum].life < 0) {
    console.log(enemyList[eNum].dead);
    document.getElementById('enemyLife').innerHTML = enemyList[eNum].dead;
  }
  enemyAttack();


  // 追加問題1の答え 敵のHPが0以下になったらボタンを非表示にする
  if (enemyList[eNum].life <= 0) {
    document.getElementById("controller").style.visibility = "hidden";

    // 追加問題2の答え 画像も消すようにする
    document.getElementById("enemyImg").style.visibility = "hidden";
  }
  //追加問題1の答え 味方のHPが0以下になったらボタンを非表示にする
  if (playerList[pNum].life <= 0) {
    document.getElementById("controller").style.visibility = "hidden";

    // 追加問題2の答え 画像も消すようにする
    document.getElementById("playerImg").style.visibility = "hidden";
  }
}



// 回復中も攻撃を受けるので回復ボタン側の設定もする
function recover() {
  console.log('回復');
  var healPoint = Math.floor(Math.random() * playerList[pNum].magic);
  console.log(healPoint);
  playerList[pNum].life += healPoint;
  document.getElementById('playerLife').innerHTML = playerList[pNum].life;
  enemyAttack();
  if (playerList[pNum].life > playerList[pNum].maxLife) {
    console.log(playerList[pNum].maxLife);
    document.getElementById('playerLife').innerHTML = playerList[pNum].maxLife;
  };


  // 追加問題1の答え 味方のHPが0以下になったらボタンを非表示にする
  if (playerList[pNum].life <= 0) {
    document.getElementById("controller").style.visibility = "hidden";

    // 追加問題2の答え 画像も消すようにする
    document.getElementById("playerImg").style.visibility = "hidden";
  }
}
 
 
 
 
 
以下今回の問題のHTMLファイル
 
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>関数</title>
  <link rel="stylesheet" href="css/style.css">
</head>
<body>
  <div class="box">
    <div class="inner">
      <div class="status">
        <div class="player">
          <div class="img">
            <img id="playerImg" src="img/p_01.gif">
          </div>
          <div class="name">
            名前:<span id="playerName"></span>
          </div>
          <div class="life">
            体力:<span id="playerLife">0</span>
          </div>
        </div>
        <div class="enemy">
          <div class="img">
            <img id="enemyImg" src="img/e_01damage.gif">
          </div>
          <div class="name">
            名前:<span id="enemyName"></span>
          </div>
          <div class="life">
            体力:<span id="enemyLife">0</span>
          </div>
        </div>
      </div>
      <div id="controller">
        <input type="button" value="攻撃" onclick="attack();">
        <input type="button" value="回復" onclick="recover();">
      </div>
    </div>
  </div>
  <script src="js/script01.js"></script>
</body>
</html>