var intGame = 0;
var intHint = 0;
var intComPanel = 0;
var intComCount = 0;
var intGameTID = 0;
var intPanel = new Array(64);
var intStack = new Array(64);
var intEnablePointA = new Array(9, 1, 6, 2, 3, 7, 1, 9, 1, 1, 2, 1, 1, 3, 1, 1, 6, 2, 3, 4, 5, 4, 3, 7, 2, 1, 4, 0, 0, 5, 1, 3, 3, 1, 5, 0, 0, 4, 1, 2, 7, 3, 4, 5, 4, 3, 2, 6, 1, 1, 3, 1, 1, 2, 1, 1, 9, 1, 7, 3, 2, 6, 1, 9);
var intEnablePointB = new Array(9, 1, 7, 3, 2, 6, 1, 9, 1, 1, 3, 1, 1, 2, 1, 1, 7, 3, 4, 5, 4, 3, 2, 6, 3, 1, 5, 0, 0, 4, 1, 2, 2, 1, 4, 0, 0, 5, 1, 3, 6, 2, 3, 4, 5, 4, 3, 7, 1, 1, 2, 1, 1, 3, 1, 1, 9, 1, 6, 2, 3, 7, 1, 9);

function calNextPanel(intMyColor, intYourColor, intEnableA, intEnableB)
{
	var i = 0;
	var j = 0;
	var k = 0;
	var l = 0;
	var intNum = 0;
	var intPoint = 0;
	var intPointA = 0;
	var intPointB = 0;
	var intPointC = 0;
	var intMaxPoint = -9999;
	var intPanelStackA = new Array(64);
	var intPanelStackB = new Array(64);
	var intPanelStackC = new Array(64);
	var intArray = new Array(64);
	var intCount = 0;
	window.status = "コンピュータ思考中...";
	for (i = 0; i < 64; i++) if (intPanel[i] == 0)
	{
		intNum = 0;
		intNum = getChangePanelAfter(i, -1, -1, intMyColor, intYourColor);
		intNum += getChangePanelAfter(i, -1, 0, intMyColor, intYourColor);
		intNum += getChangePanelAfter(i, -1, 1, intMyColor, intYourColor);
		intNum += getChangePanelAfter(i, 0, -1, intMyColor, intYourColor);
		intNum += getChangePanelAfter(i, 0, 1, intMyColor, intYourColor);
		intNum += getChangePanelAfter(i, 1, -1, intMyColor, intYourColor);
		intNum += getChangePanelAfter(i, 1, 0, intMyColor, intYourColor);
		intNum += getChangePanelAfter(i, 1, 1, intMyColor, intYourColor);
		if (intNum > 0)
		{
			window.status = "コンピュータ思考中...  " + Math.floor(i / 64 * 100) + " ％完了";
			intPointA = -9999;
			intPointB = -9999;
			intPointC = -9999;
			for (j = 0; j < 64; j++) intPanelStackA[j] = intPanel[j];
			changePanel(i, intMyColor);
			for (j = 0; j < 64; j++) if (intPanelStackA[j] == 0 && intPanel[j] == intMyColor && intPointA < intEnableA[j]) intPointA = intEnableA[j];
			for (j = 0; j < 64; j++) if (intPanel[j] == 0)
			{
				intNum = 0;
				intNum = getChangePanelAfter(j, -1, -1, intYourColor, intMyColor);
				intNum += getChangePanelAfter(j, -1, 0, intYourColor, intMyColor);
				intNum += getChangePanelAfter(j, -1, 1, intYourColor, intMyColor);
				intNum += getChangePanelAfter(j, 0, -1, intYourColor, intMyColor);
				intNum += getChangePanelAfter(j, 0, 1, intYourColor, intMyColor);
				intNum += getChangePanelAfter(j, 1, -1, intYourColor, intMyColor);
				intNum += getChangePanelAfter(j, 1, 0, intYourColor, intMyColor);
				intNum += getChangePanelAfter(j, 1, 1, intYourColor, intMyColor);
				if (intNum > 0)
				{
					for (k = 0; k < 64; k++) intPanelStackB[k] = intPanel[k];
					changePanel(j, intYourColor);
					for (k = 0; k < 64; k++) if (intPanelStackB[k] == 0 && intPanel[k] == intYourColor && intPointB < intEnableB[k]) intPointB = intEnableB[k];
					for (k = 0; k < 64; k++) if (intPanel[k] == 0)
					{
						intNum = 0;
						intNum = getChangePanelAfter(k, -1, -1, intMyColor, intYourColor);
						intNum += getChangePanelAfter(k, -1, 0, intMyColor, intYourColor);
						intNum += getChangePanelAfter(k, -1, 1, intMyColor, intYourColor);
						intNum += getChangePanelAfter(k, 0, -1, intMyColor, intYourColor);
						intNum += getChangePanelAfter(k, 0, 1, intMyColor, intYourColor);
						intNum += getChangePanelAfter(k, 1, -1, intMyColor, intYourColor);
						intNum += getChangePanelAfter(k, 1, 0, intMyColor, intYourColor);
						intNum += getChangePanelAfter(k, 1, 1, intMyColor, intYourColor);
						if (intNum > 0)
						{
							for (l = 0; l < 64; l++) intPanelStackC[l] = intPanel[l];
							changePanel(k, intMyColor);
							for (l = 0; l < 64; l++) if (intPanelStackC[l] == 0 && intPanel[l] == intMyColor && intPointC < intEnableA[l]) intPointC = intEnableA[l];
							for (l = 0; l < 64; l++) intPanel[l] = intPanelStackC[l];
						}
					}
					for (k = 0; k < 64; k++) intPanel[k] = intPanelStackB[k];
				}
			}
			for (j = 0; j < 64; j++) intPanel[j] = intPanelStackA[j];
			intPoint = intPointA - intPointB - intPointC;
			if (intPoint > intMaxPoint)
			{
				intArray[0] = i;
				intCount = 1;
				intMaxPoint = intPoint;
			}
			else if (intPoint == intMaxPoint)
			{
				intArray[intCount] = i;
				intCount++;
			}
		}
	}
	window.status = "";
	if (intCount == 0) alert("CPU アルゴリズム エラーです。");
	return intArray[Math.floor(Math.random() * intCount) % intCount];
}

function changePanel(intID, intColor)
{
	intPanel[intID] = intColor;
	changePanelStart(intID, -1, -1, getChangePanel(intID, -1, -1, intColor), intColor);
	changePanelStart(intID, -1, 0, getChangePanel(intID, -1, 0, intColor), intColor);
	changePanelStart(intID, -1, 1, getChangePanel(intID, -1, 1, intColor), intColor);
	changePanelStart(intID, 0, -1, getChangePanel(intID, 0, -1, intColor), intColor);
	changePanelStart(intID, 0, 1, getChangePanel(intID, 0, 1, intColor), intColor);
	changePanelStart(intID, 1, -1, getChangePanel(intID, 1, -1, intColor), intColor);
	changePanelStart(intID, 1, 0, getChangePanel(intID, 1, 0, intColor), intColor);
	changePanelStart(intID, 1, 1, getChangePanel(intID, 1, 1, intColor), intColor);
	return false;
}

function changePanelStart(intID, intX, intY, intNum, intColor)
{
	var i = 0;
	var intCheck = intID;
	for (i = 0; i < intNum; i++)
	{
		intCheck += intY * 8 + intX;
		intPanel[intCheck] = intColor;
	}
	return true;
}

function checkGameOver()
{
	if (checkGameOverStep1()) return true;
	if (checkGameOverStep2()) return true;
	if (checkGameOverStep3()) return true;
	return false;
}

function checkGameOverStep1()
{
	var i = 0;
	for (i = 0; i < 64; i++) if (intPanel[i] == 0) return false;
	return true;
}

function checkGameOverStep2()
{
	if (!checkPass(1)) return false;
	if (!checkPass(2)) return false;
	return true;
}

function checkGameOverStep3()
{
	return getNum(1) == 0 || getNum(2) == 0;
}

function checkPanel(intID, intColor)
{
	if (getChangePanel(intID, -1, -1, intColor) > 0) return true;
	if (getChangePanel(intID, -1, 0, intColor) > 0) return true;
	if (getChangePanel(intID, -1, 1, intColor) > 0) return true;
	if (getChangePanel(intID, 0, -1, intColor) > 0) return true;
	if (getChangePanel(intID, 0, 1, intColor) > 0) return true;
	if (getChangePanel(intID, 1, -1, intColor) > 0) return true;
	if (getChangePanel(intID, 1, 0, intColor) > 0) return true;
	if (getChangePanel(intID, 1, 1, intColor) > 0) return true;
	return false;
}

function checkPass(intColor)
{
	var i = 0;
	for (i = 0; i < 64; i++) if (intPanel[i] == 0 && checkPanel(i, intColor)) return false;
	return true;
}

function clickPanel(intID)
{
	if (intGame != 1) return false;
	if (intPanel[intID] != 0)
	{
		alert("すでにパネルが置いてあるため、黒パネルを置くことができません。");
		return false;
	}
	if (!checkPanel(intID, 1))
	{
		alert("白パネルを挟むことができないため、黒パネルを置くことができません。");
		return false;
	}
	intGame = 2;
	changePanel(intID, 1);
	showPanel();
	intGameTID = setTimeout("clickPanelStep1()", 0);
	return true;
}

function clickPanelStep1()
{
	intGameTID = clearTimeoutEx(intGameTID);
	if (checkGameOver())
	{
		intGame = 0;
		var intBlack = getNum(1);
		var intWhite = getNum(2);
		if (intBlack > intWhite) alert("黒 " + intBlack + " 個、白 " + intWhite + " 個で、あなたの勝ちです。 おめでとうございます！"); else alert("黒 " + intBlack + " 個、白 " + intWhite + " 個です。");
		return true;
	}
	intGameTID = setTimeout("clickPanelStep2()", 0);
	return true;
}

function clickPanelStep2()
{
	intGameTID = clearTimeoutEx(intGameTID);
	if (checkPass(2))
	{
		alert("黒パネルを挟むことができる場所がないため、コンピュータがパスしました。");
		intGameTID = setTimeout("clickPanelStep4()", 0);
		return true;
	}
	intComCount = 4;
	intGameTID = setTimeout("clickPanelStep3()", 0);
	return true;
}

function clickPanelStep3()
{
	intGameTID = clearTimeoutEx(intGameTID);
	switch (intComCount)
	{
		case 4:
		intComPanel = calNextPanel(2, 1, intEnablePointB, intEnablePointA);
		break;
		case 3:
		case 1:
		document.getElementById("divPanel" + intComPanel).style.backgroundColor = "#ffffff";
		break;
		case 2:
		case 0:
		document.getElementById("divPanel" + intComPanel).style.backgroundColor = "#00c000";
	}
	switch (intComCount)
	{
		case 4:
		case 3:
		case 2:
		case 1:
		intComCount--;
		intGameTID = setTimeout("clickPanelStep3()", 100);
		break;
		case 0:
		changePanel(intComPanel, 2);
		intGameTID = setTimeout("clickPanelStep4()", 0);
	}
	return true;
}

function clickPanelStep4()
{
	intGameTID = clearTimeoutEx(intGameTID);
	showPanel();
	if (checkGameOver())
	{
		intGame = 0;
		var intBlack = getNum(1);
		var intWhite = getNum(2);
		if (intBlack > intWhite) alert("黒 " + intBlack + " 個、白 " + intWhite + " 個で、あなたの勝ちです。 おめでとうございます！"); else alert("黒 " + intBlack + " 個、白 " + intWhite + " 個です。");
		return true;
	}
	if (checkPass(1))
	{
		alert("白パネルを挟むことができる場所がないため、黒パネルを置くことができません。 パスします。");
		intGameTID = setTimeout("clickPanelStep1()", 0);
		return true;
	}
	intGame = 1;
	return true;
}

function getChangePanel(intID, intX, intY, intColor)
{
	var intNum = 0;
	var intCheckX = intID % 8 + intX;
	var intCheckY = Math.floor(intID / 8) + intY;
	while (intCheckX >= 0 && intCheckX <= 7 && intCheckY >= 0 && intCheckY <= 7)
	{
		if (intPanel[intCheckY * 8 + intCheckX] == 0) return 0;
		if (intPanel[intCheckY * 8 + intCheckX] == intColor) return intNum;
		if (intPanel[intCheckY * 8 + intCheckX] != intColor) intNum++;
		intCheckX += intX;
		intCheckY += intY;
	}
	return 0;
}

function getChangePanelAfter(intID, intX, intY, intMyColor, intYourColor)
{
	var intNum = 0;
	intNum = getChangePanel(intID, intX, intY, intMyColor);
	if (intNum == 0) return 0;
	var intMinus = 0;
	intMinus = getChangePanel(intID + intX * intNum + intY * intNum * 8, intX, intY, intYourColor);
	if (intMinus == 0) return intNum + 10; else return 10 - intNum - intMinus;
}

function getNum(intColor)
{
	var i = 0;
	var intNum = 0;
	for (i = 0; i < 64; i++) if (intPanel[i] == intColor) intNum++;
	return intNum;
}

function onKeyDown(intCode)
{
	if (intGame != 1) return false;
	if (intHint == 5) if (intCode == 39) intHint++; else intHint = 0;
	if (intHint == 4) if (intCode == 37) intHint++; else intHint = 0;
	if (intHint == 3) if (intCode == 39) intHint++; else intHint = 0;
	if (intHint == 2) if (intCode == 37) intHint++; else intHint = 0;
	if (intHint == 1) if (intCode == 39) intHint++; else intHint = 0;
	if (intHint == 0) if (intCode == 37) intHint++; else intHint = 0;
	if (intHint == 6)
	{
		showHint();
		intHint = 0;
	}
	return true;
}

function showHint()
{
	var i = calNextPanel(1, 2, intEnablePointA, intEnablePointB);
	document.getElementById("divPanel" + i).style.backgroundColor = "#ff0000";
	intStack[i] = 3;
	return true;
}

function showPanel()
{
	var i = 0;
	var j = 1;
	for (i = 0; i < 64; i++)
	{
		if (intPanel[i] != intStack[i]) if (intPanel[i] == 0) document.getElementById("divPanel" + i).style.backgroundColor = "#00c000"; else if (intPanel[i] == 1) document.getElementById("divPanel" + i).style.backgroundColor = "#000000"; else document.getElementById("divPanel" + i).style.backgroundColor = "#ffffff";
		if (intPanel[i] != 0) j = 0;
		intStack[i] = intPanel[i];
	}
	return j == 1;
}

function startGame()
{
	if (!blnLoadComplete)
	{
		alert("ページの読み込みが完了するまで、しばらくお待ちください。");
		return false;
	}
	if (intGame == 2) return false;
	var i = 0;
	if (intGame == 1) if (!confirm("現在のゲームを中断して、再スタートしますか？")) return true;
	intGame = 2;
	for (i = 0; i < 64; i++)
	{
		intPanel[i] = 0;
		intStack[i] = -1;
	}
	intPanel[27] = 2;
	intPanel[28] = 1;
	intPanel[35] = 1;
	intPanel[36] = 2;
	showPanel();
	intGame = 1;
	alert("ゲームをスタートします。");
}

