/*
ブロックくずし
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;
}
}