五目並べ《Bランク UP メニュー》

Bランクレベルアップメニュー【文字列の出力・五目並べ(1行)・五目並べ(横)・五目並べ(縦)・五目並べ(斜め)・五目並べ】

【文字列の出力】コード

reader.on('close', () => {
   const S = [];
   for (let i = 0; i < 5; i++) {
      S.push(lines[i]);  // 入力値を S に保存
   }
   S.forEach(s => {
      console.log(s);  // S の各値を出力
   });
});
hogeちゃんの画像

入力を 配列 S  に保存して forEach() で 出力しました。

【五目並べ(1行)】コード

reader.on('close', () => {
   const S = lines[0];
   let winner = S[0];  // 勝者の記号(初期値は S の先頭の文字)
   for (let i = 0; i < 4; i++) {
      if (S[i] === '.' || S[i] !== S[i + 1]) {  // 左側の記号と異なっていた場合…
         winner = 'D';  // winner を 'D' にして…
         break;  // 処理を止める
      }
   }
   console.log(winner);  // S[0] または 'D' を出力
});
hogeちゃんの画像

for文 でループしながら if文 で 5文字が 全て ″O″ または ″X″ の ゾロ目 であるかどうかを調べました。

【五目並べ(横)】コード

reader.on('close', () => {
   const row = (winner) => {  // 横方向
      for (let i = 0; i < 5; i++) {  // 行(0~4)
         let judge = true;  // 勝者が存在するかどうかの真偽値
         for (let j = 0; j < 4; j++) {  // 列(0~3)
            if (S[i][j] === '.' || S[i][j] !== S[i][j + 1]) {  // 左側の記号と異なっていた場合…
               judge = false;  // judge を false にして…
               break;  // 処理を止める
            }
         }
         if (judge) {  // 勝者が確定すれば…
            winner = S[i][0];  // winner を行の先頭の値として…
            break;  // 処理を止める
         }
      }
      return winner;  // 戻り値は winner
   };
   const S = [];  // 5 行 5 列の盤面の配列
   for (let i = 0; i < 5; i++) {
      S.push(lines[i]);  // 5 行の入力を S に保存
   }
   console.log(row('D'));  // row('D')の実行結果を出力
});
hogeちゃんの画像

【STEP: 2】のコードを 元に 5 行 5 列の盤面の 横の列が ゾロ目であるかどうか 一行ずつ調べています。

【五目並べ(縦)】コード

reader.on('close', () => {
   const column = (winner) => {  // 縦方向
      for (let j = 0; j < 5; j++) {  // 列(0~4)
         let judge = true;
         for (let i = 0; i < 4; i++) {  // 行(0~3)
            if (S[i][j] === '.' || S[i][j] !== S[i + 1][j]) {  // 下の記号と異なっていた場合…
               judge = false;  // judge を false にして…
               break;  // 処理を止める
            }
         }
         if (judge) {  // 勝者が確定すれば…
            winner = S[0][j];  // winner を列の先頭の値として…
            break;  // 処理を止める
         }
      }
      return winner;  // 戻り値は winner
   };
   const S = [];  // 5 行 5 列の盤面の配列
   for (let i = 0; i < 5; i++) {
      S.push(lines[i]);  // 5 行の入力を S に保存
   }
   console.log(column('D'));  // column('D')の実行結果を出力
});
hogeちゃんの画像
column は 5列のうち いずれかがゾロ目になっているかどうかを調べる関数です。【STEP: 3】のカウンタ変数の i,j を入れ替えて ループ を実行しました。

【五目並べ(斜め)】コード

reader.on('close', () => {
   const cross = (winner) => {  // 斜め方向
      let judge = true;
      for (let i = 0; i < 4; i++) {  // S[0][0]〜S[4][4]を調べる
         if (S[i][i] === '.' || S[i][i] !== S[i + 1][i + 1]) {  // 左側の記号と異なっていた場合…
            judge = false;  // judge を false にして…
            break;  // 処理を止める
         }
      }
      if (judge) {  // 勝者が確定すれば…
         winner = S[0][0];  // winner は盤面の左斜め上の値
      }else{  // さもなくば…
         judge = true;  // judge を true にして…
         for (let i = 0; i < 4; i++) {  //S[0][4]〜S[4][0]を調べる
            if (S[0][4] === '.' || S[i][4 - i] !== S[i + 1][3 - i]) {  // 左側の記号と異なっていた場合…
               judge = false;  // judge を false にして…
               break;  // 処理を止める
            }
         }
      }
      if (judge) {
         winner = S[0][4];  // winner は盤面の右斜め上の値
      }
      return winner;
   };
   const S = [];  // 5 行 5 列の盤面の配列
   for (let i = 0; i < 5; i++) {
      S.push(lines[i]);  // 5 行の入力を S に保存
   }
   console.log(cross('D'));  // cross('D')の実行結果を出力
});
hogeちゃんの画像

cross('D') で 斜めがゾロ目かどうかを調べています。

【五目並べ】コード

reader.on('close', () => {
   const row = (winner) => {  // 横方向
      for (let i = 0; i < 5; i++) {  // 行
         let judge = true;  // 勝者が存在するかどうかの真偽値
         for (let j = 0; j < 4; j++) {  // 列
            if (S[i][j] === '.' || S[i][j] !== S[i][j + 1]) {  // ゾロ目じゃなかった場合…
               judge = false;  // judge を false にして…
               break;  // 処理を止める
            }
         }
         if (judge) {  // 勝者が確定すれば…
            winner = S[i][0];  // winner を行の先頭の値として…
            break;  // 処理を止める
         }
      }
      return winner;  // 戻り値は winner
   };
   const column = (winner) => {  // 縦方向
      for (let j = 0; j < 5; j++) {  // 列
         let judge = true;  // 勝者が存在するかどうかの真偽値
         for (let i = 0; i < 4; i++) {  // 行
            if (S[i][j] === '.' || S[i][j] !== S[i + 1][j]) {  // ゾロ目じゃなかった場合…
               judge = false;  // judge を false にして…
               break;  // 処理を止める
            }
         }
         if (judge) {  // 勝者が確定すれば…
            winner = S[0][j];  // winner を列の先頭の値として…
            break;  // 処理を止める
         }
      }
      return winner;  // 戻り値は winner
   };
   const cross = (winner) => {  // 斜め方向
      let judge = true;  // 勝者が存在するかどうかの真偽値
      for (let i = 0; i < 4; i++) {  // S[0][0]〜S[4][4]を調べる
         if (S[i][i] === '.' || S[i][i] !== S[i + 1][i + 1]) {  // ゾロ目じゃなかった場合…
            judge = false;  // judge を false にして…
            break;  // 処理を止める
         }
      }
      if (judge) {  // 勝者が確定すれば…
         winner = S[0][0];  // winner は盤面の左斜め上の値
      }else{
         judge = true;
         for (let i = 0; i < 4; i++) {  //S[0][4]〜S[4][0]を調べる
            if (S[0][4] === '.' || S[i][4 - i] !== S[i + 1][3 - i]) {
               judge = false;  // judge を false にして…
               break;  // 処理を止める
            }
         }
      }
      if (judge) {  // 勝者が確定すれば…
         winner = S[0][4];  // winner は盤面の右斜め上の値
      }
      return winner;  // 戻り値は winner
   };
   const S = [];  // 5 行 5 列の盤面の配列
   for (let i = 0; i < 5; i++) {
      S.push(lines[i]);  // 5 行の入力を S に保存
   }
   let result = 'D';  // 勝者の記号
   const Judg = [row('D'), column('D'), cross('D')];  // 各関数の戻り値を配列に保存
   for (let i = 0; i < 3; i++) {  // 3 は Judg の要素数
      if (result === 'D') {  // 勝者の記号が 'D' なら…
         result = Judg[i];  // resultJudg[i](関数の戻り値)で上書き
      }
   }
   console.log(result);
});
hogeちゃんの画像

【STEP: 3】【STEP: 4】【STEP: 5】のアロー関数 3種 を そのまま持ってきて 呼び出すためのコードを 配列 Judg に収めています。ループしながら if文 で result が ″D″の時のみ 呼び出すように 条件分岐しました。

コメント