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

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

ただいまの
回答率

87.59%

javascript ジャンケンゲームの質問です。

解決済

回答 1

投稿 編集

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

score 4

javascript初心者です。お世話になります。

初心者向けテキストで以下のようなジャンケンの繰り返しの例がありましたが、最後の段落のwhile文で

let isLose = false;
while (!isLose){
・
・
・
isLose = true;

のところがよくわかりません。

まず isLose = trueは、 return '負けました。' と同義でしょうか。
またそれまでisLoseというのが出てきていないのに、なぜ isLose = true と return '負けました。'を関連付けて読み取ることができ、繰り返しをストップできるのかがよくわかりません。

そのところをご解決いただければ幸甚でございます。何卒よろしくお願い申し上げます。

(以下テキスト文です)

function janken () {
  /* 定数定義 ************************/
  // ジャンケンの手の番号を設定
  const GU    = 1;
  const CHOKI = 2;
  const PA    = 3;

  /* 関数定義 ************************/
  // 人間に手を入力してもらう機能
  function getHumHand() {
    let hum = prompt('半角数字で1~3の数字を入力してください。\n\n' + GU + ':グー\n' + CHOKI + ':チョキ\n' + PA + ':パー');
    hum = parseInt(hum, 10);
    if (hum !== GU && hum !== CHOKI && hum !== PA) {
      return undefined;
    } else {
      return hum;
    }
  }

  // コンピュータの手を決める
  function getComHand() {
    return Math.floor(Math.random() * 3) + 1;
  }

  // コンピュータの手の名前を取得
  function getHandName(num) {
    switch (num) {
      case GU:
      return 'グー';
      case CHOKI:
      return 'チョキ';
      case PA:
      return 'パー';
    }
  }

  // 結果の判定
  function getResult(com, hum) {
    if (hum === com) {
      return '結果はあいこでした。';
    } else if ((com === GU && hum === PA) || (com === CHOKI && hum === GU) || (com === PA && hum === CHOKI)) {
      return '勝ちました。';
    } else {
      return '負けました。';
    }
  }

  // 最終的な結果のメッセージ
  function getResultMsg(com, hum) {
    return getResult(com, hum) + 'コンピュータの出した手は「' + getHandName(com) + '」でした';
  }

  /* 実行する処理 ************************/
  let hum = getHumHand();
  if (!hum) {
    alert('入力値をうまく認識できませんでした。ブラウザを再読込すると、もう一度挑戦できます。');
  } else {
    let com = getComHand();
    alert(getResultMsg(com, hum));
    return getResult(com, hum);
  }
}

let win = 0;
let isLose = false;
while (!isLose) {
  let result = janken();
  if (result === '結果はあいこでした。') {
    continue;
  }
  if (result === '勝ちました。') {
    win++;
    alert('ただいま「' + win + '」勝です。');
    continue;
  }
  alert('連勝はストップです。記録は「' + win + '」勝でした。');
  isLose = true;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • SurferOnWww

    2019/08/13 13:33

    いえ、今からでも遅くないのできちんとインデントされるようにしてください。後で検索などでここを訪れる人がいるかもしれません。ここは質問者さん専用の Q&A サイトではなく、開発者同士の情報交換も目的にしているはずです。そういう人にもわかりやすいスレッドにするため、よろしくお願いします。

    キャンセル

  • Mirage

    2019/08/13 13:40

    修正いたしました!

    キャンセル

  • SurferOnWww

    2019/08/13 13:49

    対応いただきありがとうございました。

    キャンセル

回答 1

checkベストアンサー

+1

while (!isLose) {
  let result = janken();
  if (result === '結果はあいこでした。') {
    continue;
  }
  if (result === '勝ちました。') {
    win++;
    alert('ただいま「' + win + '」勝です。');
    continue;
  }
  alert('連勝はストップです。記録は「' + win + '」勝でした。');
  isLose = true;
}


おそらくご理解されていないのはcontinue文なのではないかと思います。

continue 文は、現在のループまたはラベル付きループの現在反復中の文の実行を終了して、次の反復でループの実行を続けます。
continue - JavaScript | MDN

continue文はそれ以降の部分のコード実行を中止して、ループの先頭に戻ります。
なので、このコードは、以下のように動作します。

  1. result === '結果はあいこでした。'の時、continue文によりループの先頭に戻ります。このループの周回はここで終わります。
  2. 1の条件が成立しない場合は、ループの先頭に戻らず次のコードを実行します。
  3. result === '勝ちました。'の時、諸々の処理をし、continue文によりループの先頭に戻ります。ループのこの周回はここで終わります。
  4. 3の条件が成立しない場合は、ループの先頭に戻らず次のコードを実行します。
  5. alert('連勝はストップです。記録は「' + win + '」勝でした。'); isLose = true;を実行しループの周回を終わります。つまり、1と3の条件が成立しない時だけ、このコードは実行されます。'負けました。'の場合もこれに含まれます。

なので、

まずisLose = trueは、return '負けました。'と同義でしょうか。

の答えは、「いいえ」です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/08/13 13:07

    早速ありがとうございました。おっしゃるとおり、continue文についてわかっていませんでした。すべて納得がいきました。どうもありがとうございました。

    キャンセル

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

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

関連した質問

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