| 情報学部 | 菅沼ホーム | 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 目次 | 索引 |