情報学部 | 菅沼ホーム | JavaScript 目次 | 索引 |
<!DOCTYPE HTML> <HTML> <HEAD> <TITLE>ぷよぷよ:ステップ1</TITLE> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> <META NAME=viewport CONTENT="width=device-width, initial-scale=1"> <LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css"> <SCRIPT TYPE="text/javascript" SRC="main/MainPanel.js"></SCRIPT> <SCRIPT TYPE="text/javascript" SRC="start/StartPanel.js"></SCRIPT> <SCRIPT TYPE="text/javascript" SRC="game/GamePanel.js"></SCRIPT> <SCRIPT TYPE="text/javascript" SRC="over/GameOverPanel.js"></SCRIPT> </HEAD> <BODY CLASS="eeffee" onLoad="mp_start()"> <H1>ぷよぷよ:ステップ1</H1> <CANVAS ID="canvas_e" STYLE="background-color: #ffffff;" WIDTH="150" HEIGHT="360"></CANVAS><BR> <A HREF="method.htm" TARGET="method"><BUTTON ID="method" CLASS="std">遊び方</BUTTON></A> <BUTTON ID="start" CLASS="std" onClick="gp_start()">ゲーム開始</BUTTON> <BUTTON ID="finish" CLASS="std" onClick="mp.finish()">終了</BUTTON> <BUTTON ID="rot" CLASS="std" onClick="gp.py.operation(0)">回転</BUTTON><BR> <BUTTON ID="left" CLASS="std" onClick="gp.py.operation(1)">左</BUTTON> <BUTTON ID="right" CLASS="std" onClick="gp.py.operation(2)">右</BUTTON><BR> <BUTTON ID="color" CLASS="std" onClick="gp.py.operation(3)">色交換</BUTTON> </BODY> </HTML>
mp = null; // MainPanel オブジェクト // // MainPanel の開始 // function mp_start() { // キャンバス情報 let canvas = document.getElementById('canvas_e'); // キャンバス要素の取得 let ctx = canvas.getContext('2d'); // キャンバスからコンテキストを取得 // MainPanel オブジェクト mp = new MainPanel(canvas, ctx); // StartPanel の表示 st_start(); } // // MainPanel オブジェクト(プロパティ) // function MainPanel(canvas, ctx) { this.canvas = canvas; // キャンバス要素 this.ctx = ctx; // キャンバスのコンテキスト return this; } // // MainPanel オブジェクト(メソッド) // MainPanel.prototype.finish = function() { // キャンバスのクリア mp.ctx.clearRect(0, 0, mp.canvas.width, mp.canvas.height); // ボタンを非表示 document.getElementById('method').style.display = "none"; document.getElementById('start').style.display = "none"; document.getElementById('finish').style.display = "none"; document.getElementById('rot').style.display = "none"; document.getElementById('left').style.display = "none"; document.getElementById('right').style.display = "none"; document.getElementById('color').style.display = "none"; }
// // StartPanel の開始 // function st_start() { // キャンバスのクリア mp.ctx.clearRect(0, 0, mp.canvas.width, mp.canvas.height); // ゲームタイトルの表示 mp.ctx.font = "40px 'MS ゴシック'"; mp.ctx.textBaseline = "middle"; mp.ctx.textAlign = "center"; mp.ctx.fillStyle = "rgb(0, 0, 0)"; mp.ctx.fillText("ぷよ", mp.canvas.width/2, mp.canvas.height/2-20); mp.ctx.fillText("ぷよ", mp.canvas.width/2, mp.canvas.height/2+20); // ボタンの表示制御 document.getElementById('method').style.display = ""; document.getElementById('start').style.display = ""; document.getElementById('finish').style.display = "none"; document.getElementById('rot').style.display = "none"; document.getElementById('left').style.display = "none"; document.getElementById('right').style.display = "none"; document.getElementById('color').style.display = "none"; document.getElementById('start').innerHTML = "ゲーム開始"; }
01 gp = null; // GamePanel オブジェクト 02 03 // 04 // GamePanel の開始 05 // 06 function gp_start() 07 { 08 // GamePanel オブジェクト 09 gp = new GamePanel(); 10 // ピースの位置 11 gp.py.p_x = 1; // 左から2列目 12 gp.py.p_y = 3; // 上から4行目 13 gp.py.p[gp.py.p_y][gp.py.p_x] = 2; // ピンク 14 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 3; // 緑 15 gp.py.draw(); 16 // ボタンの表示制御 17 document.getElementById('method').style.display = "none"; 18 document.getElementById('start').style.display = "none"; 19 document.getElementById('finish').style.display = "none"; 20 document.getElementById('rot').style.display = ""; 21 document.getElementById('left').style.display = ""; 22 document.getElementById('right').style.display = ""; 23 document.getElementById('color').style.display = ""; 24 } 25 // 26 // GamePanel オブジェクト(プロパティ) 27 // 28 function GamePanel() 29 { 30 this.py = new Puyo(); 31 return this; 32 } 33 // 34 // Puyo オブジェクト(プロパティ) 35 // 36 function Puyo() 37 { 38 this.p_x; // 左または上のピースの座標(横) 39 this.p_y; // 左または上のピースの座標(縦) 40 this.row = 12; // ゲーム画面の行数 41 this.col = 5; // ゲーム画面の列数 42 this.width = 30; // ピースの幅と高さ 43 this.rot; // 0:横,1:縦 44 this.p = new Array(); // 画面の状態(0:存在しない,1:赤,2:ピンク,3:緑,4:青) 45 for (let i1 = 0; i1 < this.row; i1++) { 46 this.p[i1] = new Array(); 47 for (let i2 = 0; i2 < this.col; i2++) 48 this.p[i1][i2] = 0; 49 } 50 this.color = new Array("rgb(255,0,0)", "rgb(255,192,203)", 51 "rgb(0,255,0)", "rgb(0,0,255)"); // ピースの色 52 return this; 53 } 54 // 55 // Puyo オブジェクト(メソッド draw) 56 // 57 Puyo.prototype.draw = function() 58 { 59 // キャンバスのクリア 60 mp.ctx.clearRect(0, 0, mp.canvas.width, mp.canvas.height); 61 // 描画 62 for (let i1 = 0; i1 < gp.py.row; i1++) { 63 for (let i2 = 0; i2 < gp.py.col; i2++) { 64 if (gp.py.p[i1][i2] > 0) { 65 mp.ctx.beginPath(); 66 mp.ctx.fillStyle = gp.py.color[gp.py.p[i1][i2]-1]; 67 mp.ctx.fillRect(i2*gp.py.width, i1*gp.py.width, gp.py.width, gp.py.width); 68 mp.ctx.fill(); 69 } 70 } 71 } 72 } 73 // 74 // Puyo オブジェクト(メソッド operation) 75 // 76 Puyo.prototype.operation = function(sw) 77 { 78 gop_start(); 79 }
let a = new Array(2); // let a = new Array(); でも可 for (let i1 = 0; i1 < 2; i1++) a[i1] = new Array(3);
let a = new Array(2); // let a = new Array(); でも可 a[0] = new Array(1, 2, 3); a[1] = new Array(4, 5, 6);
// // GameOverPanel の開始 // function gop_start() { // キャンバスのクリア mp.ctx.clearRect(0, 0, mp.canvas.width, mp.canvas.height); // タイトルの表示 mp.ctx.font = "40px 'MS ゴシック'"; mp.ctx.textBaseline = "middle"; mp.ctx.textAlign = "center"; mp.ctx.fillStyle = "rgb(0, 0, 0)"; mp.ctx.fillText("Game", mp.canvas.width/2, mp.canvas.height/2-20); mp.ctx.fillText("Over!", mp.canvas.width/2, mp.canvas.height/2+20); // ボタンの表示制御 document.getElementById('method').style.display = "none"; document.getElementById('start').style.display = ""; document.getElementById('finish').style.display = ""; document.getElementById('rot').style.display = "none"; document.getElementById('left').style.display = "none"; document.getElementById('right').style.display = "none"; document.getElementById('color').style.display = "none"; document.getElementById('start').innerHTML = "再開"; }
001 gp = null; // GamePanel オブジェクト 002 003 // 004 // GamePanel の開始 005 // 006 function gp_start() 007 { 008 // GamePanel オブジェクト 009 gp = new GamePanel(); 010 // ピースの位置 011 gp.py.p_x = 1; 012 gp.py.p_y = 3; 013 gp.py.p[gp.py.p_y][gp.py.p_x] = 2; 014 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 3; 015 gp.py.draw(); 016 // タイマーのスタート 017 gp.timerID = setInterval('gp.py.drop()', 500); 018 // ボタンの表示制御 019 document.getElementById('method').style.display = "none"; 020 document.getElementById('start').style.display = "none"; 021 document.getElementById('finish').style.display = "none"; 022 document.getElementById('rot').style.display = ""; 023 document.getElementById('left').style.display = ""; 024 document.getElementById('right').style.display = ""; 025 document.getElementById('color').style.display = ""; 026 } 027 // 028 // GamePanel オブジェクト(プロパティ) 029 // 030 function GamePanel() 031 { 032 this.timerID = -1; 033 this.in_game = true; // ゲーム中か否か 034 this.py = new Puyo(); 035 return this; 036 } 037 // 038 // Puyo オブジェクト(プロパティ) 039 // 040 function Puyo() 041 { 042 this.p_x; // 左または上のピースの座標(横) 043 this.p_y; // 左または上のピースの座標(縦) 044 this.row = 12; // ゲーム画面の行数 045 this.col = 5; // ゲーム画面の列数 046 this.width = 30; // ピースの幅と高さ 047 this.rot; // 0:横,1:縦 048 this.p = new Array(); // 画面の状態(0:存在しない,1:赤,2:ピンク,3:緑,4:青) 049 for (let i1 = 0; i1 < this.row; i1++) { 050 this.p[i1] = new Array(); 051 for (let i2 = 0; i2 < this.col; i2++) 052 this.p[i1][i2] = 0; 053 } 054 this.color = new Array("rgb(255,0,0)", "rgb(255,192,203)", 055 "rgb(0,255,0)", "rgb(0,0,255)"); // ピースの色 056 return this; 057 } 058 // 059 // Puyo オブジェクト(メソッド drop) 060 // 061 Puyo.prototype.drop = function() 062 { 063 // ピースの落下 064 if (gp.py.p_y < gp.py.row-1) { 065 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 066 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 067 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 068 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 069 gp.py.p_y++; 070 } 071 // 再描画 072 if (gp.in_game) 073 gp.py.draw(); 074 } 075 // 076 // Puyo オブジェクト(メソッド draw) 077 // 078 Puyo.prototype.draw = function() 079 { 080 // キャンバスのクリア 081 mp.ctx.clearRect(0, 0, mp.canvas.width, mp.canvas.height); 082 // 描画 083 for (let i1 = 0; i1 < gp.py.row; i1++) { 084 for (let i2 = 0; i2 < gp.py.col; i2++) { 085 if (gp.py.p[i1][i2] > 0) { 086 mp.ctx.beginPath(); 087 mp.ctx.fillStyle = gp.py.color[gp.py.p[i1][i2]-1]; 088 mp.ctx.fillRect(i2*gp.py.width, i1*gp.py.width, gp.py.width, gp.py.width); 089 mp.ctx.fill(); 090 } 091 } 092 } 093 } 094 // 095 // Puyo オブジェクト(メソッド operation) 096 // 097 Puyo.prototype.operation = function(sw) 098 { 099 clearInterval(gp.timerID); // タイマーの停止 100 gop_start(); 101 }
001 gp = null; // GamePanel オブジェクト 002 003 // 004 // GamePanel の開始 005 // 006 function gp_start() 007 { 008 // GamePanel オブジェクト 009 gp = new GamePanel(); 010 // ピースの選択 011 gp.py.select(); 012 gp.py.draw(); 013 // タイマーのスタート 014 gp.timerID = setInterval('gp.py.drop()', 500); 015 // ボタンの表示制御 016 document.getElementById('method').style.display = "none"; 017 document.getElementById('start').style.display = "none"; 018 document.getElementById('finish').style.display = "none"; 019 document.getElementById('rot').style.display = ""; 020 document.getElementById('left').style.display = ""; 021 document.getElementById('right').style.display = ""; 022 document.getElementById('color').style.display = ""; 023 } 024 // 025 // GamePanel オブジェクト(プロパティ) 026 // 027 function GamePanel() 028 { 029 this.timerID = -1; 030 this.in_game = true; // ゲーム中か否か 031 this.py = new Puyo(); 032 return this; 033 } 034 // 035 // Puyo オブジェクト(プロパティ) 036 // 037 function Puyo() 038 { 039 this.p_x; // 左または上のピースの座標(横) 040 this.p_y; // 左または上のピースの座標(縦) 041 this.row = 12; // ゲーム画面の行数 042 this.col = 5; // ゲーム画面の列数 043 this.width = 30; // ピースの幅と高さ 044 this.rot; // 0:横,1:縦 045 this.p = new Array(); // 画面の状態(0:存在しない,1:赤,2:ピンク,3:緑,4:青) 046 for (let i1 = 0; i1 < this.row; i1++) { 047 this.p[i1] = new Array(); 048 for (let i2 = 0; i2 < this.col; i2++) 049 this.p[i1][i2] = 0; 050 } 051 this.color = new Array("rgb(255,0,0)", "rgb(255,192,203)", 052 "rgb(0,255,0)", "rgb(0,0,255)"); // ピースの色 053 return this; 054 } 055 // 056 // Puyo オブジェクト(メソッド drop) 057 // 058 Puyo.prototype.drop = function() 059 { 060 // ピースの落下 061 if (gp.py.p_y < gp.py.row-1) { 062 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 063 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 064 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 065 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 066 gp.py.p_y++; 067 } 068 else 069 gp.py.select(); // 次のピース 070 // 再描画 071 if (gp.in_game) 072 gp.py.draw(); 073 } 074 // 075 // Puyo オブジェクト(メソッド select) 076 // 077 Puyo.prototype.select = function() 078 { 079 gp.py.p_y = 0; 080 gp.py.p_x = Math.floor((gp.py.col - 1) * Math.random()); 081 gp.py.p[0][gp.py.p_x] = 1 + Math.floor(4 * Math.random()); 082 gp.py.p[0][gp.py.p_x+1] = 1 + Math.floor(4 * Math.random()); 083 } 084 // 085 // Puyo オブジェクト(メソッド draw) 086 // 087 Puyo.prototype.draw = function() 088 { 089 // キャンバスのクリア 090 mp.ctx.clearRect(0, 0, mp.canvas.width, mp.canvas.height); 091 // 描画 092 for (let i1 = 0; i1 < gp.py.row; i1++) { 093 for (let i2 = 0; i2 < gp.py.col; i2++) { 094 if (gp.py.p[i1][i2] > 0) { 095 mp.ctx.beginPath(); 096 mp.ctx.fillStyle = gp.py.color[gp.py.p[i1][i2]-1]; 097 mp.ctx.fillRect(i2*gp.py.width, i1*gp.py.width, gp.py.width, gp.py.width); 098 mp.ctx.fill(); 099 } 100 } 101 } 102 } 103 // 104 // Puyo オブジェクト(メソッド operation) 105 // 106 Puyo.prototype.operation = function(sw) 107 { 108 clearInterval(gp.timerID); // タイマーの停止 109 gop_start(); 110 }
001 gp = null; // GamePanel オブジェクト 002 003 // 004 // GamePanel の開始 005 // 006 function gp_start() 007 { 008 // GamePanel オブジェクト 009 gp = new GamePanel(); 010 // ピースの選択 011 gp.py.select(); 012 gp.py.draw(); 013 // タイマーのスタート 014 gp.timerID = setInterval('gp.py.drop()', 500); 015 // ボタンの表示制御 016 document.getElementById('method').style.display = "none"; 017 document.getElementById('start').style.display = "none"; 018 document.getElementById('finish').style.display = "none"; 019 document.getElementById('rot').style.display = ""; 020 document.getElementById('left').style.display = ""; 021 document.getElementById('right').style.display = ""; 022 document.getElementById('color').style.display = ""; 023 } 024 // 025 // GamePanel オブジェクト(プロパティ) 026 // 027 function GamePanel() 028 { 029 this.timerID = -1; 030 this.in_game = true; // ゲーム中か否か 031 this.py = new Puyo(); 032 return this; 033 } 034 // 035 // Puyo オブジェクト(プロパティ) 036 // 037 function Puyo() 038 { 039 this.p_x; // 左または上のピースの座標(横) 040 this.p_y; // 左または上のピースの座標(縦) 041 this.row = 12; // ゲーム画面の行数 042 this.col = 5; // ゲーム画面の列数 043 this.width = 30; // ピースの幅と高さ 044 this.rot; // 0:横,1:縦 045 this.p = new Array(); // 画面の状態(0:存在しない,1:赤,2:ピンク,3:緑,4:青) 046 for (let i1 = 0; i1 < this.row; i1++) { 047 this.p[i1] = new Array(); 048 for (let i2 = 0; i2 < this.col; i2++) 049 this.p[i1][i2] = 0; 050 } 051 this.color = new Array("rgb(255,0,0)", "rgb(255,192,203)", 052 "rgb(0,255,0)", "rgb(0,0,255)"); // ピースの色 053 this.ok = true; // 移動,回転,色の交換が可能か? 054 return this; 055 } 056 // 057 // Puyo オブジェクト(メソッド drop) 058 // 059 Puyo.prototype.drop = function() 060 { 061 // ピースの落下 062 let ct = 0; 063 // 横 064 if (gp.py.rot == 0) { 065 if (gp.py.p_y < gp.py.row-1) { 066 ct = 1; 067 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 068 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 069 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 070 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 071 gp.py.p_y++; 072 } 073 else 074 gp.py.ok = false; 075 } 076 // 縦 077 else { 078 if (gp.py.p_y < gp.py.row-2) { 079 ct = 1; 080 gp.py.p[gp.py.p_y+2][gp.py.p_x] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 081 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 082 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 083 gp.py.p_y++; 084 } 085 else 086 gp.py.ok = false; 087 } 088 // 次のピース 089 if (ct == 0) 090 gp.py.select(); 091 // 再描画 092 if (gp.in_game) 093 gp.py.draw(); 094 } 095 // 096 // Puyo オブジェクト(メソッド select) 097 // 098 Puyo.prototype.select = function() 099 { 100 gp.py.ok = true; 101 gp.py.rot = 0; 102 gp.py.p_y = 0; 103 gp.py.p_x = Math.floor((gp.py.col - 1) * Math.random()); 104 gp.py.p[0][gp.py.p_x] = 1 + Math.floor(4 * Math.random()); 105 gp.py.p[0][gp.py.p_x+1] = 1 + Math.floor(4 * Math.random()); 106 } 107 // 108 // Puyo オブジェクト(メソッド draw) 109 // 110 Puyo.prototype.draw = function() 111 { 112 // キャンバスのクリア 113 mp.ctx.clearRect(0, 0, mp.canvas.width, mp.canvas.height); 114 // 描画 115 for (let i1 = 0; i1 < gp.py.row; i1++) { 116 for (let i2 = 0; i2 < gp.py.col; i2++) { 117 if (gp.py.p[i1][i2] > 0) { 118 mp.ctx.beginPath(); 119 mp.ctx.fillStyle = gp.py.color[gp.py.p[i1][i2]-1]; 120 mp.ctx.fillRect(i2*gp.py.width, i1*gp.py.width, gp.py.width, gp.py.width); 121 mp.ctx.fill(); 122 } 123 } 124 } 125 } 126 // 127 // Puyo オブジェクト(メソッド operation) 128 // 129 Puyo.prototype.operation = function(sw) 130 { 131 if (gp.py.ok) { 132 switch (sw) { 133 // 左移動 134 case 0: 135 if (gp.py.p_x > 0) { 136 if (gp.py.rot == 0 && gp.py.p[gp.py.p_y][gp.py.p_x-1] == 0) { 137 gp.py.p[gp.py.p_y][gp.py.p_x-1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 138 gp.py.p[gp.py.p_y][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 139 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 140 gp.py.p_x--; 141 } 142 else if (gp.py.p[gp.py.p_y][gp.py.p_x-1] == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x-1] == 0) { 143 gp.py.p[gp.py.p_y][gp.py.p_x-1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 144 gp.py.p[gp.py.p_y+1][gp.py.p_x-1] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 145 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 146 gp.py.p[gp.py.p_y+1][gp.py.p_x] = 0; 147 gp.py.p_x--; 148 } 149 } 150 break; 151 // 右移動 152 case 1: 153 if (gp.py.rot == 0) { 154 if (gp.py.p_x < gp.py.col-2 && gp.py.p[gp.py.p_y][gp.py.p_x+2] == 0) { 155 gp.py.p[gp.py.p_y][gp.py.p_x+2] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 156 gp.py.p[gp.py.p_y][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 157 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 158 gp.py.p_x++; 159 } 160 } 161 else { 162 if (gp.py.p_x < gp.py.col-1 && gp.py.p[gp.py.p_y][gp.py.p_x+1] == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x+1] == 0) { 163 gp.py.p[gp.py.p_y][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 164 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 165 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 166 gp.py.p[gp.py.p_y+1][gp.py.p_x] = 0; 167 gp.py.p_x++; 168 } 169 } 170 break; 171 // 上下または左右入れ替え 172 case 2: 173 if (gp.py.rot == 0) { 174 let k = gp.py.p[gp.py.p_y][gp.py.p_x]; 175 gp.py.p[gp.py.p_y][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 176 gp.py.p[gp.py.p_y][gp.py.p_x+1] = k; 177 } 178 else { 179 let k = gp.py.p[gp.py.p_y][gp.py.p_x]; 180 gp.py.p[gp.py.p_y][gp.py.p_x] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 181 gp.py.p[gp.py.p_y+1][gp.py.p_x] = k; 182 } 183 break; 184 // 90度または-90度回転 185 case 3: 186 if (gp.py.rot == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0) { 187 if (gp.py.p_y < gp.py.row-1) { 188 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 189 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 190 gp.py.rot = 1; 191 } 192 } 193 else { 194 if (gp.py.p_x < gp.py.col-1 && gp.py.p[gp.py.p_y][gp.py.p_x+1] == 0) { 195 gp.py.p[gp.py.p_y][gp.py.p_x+1] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 196 gp.py.p[gp.py.p_y+1][gp.py.p_x] = 0; 197 gp.py.rot = 0; 198 } 199 } 200 break; 201 } 202 // 再描画 203 if (gp.in_game) 204 gp.py.draw(); 205 } 206 }
switch (式) { [case 定数式1 :] [文1] [case 定数式2 :] [文2] ・・・・・ [default :] [文n] }
if (式 == 定数式1) [文1] else if (式 == 定数式2) [文2] ・・・・・ else [文n]
001 gp = null; // GamePanel オブジェクト 002 003 // 004 // GamePanel の開始 005 // 006 function gp_start() 007 { 008 // GamePanel オブジェクト 009 gp = new GamePanel(); 010 // ピースの選択 011 gp.py.select(); 012 gp.py.draw(); 013 // タイマーのスタート 014 gp.timerID = setInterval('gp.py.drop()', 500); 015 // ボタンの表示制御 016 document.getElementById('method').style.display = "none"; 017 document.getElementById('start').style.display = "none"; 018 document.getElementById('finish').style.display = "none"; 019 document.getElementById('rot').style.display = ""; 020 document.getElementById('left').style.display = ""; 021 document.getElementById('right').style.display = ""; 022 document.getElementById('color').style.display = ""; 023 } 024 // 025 // GamePanel オブジェクト(プロパティ) 026 // 027 function GamePanel() 028 { 029 this.timerID = -1; 030 this.in_game = true; // ゲーム中か否か 031 this.py = new Puyo(); 032 return this; 033 } 034 // 035 // Puyo オブジェクト(プロパティ) 036 // 037 function Puyo() 038 { 039 this.p_x; // 左または上のピースの座標(横) 040 this.p_y; // 左または上のピースの座標(縦) 041 this.row = 12; // ゲーム画面の行数 042 this.col = 5; // ゲーム画面の列数 043 this.width = 30; // ピースの幅と高さ 044 this.rot; // 0:横,1:縦 045 this.p = new Array(); // 画面の状態(0:存在しない,1:赤,2:ピンク,3:緑,4:青) 046 for (let i1 = 0; i1 < this.row; i1++) { 047 this.p[i1] = new Array(); 048 for (let i2 = 0; i2 < this.col; i2++) 049 this.p[i1][i2] = 0; 050 } 051 this.color = new Array("rgb(255,0,0)", "rgb(255,192,203)", 052 "rgb(0,255,0)", "rgb(0,0,255)"); // ピースの色 053 this.ok = true; // 移動,回転,色の交換が可能か? 054 return this; 055 } 056 // 057 // Puyo オブジェクト(メソッド drop) 058 // 059 Puyo.prototype.drop = function() 060 { 061 // ピースの落下 062 let ct = 0; 063 // 横 064 if (gp.py.rot == 0) { 065 if (gp.py.p_y < gp.py.row-1) { 066 if (gp.py.ok) { 067 if (gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x+1] == 0) { 068 ct = 1; 069 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 070 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 071 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 072 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 073 gp.py.p_y++; 074 } 075 else { 076 gp.py.ok = false; 077 if (gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0) { 078 ct = 1; 079 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 080 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 081 gp.py.p_y++; 082 } 083 else if (gp.py.p[gp.py.p_y+1][gp.py.p_x+1] == 0) { 084 ct = 1; 085 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 086 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 087 gp.py.p_x++; 088 gp.py.p_y++; 089 } 090 } 091 } 092 else { 093 if (gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0) { 094 ct = 1; 095 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 096 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 097 gp.py.p_y++; 098 } 099 } 100 } 101 else 102 gp.py.ok = false; 103 } 104 // 縦 105 else { 106 if (gp.py.p_y < gp.py.row-2 && gp.py.p[gp.py.p_y+2][gp.py.p_x] == 0) { 107 ct = 1; 108 gp.py.p[gp.py.p_y+2][gp.py.p_x] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 109 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 110 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 111 gp.py.p_y++; 112 } 113 else 114 gp.py.ok = false; 115 } 116 // 次のピース 117 if (ct == 0) 118 gp.py.select(); 119 // 再描画 120 if (gp.in_game) 121 gp.py.draw(); 122 } 123 // 124 // Puyo オブジェクト(メソッド select) 125 // 126 Puyo.prototype.select = function() 127 { 128 gp.py.ok = true; 129 gp.py.rot = 0; 130 gp.py.p_y = 0; 131 gp.py.p_x = Math.floor((gp.py.col - 1) * Math.random()); 132 if (gp.py.p[0][gp.py.p_x] == 0 && gp.py.p[0][gp.py.p_x+1] == 0) { 133 gp.py.p[0][gp.py.p_x] = 1 + Math.floor(4 * Math.random()); 134 gp.py.p[0][gp.py.p_x+1] = 1 + Math.floor(4 * Math.random()); 135 } 136 else { // ゲームオーバー 137 gp.in_game = false; 138 clearInterval(gp.py.timerID); // タイマーの停止 139 gop_start(); 140 } 141 } 142 // 143 // Puyo オブジェクト(メソッド draw) 144 // 145 Puyo.prototype.draw = function() 146 { 147 // キャンバスのクリア 148 mp.ctx.clearRect(0, 0, mp.canvas.width, mp.canvas.height); 149 // 描画 150 for (let i1 = 0; i1 < gp.py.row; i1++) { 151 for (let i2 = 0; i2 < gp.py.col; i2++) { 152 if (gp.py.p[i1][i2] > 0) { 153 mp.ctx.beginPath(); 154 mp.ctx.fillStyle = gp.py.color[gp.py.p[i1][i2]-1]; 155 mp.ctx.fillRect(i2*gp.py.width, i1*gp.py.width, gp.py.width, gp.py.width); 156 mp.ctx.fill(); 157 } 158 } 159 } 160 } 161 // 162 // Puyo オブジェクト(メソッド operation) 163 // 164 Puyo.prototype.operation = function(sw) 165 { 166 if (gp.py.ok) { 167 switch (sw) { 168 // 左移動 169 case 0: 170 if (gp.py.p_x > 0) { 171 if (gp.py.rot == 0 && gp.py.p[gp.py.p_y][gp.py.p_x-1] == 0) { 172 gp.py.p[gp.py.p_y][gp.py.p_x-1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 173 gp.py.p[gp.py.p_y][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 174 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 175 gp.py.p_x--; 176 } 177 else if (gp.py.p[gp.py.p_y][gp.py.p_x-1] == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x-1] == 0) { 178 gp.py.p[gp.py.p_y][gp.py.p_x-1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 179 gp.py.p[gp.py.p_y+1][gp.py.p_x-1] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 180 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 181 gp.py.p[gp.py.p_y+1][gp.py.p_x] = 0; 182 gp.py.p_x--; 183 } 184 } 185 break; 186 // 右移動 187 case 1: 188 if (gp.py.rot == 0) { 189 if (gp.py.p_x < gp.py.col-2 && gp.py.p[gp.py.p_y][gp.py.p_x+2] == 0) { 190 gp.py.p[gp.py.p_y][gp.py.p_x+2] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 191 gp.py.p[gp.py.p_y][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 192 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 193 gp.py.p_x++; 194 } 195 } 196 else { 197 if (gp.py.p_x < gp.py.col-1 && gp.py.p[gp.py.p_y][gp.py.p_x+1] == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x+1] == 0) { 198 gp.py.p[gp.py.p_y][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 199 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 200 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 201 gp.py.p[gp.py.p_y+1][gp.py.p_x] = 0; 202 gp.py.p_x++; 203 } 204 } 205 break; 206 // 上下または左右入れ替え 207 case 2: 208 if (gp.py.rot == 0) { 209 let k = gp.py.p[gp.py.p_y][gp.py.p_x]; 210 gp.py.p[gp.py.p_y][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 211 gp.py.p[gp.py.p_y][gp.py.p_x+1] = k; 212 } 213 else { 214 let k = gp.py.p[gp.py.p_y][gp.py.p_x]; 215 gp.py.p[gp.py.p_y][gp.py.p_x] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 216 gp.py.p[gp.py.p_y+1][gp.py.p_x] = k; 217 } 218 break; 219 // 90度または-90度回転 220 case 3: 221 if (gp.py.rot == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0) { 222 if (gp.py.p_y < gp.py.row-1) { 223 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 224 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 225 gp.py.rot = 1; 226 } 227 } 228 else { 229 if (gp.py.p_x < gp.py.col-1 && gp.py.p[gp.py.p_y][gp.py.p_x+1] == 0) { 230 gp.py.p[gp.py.p_y][gp.py.p_x+1] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 231 gp.py.p[gp.py.p_y+1][gp.py.p_x] = 0; 232 gp.py.rot = 0; 233 } 234 } 235 break; 236 } 237 // 再描画 238 if (gp.in_game) 239 gp.py.draw(); 240 } 241 }
001 gp = null; // GamePanel オブジェクト 002 003 // 004 // GamePanel の開始 005 // 006 function gp_start() 007 { 008 // GamePanel オブジェクト 009 gp = new GamePanel(); 010 // ピースの選択 011 gp.py.select(); 012 gp.py.draw(); 013 // タイマーのスタート 014 gp.timerID = setInterval('gp.py.drop()', 500); 015 // ボタンの表示制御 016 document.getElementById('method').style.display = "none"; 017 document.getElementById('start').style.display = "none"; 018 document.getElementById('finish').style.display = "none"; 019 document.getElementById('rot').style.display = ""; 020 document.getElementById('left').style.display = ""; 021 document.getElementById('right').style.display = ""; 022 document.getElementById('color').style.display = ""; 023 } 024 // 025 // GamePanel オブジェクト(プロパティ) 026 // 027 function GamePanel() 028 { 029 this.timerID = -1; 030 this.in_game = true; // ゲーム中か否か 031 this.py = new Puyo(); 032 return this; 033 } 034 // 035 // Puyo オブジェクト(プロパティ) 036 // 037 function Puyo() 038 { 039 this.p_x; // 左または上のピースの座標(横) 040 this.p_y; // 左または上のピースの座標(縦) 041 this.row = 12; // ゲーム画面の行数 042 this.col = 5; // ゲーム画面の列数 043 this.width = 30; // ピースの幅と高さ 044 this.rot; // 0:横,1:縦 045 this.p = new Array(); // 画面の状態(0:存在しない,1:赤,2:ピンク,3:緑,4:青) 046 for (let i1 = 0; i1 < this.row; i1++) { 047 this.p[i1] = new Array(); 048 for (let i2 = 0; i2 < this.col; i2++) 049 this.p[i1][i2] = 0; 050 } 051 this.color = new Array("rgb(255,0,0)", "rgb(255,192,203)", 052 "rgb(0,255,0)", "rgb(0,0,255)"); // ピースの色 053 this.ok = true; // 移動,回転,色の交換が可能か? 054 this.d_no = 4; // 同じ色のピースがd_no以上連続すると消去 055 this.pp = new Array(); // work 056 for (let i1 = 0; i1 < this.row; i1++) 057 this.pp[i1] = new Array(); 058 return this; 059 } 060 // 061 // Puyo オブジェクト(メソッド drop) 062 // 063 Puyo.prototype.drop = function() 064 { 065 // ピースの落下 066 let ct = 0; 067 // 横 068 if (gp.py.rot == 0) { 069 if (gp.py.p_y < gp.py.row-1) { 070 if (gp.py.ok) { 071 if (gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x+1] == 0) { 072 ct = 1; 073 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 074 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 075 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 076 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 077 gp.py.p_y++; 078 } 079 else { 080 gp.py.ok = false; 081 if (gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0) { 082 ct = 1; 083 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 084 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 085 gp.py.p_y++; 086 } 087 else if (gp.py.p[gp.py.p_y+1][gp.py.p_x+1] == 0) { 088 ct = 1; 089 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 090 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 091 gp.py.p_x++; 092 gp.py.p_y++; 093 } 094 } 095 } 096 else { 097 if (gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0) { 098 ct = 1; 099 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 100 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 101 gp.py.p_y++; 102 } 103 } 104 } 105 else 106 gp.py.ok = false; 107 } 108 // 縦 109 else { 110 if (gp.py.p_y < gp.py.row-2 && gp.py.p[gp.py.p_y+2][gp.py.p_x] == 0) { 111 ct = 1; 112 gp.py.p[gp.py.p_y+2][gp.py.p_x] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 113 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 114 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 115 gp.py.p_y++; 116 } 117 else 118 gp.py.ok = false; 119 } 120 // 消去と次のピース 121 if (ct == 0) { 122 ct = gp.py.d_no; 123 while (ct >= gp.py.d_no) { 124 ct = 0; 125 for (let i1 = gp.py.row-1; i1 >= 0 && ct < gp.py.d_no; i1--) { 126 for (let i2 = 0; i2 < gp.py.col && ct < gp.py.d_no; i2++) { 127 if (gp.py.p[i1][i2] > 0) { 128 for (let i3 = 0; i3 < gp.py.row; i3++) { 129 for (let i4 = 0; i4 < gp.py.col; i4++) 130 gp.py.pp[i3][i4] = 0; 131 } 132 gp.py.pp[i1][i2] = 1; 133 ct = gp.py.search(i1, i2, 1); 134 } 135 } 136 } 137 if (ct >= gp.py.d_no) 138 gp.py.del(); 139 } 140 gp.py.select(); 141 } 142 // 再描画 143 if (gp.in_game) 144 gp.py.draw(); 145 } 146 // 147 // Puyo オブジェクト(メソッド select) 148 // 149 Puyo.prototype.select = function() 150 { 151 gp.py.ok = true; 152 gp.py.rot = 0; 153 gp.py.p_y = 0; 154 gp.py.p_x = Math.floor((gp.py.col - 1) * Math.random()); 155 if (gp.py.p[0][gp.py.p_x] == 0 && gp.py.p[0][gp.py.p_x+1] == 0) { 156 gp.py.p[0][gp.py.p_x] = 1 + Math.floor(4 * Math.random()); 157 gp.py.p[0][gp.py.p_x+1] = 1 + Math.floor(4 * Math.random()); 158 } 159 else { // ゲームオーバー 160 gp.in_game = false; 161 clearInterval(gp.py.timerID); // タイマーの停止 162 gop_start(); 163 } 164 } 165 // 166 // 同じ色のピースを探す 167 // k1,k2 : 対象としているピース 168 // c1 : 同じ色のピースの数 169 // return : 同じ色のピースの数 170 // 171 Puyo.prototype.search = function(k1, k2, c1) 172 { 173 let ct = c1; 174 175 if (k1 > 0 && gp.py.p[k1-1][k2] == gp.py.p[k1][k2] && gp.py.pp[k1-1][k2] == 0) { 176 gp.py.pp[k1-1][k2] = 1; 177 ct = gp.py.search(k1-1, k2, ct+1); 178 } 179 if (k1 < gp.py.row-1 && gp.py.p[k1+1][k2] == gp.py.p[k1][k2] && gp.py.pp[k1+1][k2] == 0) { 180 gp.py.pp[k1+1][k2] = 1; 181 ct = gp.py.search(k1+1, k2, ct+1); 182 } 183 if (k2 > 0 && gp.py.p[k1][k2-1] == gp.py.p[k1][k2] && gp.py.pp[k1][k2-1] == 0) { 184 gp.py.pp[k1][k2-1] = 1; 185 ct = gp.py.search(k1, k2-1, ct+1); 186 } 187 if (k2 < gp.py.col-1 && gp.py.p[k1][k2+1] == gp.py.p[k1][k2] && gp.py.pp[k1][k2+1] == 0) { 188 gp.py.pp[k1][k2+1] = 1; 189 ct = gp.py.search(k1, k2+1, ct+1); 190 } 191 192 return ct; 193 } 194 // 195 // 同じ色のピースを削除 196 // 197 Puyo.prototype.del = function() 198 { 199 // 削除 200 for (let i1 = 0; i1 < gp.py.row; i1++) { 201 for (let i2 = 0; i2 < gp.py.col; i2++) { 202 if (gp.py.pp[i1][i2] > 0) 203 gp.py.p[i1][i2] = 0; 204 } 205 } 206 // 詰める 207 for (let i1 = 0; i1 < gp.py.col; i1++) { 208 k1 = 1; 209 for (let i2 = gp.py.row-1; i2 > 0 && k1 >= 0; i2--) { 210 if (gp.py.p[i2][i1] == 0) { 211 k1 = -1; 212 for (i3 = i2-1; i3 >= 0 && k1 < 0; i3--) { 213 if (gp.py.p[i3][i1] > 0) 214 k1 = i3; 215 } 216 if (k1 >= 0) { 217 k2 = i2; 218 k3 = k2 - k1; 219 while (k1 >= 0) { 220 gp.py.p[k2][i1] = gp.py.p[k1][i1]; 221 k1--; 222 k2--; 223 } 224 k1++; 225 for (i3 = 0; i3 < k3; i3++) 226 gp.py.p[i3][i1] = 0; 227 } 228 } 229 } 230 } 231 } 232 // 233 // Puyo オブジェクト(メソッド draw) 234 // 235 Puyo.prototype.draw = function() 236 { 237 // キャンバスのクリア 238 mp.ctx.clearRect(0, 0, mp.canvas.width, mp.canvas.height); 239 // 描画 240 for (let i1 = 0; i1 < gp.py.row; i1++) { 241 for (let i2 = 0; i2 < gp.py.col; i2++) { 242 if (gp.py.p[i1][i2] > 0) { 243 mp.ctx.beginPath(); 244 mp.ctx.fillStyle = gp.py.color[gp.py.p[i1][i2]-1]; 245 mp.ctx.fillRect(i2*gp.py.width, i1*gp.py.width, gp.py.width, gp.py.width); 246 mp.ctx.fill(); 247 } 248 } 249 } 250 } 251 // 252 // Puyo オブジェクト(メソッド operation) 253 // 254 Puyo.prototype.operation = function(sw) 255 { 256 if (gp.py.ok) { 257 switch (sw) { 258 // 左移動 259 case 0: 260 if (gp.py.p_x > 0) { 261 if (gp.py.rot == 0 && gp.py.p[gp.py.p_y][gp.py.p_x-1] == 0) { 262 gp.py.p[gp.py.p_y][gp.py.p_x-1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 263 gp.py.p[gp.py.p_y][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 264 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 265 gp.py.p_x--; 266 } 267 else if (gp.py.p[gp.py.p_y][gp.py.p_x-1] == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x-1] == 0) { 268 gp.py.p[gp.py.p_y][gp.py.p_x-1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 269 gp.py.p[gp.py.p_y+1][gp.py.p_x-1] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 270 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 271 gp.py.p[gp.py.p_y+1][gp.py.p_x] = 0; 272 gp.py.p_x--; 273 } 274 } 275 break; 276 // 右移動 277 case 1: 278 if (gp.py.rot == 0) { 279 if (gp.py.p_x < gp.py.col-2 && gp.py.p[gp.py.p_y][gp.py.p_x+2] == 0) { 280 gp.py.p[gp.py.p_y][gp.py.p_x+2] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 281 gp.py.p[gp.py.p_y][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 282 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 283 gp.py.p_x++; 284 } 285 } 286 else { 287 if (gp.py.p_x < gp.py.col-1 && gp.py.p[gp.py.p_y][gp.py.p_x+1] == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x+1] == 0) { 288 gp.py.p[gp.py.p_y][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 289 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 290 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 291 gp.py.p[gp.py.p_y+1][gp.py.p_x] = 0; 292 gp.py.p_x++; 293 } 294 } 295 break; 296 // 上下または左右入れ替え 297 case 2: 298 if (gp.py.rot == 0) { 299 let k = gp.py.p[gp.py.p_y][gp.py.p_x]; 300 gp.py.p[gp.py.p_y][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 301 gp.py.p[gp.py.p_y][gp.py.p_x+1] = k; 302 } 303 else { 304 let k = gp.py.p[gp.py.p_y][gp.py.p_x]; 305 gp.py.p[gp.py.p_y][gp.py.p_x] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 306 gp.py.p[gp.py.p_y+1][gp.py.p_x] = k; 307 } 308 break; 309 // 90度または-90度回転 310 case 3: 311 if (gp.py.rot == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0) { 312 if (gp.py.p_y < gp.py.row-1) { 313 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 314 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 315 gp.py.rot = 1; 316 } 317 } 318 else { 319 if (gp.py.p_x < gp.py.col-1 && gp.py.p[gp.py.p_y][gp.py.p_x+1] == 0) { 320 gp.py.p[gp.py.p_y][gp.py.p_x+1] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 321 gp.py.p[gp.py.p_y+1][gp.py.p_x] = 0; 322 gp.py.rot = 0; 323 } 324 } 325 break; 326 } 327 // 再描画 328 if (gp.in_game) 329 gp.py.draw(); 330 } 331 }
01 <!DOCTYPE HTML>
02 <HTML>
03 <HEAD>
04 <TITLE>ぷよぷよ:ステップ6(完成)</TITLE>
05 <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
06 <LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
07 <SCRIPT TYPE="text/javascript" SRC="main/MainPanel.js"></SCRIPT>
08 <SCRIPT TYPE="text/javascript" SRC="start/StartPanel.js"></SCRIPT>
09 <SCRIPT TYPE="text/javascript" SRC="game/GamePanel.js"></SCRIPT>
10 <SCRIPT TYPE="text/javascript" SRC="over/GameOverPanel.js"></SCRIPT>
11 </HEAD>
12 <BODY CLASS="eeffee" onLoad="mp_start()">
13 <H1>ぷよぷよ:ステップ6(完成)</H1>
14 <CANVAS ID="canvas_e" STYLE="background-color: #ffffff;" WIDTH="150" HEIGHT="360"></CANVAS><BR>
15 <A HREF="method.htm" TARGET="method"><BUTTON ID="method" CLASS="std">遊び方</BUTTON></A>
16 <BUTTON ID="start" CLASS="std" onClick="gp_start()">ゲーム開始</BUTTON>
17 <BUTTON ID="finish" CLASS="std" onClick="mp.finish()">終了</BUTTON>
18 <BUTTON ID="rot" CLASS="std" onClick="gp.py.operation(3)">回転</BUTTON><BR>
19 <BUTTON ID="left" CLASS="std" onClick="gp.py.operation(0)">左</BUTTON>
20 <BUTTON ID="right" CLASS="std" onClick="gp.py.operation(1)">右</BUTTON><BR>
21 <BUTTON ID="color" CLASS="std" onClick="gp.py.operation(2)">色交換</BUTTON>
22 <AUDIO ID="BGM" LOOP SRC="Puyo_BGM.mp3"></AUDIO> <!-- BGMのために追加 -->
23 </BODY>
24 </HTML>
001 gp = null; // GamePanel オブジェクト 002 003 // 004 // GamePanel の開始 005 // 006 function gp_start() 007 { 008 // BGM の再生 009 document.getElementById('BGM').volume = 0.5; 010 document.getElementById('BGM').play(); 011 document.getElementById('BGM').currentTime = 0.5; // 約0.5秒の空白をスキップ 012 // GamePanel オブジェクト 013 gp = new GamePanel(); 014 // ピースの選択 015 gp.py.select(); 016 gp.py.draw(); 017 // タイマーのスタート 018 gp.timerID = setInterval('gp.py.drop()', 500); 019 // ボタンの表示制御 020 document.getElementById('method').style.display = "none"; 021 document.getElementById('start').style.display = "none"; 022 document.getElementById('finish').style.display = "none"; 023 document.getElementById('rot').style.display = ""; 024 document.getElementById('left').style.display = ""; 025 document.getElementById('right').style.display = ""; 026 document.getElementById('color').style.display = ""; 027 } 028 // 029 // GamePanel オブジェクト(プロパティ) 030 // 031 function GamePanel() 032 { 033 this.timerID = -1; 034 this.in_game = true; // ゲーム中か否か 035 this.py = new Puyo(); 036 return this; 037 } 038 // 039 // Puyo オブジェクト(プロパティ) 040 // 041 function Puyo() 042 { 043 this.p_x; // 左または上のピースの座標(横) 044 this.p_y; // 左または上のピースの座標(縦) 045 this.row = 12; // ゲーム画面の行数 046 this.col = 5; // ゲーム画面の列数 047 this.width = 30; // ピースの幅と高さ 048 this.rot; // 0:横,1:縦 049 this.p = new Array(); // 画面の状態(0:存在しない,1:赤,2:ピンク,3:緑,4:青) 050 for (let i1 = 0; i1 < this.row; i1++) { 051 this.p[i1] = new Array(); 052 for (let i2 = 0; i2 < this.col; i2++) 053 this.p[i1][i2] = 0; 054 } 055 this.color = new Array("rgb(255,0,0)", "rgb(255,192,203)", 056 "rgb(0,255,0)", "rgb(0,0,255)"); // ピースの色 057 this.ok = true; // 移動,回転,色の交換が可能か? 058 this.d_no = 4; // 同じ色のピースがd_no以上連続すると消去 059 this.pp = new Array(); // work 060 for (let i1 = 0; i1 < this.row; i1++) 061 this.pp[i1] = new Array(); 062 return this; 063 } 064 // 065 // Puyo オブジェクト(メソッド drop) 066 // 067 Puyo.prototype.drop = function() 068 { 069 // ピースの落下 070 let ct = 0; 071 // 横 072 if (gp.py.rot == 0) { 073 if (gp.py.p_y < gp.py.row-1) { 074 if (gp.py.ok) { 075 if (gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x+1] == 0) { 076 ct = 1; 077 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 078 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 079 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 080 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 081 gp.py.p_y++; 082 } 083 else { 084 gp.py.ok = false; 085 if (gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0) { 086 ct = 1; 087 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 088 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 089 gp.py.p_y++; 090 } 091 else if (gp.py.p[gp.py.p_y+1][gp.py.p_x+1] == 0) { 092 ct = 1; 093 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 094 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 095 gp.py.p_x++; 096 gp.py.p_y++; 097 } 098 } 099 } 100 else { 101 if (gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0) { 102 ct = 1; 103 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 104 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 105 gp.py.p_y++; 106 } 107 } 108 } 109 else 110 gp.py.ok = false; 111 } 112 // 縦 113 else { 114 if (gp.py.p_y < gp.py.row-2 && gp.py.p[gp.py.p_y+2][gp.py.p_x] == 0) { 115 ct = 1; 116 gp.py.p[gp.py.p_y+2][gp.py.p_x] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 117 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x]; 118 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 119 gp.py.p_y++; 120 } 121 else 122 gp.py.ok = false; 123 } 124 // 消去と次のピース 125 if (ct == 0) { 126 ct = gp.py.d_no; 127 while (ct >= gp.py.d_no) { 128 ct = 0; 129 for (let i1 = gp.py.row-1; i1 >= 0 && ct < gp.py.d_no; i1--) { 130 for (let i2 = 0; i2 < gp.py.col && ct < gp.py.d_no; i2++) { 131 if (gp.py.p[i1][i2] > 0) { 132 for (let i3 = 0; i3 < gp.py.row; i3++) { 133 for (let i4 = 0; i4 < gp.py.col; i4++) 134 gp.py.pp[i3][i4] = 0; 135 } 136 gp.py.pp[i1][i2] = 1; 137 ct = gp.py.search(i1, i2, 1); 138 } 139 } 140 } 141 if (ct >= gp.py.d_no) 142 gp.py.del(); 143 } 144 gp.py.select(); 145 } 146 // 再描画 147 if (gp.in_game) 148 gp.py.draw(); 149 } 150 // 151 // Puyo オブジェクト(メソッド select) 152 // 153 Puyo.prototype.select = function() 154 { 155 gp.py.ok = true; 156 gp.py.rot = 0; 157 gp.py.p_y = 0; 158 gp.py.p_x = Math.floor((gp.py.col - 1) * Math.random()); 159 if (gp.py.p[0][gp.py.p_x] == 0 && gp.py.p[0][gp.py.p_x+1] == 0) { 160 gp.py.p[0][gp.py.p_x] = 1 + Math.floor(4 * Math.random()); 161 gp.py.p[0][gp.py.p_x+1] = 1 + Math.floor(4 * Math.random()); 162 } 163 else { // ゲームオーバー 164 document.getElementById('BGM').pause(); // BGMのために追加 165 document.getElementById('BGM').load(); // BGMのために追加 166 gp.in_game = false; 167 clearInterval(gp.py.timerID); // タイマーの停止 168 gop_start(); 169 } 170 } 171 // 172 // 同じ色のピースを探す 173 // k1,k2 : 対象としているピース 174 // c1 : 同じ色のピースの数 175 // return : 同じ色のピースの数 176 // 177 Puyo.prototype.search = function(k1, k2, c1) 178 { 179 let ct = c1; 180 181 if (k1 > 0 && gp.py.p[k1-1][k2] == gp.py.p[k1][k2] && gp.py.pp[k1-1][k2] == 0) { 182 gp.py.pp[k1-1][k2] = 1; 183 ct = gp.py.search(k1-1, k2, ct+1); 184 } 185 if (k1 < gp.py.row-1 && gp.py.p[k1+1][k2] == gp.py.p[k1][k2] && gp.py.pp[k1+1][k2] == 0) { 186 gp.py.pp[k1+1][k2] = 1; 187 ct = gp.py.search(k1+1, k2, ct+1); 188 } 189 if (k2 > 0 && gp.py.p[k1][k2-1] == gp.py.p[k1][k2] && gp.py.pp[k1][k2-1] == 0) { 190 gp.py.pp[k1][k2-1] = 1; 191 ct = gp.py.search(k1, k2-1, ct+1); 192 } 193 if (k2 < gp.py.col-1 && gp.py.p[k1][k2+1] == gp.py.p[k1][k2] && gp.py.pp[k1][k2+1] == 0) { 194 gp.py.pp[k1][k2+1] = 1; 195 ct = gp.py.search(k1, k2+1, ct+1); 196 } 197 198 return ct; 199 } 200 // 201 // 同じ色のピースを削除 202 // 203 Puyo.prototype.del = function() 204 { 205 // 削除 206 for (let i1 = 0; i1 < gp.py.row; i1++) { 207 for (let i2 = 0; i2 < gp.py.col; i2++) { 208 if (gp.py.pp[i1][i2] > 0) 209 gp.py.p[i1][i2] = 0; 210 } 211 } 212 // 詰める 213 for (let i1 = 0; i1 < gp.py.col; i1++) { 214 k1 = 1; 215 for (let i2 = gp.py.row-1; i2 > 0 && k1 >= 0; i2--) { 216 if (gp.py.p[i2][i1] == 0) { 217 k1 = -1; 218 for (i3 = i2-1; i3 >= 0 && k1 < 0; i3--) { 219 if (gp.py.p[i3][i1] > 0) 220 k1 = i3; 221 } 222 if (k1 >= 0) { 223 k2 = i2; 224 k3 = k2 - k1; 225 while (k1 >= 0) { 226 gp.py.p[k2][i1] = gp.py.p[k1][i1]; 227 k1--; 228 k2--; 229 } 230 k1++; 231 for (i3 = 0; i3 < k3; i3++) 232 gp.py.p[i3][i1] = 0; 233 } 234 } 235 } 236 } 237 } 238 // 239 // Puyo オブジェクト(メソッド draw) 240 // 241 Puyo.prototype.draw = function() 242 { 243 // キャンバスのクリア 244 mp.ctx.clearRect(0, 0, mp.canvas.width, mp.canvas.height); 245 // 描画 246 for (let i1 = 0; i1 < gp.py.row; i1++) { 247 for (let i2 = 0; i2 < gp.py.col; i2++) { 248 if (gp.py.p[i1][i2] > 0) { 249 mp.ctx.beginPath(); 250 mp.ctx.fillStyle = gp.py.color[gp.py.p[i1][i2]-1]; 251 mp.ctx.fillRect(i2*gp.py.width, i1*gp.py.width, gp.py.width, gp.py.width); 252 mp.ctx.fill(); 253 } 254 } 255 } 256 } 257 // 258 // Puyo オブジェクト(メソッド operation) 259 // 260 Puyo.prototype.operation = function(sw) 261 { 262 if (gp.py.ok) { 263 switch (sw) { 264 // 左移動 265 case 0: 266 if (gp.py.p_x > 0) { 267 if (gp.py.rot == 0 && gp.py.p[gp.py.p_y][gp.py.p_x-1] == 0) { 268 gp.py.p[gp.py.p_y][gp.py.p_x-1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 269 gp.py.p[gp.py.p_y][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 270 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 271 gp.py.p_x--; 272 } 273 else if (gp.py.p[gp.py.p_y][gp.py.p_x-1] == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x-1] == 0) { 274 gp.py.p[gp.py.p_y][gp.py.p_x-1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 275 gp.py.p[gp.py.p_y+1][gp.py.p_x-1] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 276 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 277 gp.py.p[gp.py.p_y+1][gp.py.p_x] = 0; 278 gp.py.p_x--; 279 } 280 } 281 break; 282 // 右移動 283 case 1: 284 if (gp.py.rot == 0) { 285 if (gp.py.p_x < gp.py.col-2 && gp.py.p[gp.py.p_y][gp.py.p_x+2] == 0) { 286 gp.py.p[gp.py.p_y][gp.py.p_x+2] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 287 gp.py.p[gp.py.p_y][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 288 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 289 gp.py.p_x++; 290 } 291 } 292 else { 293 if (gp.py.p_x < gp.py.col-1 && gp.py.p[gp.py.p_y][gp.py.p_x+1] == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x+1] == 0) { 294 gp.py.p[gp.py.p_y][gp.py.p_x+1] = gp.py.p[gp.py.p_y][gp.py.p_x]; 295 gp.py.p[gp.py.p_y+1][gp.py.p_x+1] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 296 gp.py.p[gp.py.p_y][gp.py.p_x] = 0; 297 gp.py.p[gp.py.p_y+1][gp.py.p_x] = 0; 298 gp.py.p_x++; 299 } 300 } 301 break; 302 // 上下または左右入れ替え 303 case 2: 304 if (gp.py.rot == 0) { 305 let k = gp.py.p[gp.py.p_y][gp.py.p_x]; 306 gp.py.p[gp.py.p_y][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 307 gp.py.p[gp.py.p_y][gp.py.p_x+1] = k; 308 } 309 else { 310 let k = gp.py.p[gp.py.p_y][gp.py.p_x]; 311 gp.py.p[gp.py.p_y][gp.py.p_x] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 312 gp.py.p[gp.py.p_y+1][gp.py.p_x] = k; 313 } 314 break; 315 // 90度または-90度回転 316 case 3: 317 if (gp.py.rot == 0 && gp.py.p[gp.py.p_y+1][gp.py.p_x] == 0) { 318 if (gp.py.p_y < gp.py.row-1) { 319 gp.py.p[gp.py.p_y+1][gp.py.p_x] = gp.py.p[gp.py.p_y][gp.py.p_x+1]; 320 gp.py.p[gp.py.p_y][gp.py.p_x+1] = 0; 321 gp.py.rot = 1; 322 } 323 } 324 else { 325 if (gp.py.p_x < gp.py.col-1 && gp.py.p[gp.py.p_y][gp.py.p_x+1] == 0) { 326 gp.py.p[gp.py.p_y][gp.py.p_x+1] = gp.py.p[gp.py.p_y+1][gp.py.p_x]; 327 gp.py.p[gp.py.p_y+1][gp.py.p_x] = 0; 328 gp.py.rot = 0; 329 } 330 } 331 break; 332 } 333 // 再描画 334 if (gp.in_game) 335 gp.py.draw(); 336 } 337 }
情報学部 | 菅沼ホーム | JavaScript 目次 | 索引 |