質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

Javascript 簡易ゲーム if文の書き方とalertに配列の値を表示させたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 118

score -1

初心者でJavaScript学習のために作成してます。
分かるところから、自分で書いており、途中のものになります。。
if文が苦手で、アドバイスいただけますと幸いです。

前提:
自分の船(ourHero)
ヒットポイント - 20
攻撃するパワー - 5
攻撃が当たる確率 - 0.7

敵の船
ヒットポイント - 3 〜 6の乱数
攻撃するパワー - 2 〜 4の乱数
攻撃が当たる確率 - 0.6 〜 0.8の乱数

上記の数値のもと、攻撃し、され、
ヒットポイントが残っていれば、戦い続け、
ゼロになったら、再度攻撃するか、敗退するか選択するstartprompt()に戻るように書きたい。

下記2点につまづきました。

1) alert内で配列の値を表示させたい。
-> 以前、別のコードを書いた時は下記で表示されたのですが、今回はうまく表示できていないので、
ご指摘いただけますと幸いです。

alert('敵から攻撃をうけた!' + ${tekiArray[0]accuracy}' + ' ${ourHero.hitPoints}');


2) 敵の船の手持ちのヒットポイントが0になったら、ゲームを開始するか否かのstartPrompt()関数へ飛ばしたいと思っています。
なんとなく下記の書き方は間違っていると思うので、アドバイスいただけますと幸いです。

} else if ( tekiArray[0].hitPoints = 0 ){
    alert('敵の船の破壊に成功!');
    startPrompt();

自分で書き進めたところ↓

class Ship{
  constructor(hitPoints, firepower, accuracy){
    this.hitPoints = hitPoints;
    this.firepower = firepower;
    this.accuracy = accuracy;
  }
}

//hitPoints, firepower, accuracy
const ourHero = new Ship(20, 5, 0.7);

class tekiShip extends Ship{
  constructor(hitPoints, firepower, accuracy){
  super(hitPoints, firepower, accuracy);
  }
}
let tekiArray = []
for(let i =0; i < 6; i++){
  tekiArray[i] = new tekiShip (randomizer(3,6), randomizer(2,4),(randomizer(60,80) / 100));
}
console.log(tekiArray)

function randomizer(min, max){
  return (Math.floor(Math.random() * (max - min + 1) + min));
}

function game(){
  playGame = prompt('Y を入力してゲームを開始する');
  playGame = playGame.toUpperCase();
  if (playGame === 'Y'){
    startPrompt()
  } else {
    alert('またね')
  } 

 function startPrompt(){
  let ans;
  while(true) {
    ans = getCommand();
    if (ans == '') continue;
    if (ans == 'attack') {
      doBattle();
    } else {
      alert('Game Over・゚。(´;д;`) 。゚・Game Over');
    }
    break;
  }
}

function getCommand() {
  const cmd = prompt('"attack" or "retreat"を入力してください');
  let ret = cmd.toLowerCase();
  if (ret != 'attack' && ret != 'retreat') ret = '';
  return ret;
}

function doBattle(){
while (true){
  if (Math.random() < tekiArray[0].accuracy) {
    ourHero.hitPoints -= tekiArray[0].firepower;
    console.log(ourHero.hitPoints)
    alert('敵から攻撃を受けた' + ' ${tekiArray[0]accuracy}' + '${ourHero.hitPoints}');
} else if (Math.random() < ourHero.accuracy){
    tekiArray[0].hitPoints -= ourHero.firepower; 
    alert("敵に攻撃を仕掛けた");
} else if ( tekiArray[0].hitPoints = 0 ){
    alert('敵の船の破壊に成功!');
    startPrompt();
  break;
}
}
}}
game();
startPrompt();
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hiro_ike

    2021/05/04 11:10

    ご確認ありがとうございます。一部漏れていたので追記しました。
    ${tekiArray[0]accuracy}' + '${ourHero.hitPoints}'
    上記のように書くと、現状、この文字列のままalertに表示されます。

    やりたいこと:
    テストするためにも、処理/計算時の実際の値を目視したい。というのが目的でした。

    初心者のため、多分該当箇所の書き方に問題があると思い、質問させていただきました。

    キャンセル

  • coolwind0202

    2021/05/04 11:29

    「else」を使って書かれているようですが、以下の3つの状況は同時に起こり得ますか?
    「敵から攻撃を受けた」「敵に攻撃を仕掛けた」「敵の船の破壊に成功した」

    敵に攻撃を仕掛けた直後に敵の船の破壊に成功することは、あり得るのではないですか?

    キャンセル

  • hiro_ike

    2021/05/04 12:02

    ご確認ありがとうございます。
    仰る通り、有り得ますね。。
    こういった場合、全てifで書き始めたら良いのでしょうか?

    キャンセル

回答 2

checkベストアンサー

+1

1)テンプレートリテラルの使い方について 

  • 文字列を ' ではなく ` で囲います
  • 変数名を ${} で囲います
alert('敵から攻撃をうけた!' + ${tekiArray[0]accuracy}' + ' ${ourHero.hitPoints}');

alert(`敵から攻撃をうけた! ${tekiArray[0].accuracy} ${ourHero.hitPoints}`);

2)

敵の船の手持ちのヒットポイントが0になったら 必ず敵の船のヒットポイントが0になるとは限らないと思います。 また、if 文の条件式が true と判断されると、以降の else はまったく実行されません。 なので、

if (Math.random() < tekiArray[0].accuracy) {
  alert('敵から攻撃を受けた' + ' ${tekiArray[0]accuracy}' + '${ourHero.hitPoints}');
} else if (Math.random() < ourHero.accuracy){
  alert("敵に攻撃を仕掛けた");
} else if ( tekiArray[0].hitPoints = 0 ){
  alert('敵の船の破壊に成功!');
}

このとき、敵の accuracy と 自身の accuracy の両方が Math.random() 以下にならないと、敵の船の破壊は永遠に通知されません。 これらを踏まえて、以下のように変更しました。

if (Math.random() < tekiArray[0].accuracy) {
  ourHero.hitPoints -= tekiArray[0].firepower;
  console.log(ourHero.hitPoints)
  alert(`敵から攻撃をうけた! ${tekiArray[0].accuracy} ${ourHero.hitPoints}`);
}
if (Math.random() < ourHero.accuracy){
  tekiArray[0].hitPoints -= ourHero.firepower; 
  alert("敵に攻撃を仕掛けた");
}
if ( tekiArray[0].hitPoints <= 0 ){
  alert('敵の船の破壊に成功!');
  startPrompt();
  break;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/05/05 04:04

    >現在の船の配列内でのインデックスを示す変数を用意すること
    こちらは、下記に追加するということでしょうか?
    let tekiArray = []
    for(let i =0; i < 6; i++){
    tekiArray[i] = new tekiShip (randomizer(3,6), randomizer(2,4),(randomizer(60,80) / 100));
    }

    キャンセル

  • 2021/05/05 10:37

    関数の外ならどこでも良いと思いますよ

    キャンセル

  • 2021/05/05 13:06

    やりたいことが出来ました!
    後ほどコード載せます。

    キャンセル

0

class Ship {
  constructor(hitPoints, firepower, accuracy) {
    this.hitPoints = hitPoints;
    this.firepower = firepower;
    this.accuracy = accuracy;
  }
}

//hitPoints, firepower, accuracy
const ourHero = new Ship(20, 5, 0.7);

class tekiShip extends Ship {
  constructor(hitPoints, firepower, accuracy) {
    super(hitPoints, firepower, accuracy);
  }
}
let tekiArray = []
for (let i = 0; i < 6; i++) {
  tekiArray[i] = new tekiShip(randomizer(3, 6), randomizer(2, 4), (randomizer(60, 80) / 100));
}
console.log(tekiArray)

function randomizer(min, max) {
  return (Math.floor(Math.random() * (max - min + 1) + min));
}

function game() {
  playGame = prompt('ゲームを開始するには、Yを入力してください');
  playGame = playGame.toUpperCase();
  if (playGame === 'Y') {
    startPrompt()
  } else {
    alert('GoodBye')
  }

  function startPrompt() {
    let ans;
    while (true) {
      ans = getCommand();
      if (ans == '') continue;
      if (ans == 'attack') {
        doBattle();
      } else {
        alert('Game Over・゚。(´;д;`) 。゚・Game Over');
      }
      break;
    }
  }

  function getCommand() {
    const cmd = prompt('Enter "attack" or "retreat"');
    if (cmd === null) return
    let ret = cmd.toLowerCase();
    if (ret != 'attack' && ret != 'retreat') ret = '';
    return ret;
  }

  function doBattle() {
    while (tekiArray.length) {
      if (Math.random() < tekiArray[0].accuracy) {
        ourHero.hitPoints -= tekiArray[0].firepower;
        console.log(ourHero.hitPoints)
        alert(`攻撃を受けた ${tekiArray[0].accuracy} ${ourHero.hitPoints}`);
      }
      if (Math.random() < ourHero.accuracy) {
        tekiArray[0].hitPoints -= ourHero.firepower;
        alert(`攻撃を仕掛けた ${tekiArray[0].accuracy} ${ourHero.hitPoints}`);
      }
      if (tekiArray[0].hitPoints <= 0) {
        alert(`You destroyed the ship successfully!`);
        tekiArray.shift();
        if (!tekiArray.length){
          console.log("(๑˃̵ᴗ˂̵)و 勝利!! (๑˃̵ᴗ˂̵)و ")
        }else {
          startPrompt()
        }
      }
      if (this.hitPoints <= 0) {
        alert("Game Over・゚。(´;д;`) 。゚・Game Over!");
        startPrompt();
      }
    }
  }
}
game();

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る