/* ブロックくずし 2010-06-27~2010-12-26 創作プログラミングの街 ゲーム画面表示用のHTMLタグやスタイルシート設定などすべてコードに含まれているので、scriptタグで貼り付けるだけで実行できます */ // ゲーム画面情報配列作成 var fjsBlockBreakMap = new Array(); var fjsBlockBreakTmp = 0; var fjsBlockBreakCellWidth = 16; var fjsBlockBreakCellHeight = 16; var fjsBlockBreakCellCols = 12; var fjsBlockBreakCellRows = 14; // ゲーム画面各要素の色情報配列作成 var fjsBlockBreakBlockColor = new Array(); fjsBlockBreakBlockColor[0] = '#000000'; // 空白 fjsBlockBreakBlockColor[1] = '#ff0000'; // 赤ブロック fjsBlockBreakBlockColor[2] = '#00ff00'; // 緑ブロック fjsBlockBreakBlockColor[3] = '#0000ff'; // 青ブロック fjsBlockBreakBlockColor[4] = '#ffffff'; // 壁 fjsBlockBreakBlockColor[5] = '#ccffff'; // バー // ゲーム状態 var fjsBlockBreakGameState = 0; // ゲーム終了カウント var fjsBlockBreakGameEndCount = 0; // ブロック数 var fjsBlockBreakBlockNum = 0; // バー位置 var fjsBlockBreakX = 0; var fjsBlockBreakY = 0; // 弾位置 var fjsBlockBreakBX = 0; var fjsBlockBreakBY = 0; // 弾加速度 var fjsBlockBreakBDX = 0; var fjsBlockBreakBDY = 0; // 弾位置(バー捕捉状態時、バー上の位置) var fjsBlockBreakBBX = 0; // 左右キー状態 var fjsBlockBreakStick = 0; // 上下キー状態 var fjsBlockBreakTrigger = 0; var fjsBlockBreakTimerID = 0; fjsBlockBreakInit(); function fjsBlockBreakInit() { // 表示用HTML var html = ''; html = html + '
' + "\n"; html = html + '
ブロックくずし
' + "\n"; html = html + '
' + "\n"; html = html + '
' + "\n"; html = html + '' + "\n"; // ゲーム画面HTMLタグ作成 for (i = 0;i < fjsBlockBreakCellRows;i++) { html = html + '' + "\n"; for (j = 0;j < fjsBlockBreakCellCols;j++) { html = html + ''; } html = html + '' + "\n"; } html = html + "
\n"; html = html + "
\n"; // ゲームHTMLを表示 document.write(html); // ゲームリセット fjsBlockBreakReset(); // ゲーム画面描画 fjsBlockBreakDraw(); // ゲーム処理関数を呼び出す fjsBlockBreakTimerID = setTimeout("fjsBlockBreakProcess()", 50); } function fjsBlockBreakSetFocus() { document.getElementById("fjsBlockBreakFocusButton").focus(); } // ゲームリセット function fjsBlockBreakReset() { var i; var j; for (i = 0;i < fjsBlockBreakCellCols;i++) { fjsBlockBreakMap[i] = new Array(); } for (i = 0;i < fjsBlockBreakCellRows;i++) { for (j = 0;j < fjsBlockBreakCellCols;j++) { fjsBlockBreakMap[j][i] = 4; } } for (i = 1;i < fjsBlockBreakCellRows;i++) { for (j = 1;j < fjsBlockBreakCellCols - 1;j++) { fjsBlockBreakMap[j][i] = 0; } } fjsBlockBreakBlockNum = 0; // 三段分ブロック作成 for (i = 1;i < 4;i++) { for (j = 1;j < 11;j++) { fjsBlockBreakMap[j][i] = 1 + ((i + j) % 3); fjsBlockBreakBlockNum++; } } // バー初期位置 fjsBlockBreakX = 5; fjsBlockBreakY = fjsBlockBreakCellRows - 1; // 弾初期位置 fjsBlockBreakBX = fjsBlockBreakX; fjsBlockBreakBBX = 0; fjsBlockBreakBY = fjsBlockBreakY - 1; fjsBlockBreakBDX = 0; fjsBlockBreakBDY = 0; // バー情報を記録 fjsBlockBreakMap[fjsBlockBreakX][fjsBlockBreakY] = 5; fjsBlockBreakMap[fjsBlockBreakX + 1][fjsBlockBreakY] = 5; fjsBlockBreakGameState = 1; fjsBlockBreakGameEndCount = 0; fjsBlockBreakBlockColor[0] = '#000000'; fjsBlockBreakBlockColor[1] = '#ff0000'; // 赤ブロック fjsBlockBreakBlockColor[2] = '#00ff00'; // 緑ブロック fjsBlockBreakBlockColor[3] = '#0000ff'; // 青ブロック document.getElementById("fjsBlockBreakHolder").focus(); } // ゲーム描画 function fjsBlockBreakDraw() { var i; var j; var elm; elm = document.getElementById('fjsBlockBreakMessage'); // ゲーム状態に応じてメッセージ表示 switch (fjsBlockBreakGameState) { case 0: elm.innerHTML = '下キーで開始'; break; case 1: elm.innerHTML = '上キーで弾発射'; break; case 2: elm.innerHTML = '下キーで弾捕捉'; break; case 3: elm.innerHTML = 'ゲームオーバー'; break; case 4: elm.innerHTML = 'クリア'; break; } // ゲーム画面の各要素を表示 for (i = 0;i < fjsBlockBreakCellRows;i++) { for (j = 0;j < fjsBlockBreakCellCols;j++) { elm = document.getElementById('fjsBlockBreakCell' + Number(j).toString(16) + Number(i).toString(16)); // 表示テーブルのセルを各要素の色に設定 elm.style.background = fjsBlockBreakBlockColor[fjsBlockBreakMap[j][i]]; // 弾があるなら、表示 if (j == fjsBlockBreakBX && i == fjsBlockBreakBY) { elm.innerHTML = '*'; } else { elm.innerHTML = ''; } } } } function fjsBlockBreakProcess() { fjsBlockBreakGame(); fjsBlockBreakDraw(); fjsBlockBreakTimerID = setTimeout("fjsBlockBreakProcess()", 100); } // ゲーム処理 function fjsBlockBreakGame() { if (fjsBlockBreakGameState == 3 || fjsBlockBreakGameState == 4) { if (fjsBlockBreakGameEndCount++ > 20) { fjsBlockBreakGameState = 0; fjsBlockBreakBlockColor[0] = '#000000'; fjsBlockBreakBlockColor[1] = '#ff0000'; // 赤ブロック fjsBlockBreakBlockColor[2] = '#00ff00'; // 緑ブロック fjsBlockBreakBlockColor[3] = '#0000ff'; // 青ブロック return; } switch (Math.floor(fjsBlockBreakGameEndCount / 4)) { case 0: fjsBlockBreakBlockColor[1] = '#f00000'; // 赤ブロック fjsBlockBreakBlockColor[2] = '#00f000'; // 緑ブロック fjsBlockBreakBlockColor[3] = '#0000f0'; // 青ブロック fjsBlockBreakBlockColor[0] = '#0f0f0f'; break; case 1: fjsBlockBreakBlockColor[1] = '#cc0000'; // 赤ブロック fjsBlockBreakBlockColor[2] = '#00cc00'; // 緑ブロック fjsBlockBreakBlockColor[3] = '#0000cc'; // 青ブロック fjsBlockBreakBlockColor[0] = '#333333'; break; case 2: fjsBlockBreakBlockColor[1] = '#990000'; // 赤ブロック fjsBlockBreakBlockColor[2] = '#009900'; // 緑ブロック fjsBlockBreakBlockColor[3] = '#000099'; // 青ブロック fjsBlockBreakBlockColor[0] = '#666666'; break; case 3: fjsBlockBreakBlockColor[1] = '#660000'; // 赤ブロック fjsBlockBreakBlockColor[2] = '#006600'; // 緑ブロック fjsBlockBreakBlockColor[3] = '#000066'; // 青ブロック fjsBlockBreakBlockColor[0] = '#999999'; break; case 4: fjsBlockBreakBlockColor[1] = '#330000'; // 赤ブロック fjsBlockBreakBlockColor[2] = '#003300'; // 緑ブロック fjsBlockBreakBlockColor[3] = '#000033'; // 青ブロック fjsBlockBreakBlockColor[0] = '#cccccc'; break; default: fjsBlockBreakBlockColor[1] = '#330000'; // 赤ブロック fjsBlockBreakBlockColor[2] = '#003300'; // 緑ブロック fjsBlockBreakBlockColor[3] = '#000033'; // 青ブロック fjsBlockBreakBlockColor[0] = '#ffffff'; break; } return; } if (fjsBlockBreakGameState == 0) { if (fjsBlockBreakTrigger == 2) { fjsBlockBreakReset(); } return; } // 左移動 if (fjsBlockBreakStick == 1 && fjsBlockBreakX > 1) { fjsBlockBreakMap[fjsBlockBreakX + 1][fjsBlockBreakY] = 0; fjsBlockBreakX--; fjsBlockBreakMap[fjsBlockBreakX][fjsBlockBreakY] = 5; } // 右移動 if (fjsBlockBreakStick == 2 && fjsBlockBreakX < fjsBlockBreakCellCols - 3) { fjsBlockBreakMap[fjsBlockBreakX][fjsBlockBreakY] = 0; fjsBlockBreakX++; fjsBlockBreakMap[fjsBlockBreakX + 1][fjsBlockBreakY] = 5; } // 弾保持中 if (fjsBlockBreakGameState == 1) { fjsBlockBreakBX = fjsBlockBreakX + fjsBlockBreakBBX; // 上キーで弾発射 if (fjsBlockBreakTrigger == 1) { fjsBlockBreakGameState = 2; // 弾がある位置によって左右の加速度を設定 if (fjsBlockBreakBBX == 0) { fjsBlockBreakBDX = -1; } else { fjsBlockBreakBDX = 1; } fjsBlockBreakBDY = -1; } return; } // 弾をキャッチ if (fjsBlockBreakGameState == 2 && fjsBlockBreakBY == (fjsBlockBreakY - 1) && (fjsBlockBreakBX == fjsBlockBreakX || fjsBlockBreakBX == fjsBlockBreakX + 1) && fjsBlockBreakTrigger == 2) { fjsBlockBreakGameState = 1; // 弾の(バー上のX)位置を記録 fjsBlockBreakBBX = fjsBlockBreakBX - fjsBlockBreakX; return; } // 弾加速度算出値 var bdx = 0; var bdy = 0; // 弾接触処理 do { // 左右方向接触判定 switch(fjsBlockBreakMap[fjsBlockBreakBX + fjsBlockBreakBDX][fjsBlockBreakBY]) { // ブロックに接触 case 1: case 2: case 3: // ゲーム画面情報配列の弾位置をクリア fjsBlockBreakMap[fjsBlockBreakBX + fjsBlockBreakBDX][fjsBlockBreakBY] = 0; // ブロック残数更新 fjsBlockBreakBlockNum--; // 左右方向の弾加速度反転 fjsBlockBreakBDX = -fjsBlockBreakBDX; if (bdy == 0) { bdy = fjsBlockBreakBDY; } break; // 壁・バーに接触 case 4: case 5: // 左右方向の弾加速度反転 bdx = -fjsBlockBreakBDX; if (bdy == 0) { bdy = fjsBlockBreakBDY; } break; } // 上下方向接触判定 switch(fjsBlockBreakMap[fjsBlockBreakBX][fjsBlockBreakBY + fjsBlockBreakBDY]) { // ブロックに接触 case 1: case 2: case 3: // ゲーム画面情報配列の弾位置をクリア fjsBlockBreakMap[fjsBlockBreakBX][fjsBlockBreakBY + fjsBlockBreakBDY] = 0; // ブロック残数更新 fjsBlockBreakBlockNum--; // 上下方向の弾加速度反転 bdy = -fjsBlockBreakBDY; if (bdx == 0) { bdx = fjsBlockBreakBDX; } break; // 壁・バーに接触 case 4: case 5: // 上下方向の弾加速度反転 bdy = -fjsBlockBreakBDY; if (bdx == 0) { bdx = fjsBlockBreakBDX; } break; } // 斜め方向の接触判定 if (bdx == 0 && bdy == 0) { switch(fjsBlockBreakMap[fjsBlockBreakBX + fjsBlockBreakBDX][fjsBlockBreakBY + fjsBlockBreakBDY]) { // ブロックに接触 case 1: case 2: case 3: // ゲーム画面情報配列の弾位置をクリア fjsBlockBreakMap[fjsBlockBreakBX + fjsBlockBreakBDX][fjsBlockBreakBY + fjsBlockBreakBDY] = 0; // ブロック残数更新 fjsBlockBreakBlockNum--; // 弾加速度反転 bdx = -fjsBlockBreakBDX; bdy = -fjsBlockBreakBDY; break; // 壁・バーに接触 case 4: case 5: // 弾加速度反転 bdx = -fjsBlockBreakBDX; bdy = -fjsBlockBreakBDY; break; } } else { switch (fjsBlockBreakMap[fjsBlockBreakBX + bdx][fjsBlockBreakBY + bdy]) { // ブロックに接触 case 1: case 2: case 3: // ゲーム画面情報配列の弾位置をクリア fjsBlockBreakMap[fjsBlockBreakBX + bdx][fjsBlockBreakBY + bdy] = 0; // ブロック残数更新 fjsBlockBreakBlockNum--; // 弾加速度反転 bdx = -bdx; bdy = -bdy; break; // 壁・バーに接触 case 4: case 5: // 弾加速度反転 bdx = -bdx; bdy = -bdy; break; } } } while ((bdx != 0 || bdy != 0) && fjsBlockBreakMap[fjsBlockBreakBX + bdx][fjsBlockBreakBY + bdy] != 0); // 弾加速度更新 if (bdx != 0) { fjsBlockBreakBDX = bdx; } if (bdy != 0) { fjsBlockBreakBDY = bdy; } // 弾位置更新 fjsBlockBreakBX += fjsBlockBreakBDX; fjsBlockBreakBY += fjsBlockBreakBDY; // ブロックをすべて壊したらクリア if (fjsBlockBreakBlockNum == 0) { fjsBlockBreakGameState = 4; } // 弾が下端まで来たらゲームオーバー if (fjsBlockBreakBY == fjsBlockBreakCellRows - 1) { fjsBlockBreakGameState = 3; } } // キー押下イベント処理 function fjsBlockBreakKeyDown(e) { var code = 0; code = e.keyCode; switch (code) { // 上キー case 38: fjsBlockBreakTrigger |= 1; break; // 下キー case 40: fjsBlockBreakTrigger |= 2; break; // 左キー case 37: fjsBlockBreakStick |= 1; break; // 右キー case 39: fjsBlockBreakStick |= 2; break; } } // キー解放イベント処理 function fjsBlockBreakKeyUp(e) { var code = 0; code = e.keyCode; switch (code) { // 上キー case 38: fjsBlockBreakTrigger &= ~1; break; // 下キー case 40: fjsBlockBreakTrigger &= ~2; break; // 左キー case 37: fjsBlockBreakStick &= ~1; break; // 右キー case 39: fjsBlockBreakStick &= ~2; break; break; } }