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 の各値を出力
});
});
入力を 配列 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' を出力
});
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')の実行結果を出力
});
【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')の実行結果を出力
});
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')の実行結果を出力
});
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]; // result を Judg[i](関数の戻り値)で上書き
}
}
console.log(result);
});
【STEP: 3】【STEP: 4】【STEP: 5】のアロー関数 3種 を そのまま持ってきて 呼び出すためのコードを 配列 Judg に収めています。ループしながら if文 で result が ″D″の時のみ 呼び出すように 条件分岐しました。
コメント