// かしわ餅リバ〜シ☆

// // // // 設定部分 // // // //

blackImage = new Image;	blackImage.src = "./img/black.gif";
whiteImage = new Image;	whiteImage.src = "./img/white.gif";
noneImage  = new Image;	noneImage.src  = "./img/none.gif";

isStart = false;	// ゲームが開始しているかどうか
playerTurn = false;	// プレイヤーのターンならtrue
oppoIndex = "";		// 対戦相手
playerCol = 0;

headImg = 1;		// 盤面より前にある画像の個数
// 盤面より前方に画像が入る場合は、ここに画像の個数を入れる


// セルの属性
// 0: 0000 黒
// 1: 0001 白
// 2: 0010 空白(石と隣接)
// 3: 0011 空白(周囲に石がない)
// 4: 0100 黒確定石
// 5: 0101 白確定石
// 6: 0110 * 未使用 *
// 7: 0111 盤外

// 盤の配列
area = new Array(100);
area[0]  = 7; area[1]  = 7; area[2]  = 7; area[3]  = 7; area[4]  = 7; area[5]  = 7; area[6]  = 7; area[7]  = 7; area[8]  = 7; area[9]  = 7;
area[10] = 7; area[11] = 3; area[12] = 3; area[13] = 3; area[14] = 3; area[15] = 3; area[16] = 3; area[17] = 3; area[18] = 3; area[19] = 7;
area[20] = 7; area[21] = 3; area[22] = 3; area[23] = 3; area[24] = 3; area[25] = 3; area[26] = 3; area[27] = 3; area[28] = 3; area[29] = 7;
area[30] = 7; area[31] = 3; area[32] = 3; area[33] = 3; area[34] = 3; area[35] = 3; area[36] = 3; area[37] = 3; area[38] = 3; area[39] = 7;
area[40] = 7; area[41] = 3; area[42] = 3; area[43] = 3; area[44] = 3; area[45] = 3; area[46] = 3; area[47] = 3; area[48] = 3; area[49] = 7;
area[50] = 7; area[51] = 3; area[52] = 3; area[53] = 3; area[54] = 3; area[55] = 3; area[56] = 3; area[57] = 3; area[58] = 3; area[59] = 7;
area[60] = 7; area[61] = 3; area[62] = 3; area[63] = 3; area[64] = 3; area[65] = 3; area[66] = 3; area[67] = 3; area[68] = 3; area[69] = 7;
area[70] = 7; area[71] = 3; area[72] = 3; area[73] = 3; area[74] = 3; area[75] = 3; area[76] = 3; area[77] = 3; area[78] = 3; area[79] = 7;
area[80] = 7; area[81] = 3; area[82] = 3; area[83] = 3; area[84] = 3; area[85] = 3; area[86] = 3; area[87] = 3; area[88] = 3; area[89] = 7;
area[90] = 7; area[91] = 7; area[92] = 7; area[93] = 7; area[94] = 7; area[95] = 7; area[96] = 7; area[97] = 7; area[98] = 7; area[99] = 7;

// 一手先の盤
next = new Array(100);


// 隣接セル参照用配列
direction = new Array(8);
direction[0] = -11;
direction[1] = -10;
direction[2] =  -9;
direction[3] =  -1;
direction[4] =   1;
direction[5] =   9;
direction[6] =  10;
direction[7] =  11;


// // // // プログラム部分 // // // //

// 場所 areaNoに、colorの色の石が置けるか調べる
function canPutStone(areaNo,color){
  if(area[areaNo] != 2){
    return false;
  }
  else{
    for(m=0;m<=7;m++){
      if(area[areaNo+direction[m]] == (color ^ 1)){
        for(n=2;n<=7;n++){
          if(area[areaNo+direction[m]*n] >= 2){
            break;
          }
          else if(area[areaNo+direction[m]*n] == (color ^ 1)){
            continue;
          }
          else if(area[areaNo+direction[m]*n] == color){
            return true;  // 石が置けた
          }
        }
      }
    }
  }
  return false;
}


// colorの色の石が置ける場所をリストアップ
function possibleArea(color){
  putStoneArea = "";

  for(p=11;p<=88;p++){
    if(canPutStone(p,color)){
      putStoneArea += "" + p;
    }
  }
  return putStoneArea;
}


// メッセージの表示・消去
function showMessage(message){
  document.f.msgArea.value = message;
  setTimeout("document.f.msgArea.value = '';",3000);
}


// プレイヤーの手番
function putStone(areaNo){
  if((isStart) && (playerTurn)){
    if(canPutStone(areaNo,playerCol) != true){
      showMessage("そこには置けません");
    }
    else{
      turnOverStone(areaNo,playerCol);
      playerTurn = false;
      computerBrain();
    }
  }
  else if(!isStart){
    showMessage("柏餅たん : 「対局」ボタンを押してね！");
  }
}


// 隣接セル属性を設定
function neighbor(num){
  // 置いた石の周囲のセルの属性が 3:空白(周囲に石がない) なら、
  // 2:空白(石と隣接) に変更
  for(k=0; k<direction.length; k++){
    if(area[num+direction[k]]==3){
      area[num+direction[k]] = 2;
    }
  }
}


// 石を返す処理
function turnOverStone(num,color){
  enemy = color ^ 1;  // 相手の石の色
  moveCount += 1;
  //alert(moveCount);

  for(m=0;m<=7;m++){
    if(area[num+direction[m]] == enemy){
      for(n=2;n<=7;n++){
        if(area[num+direction[m]*n] == enemy){
          continue;
        }
        else if(area[num+direction[m]*n] == color){
          refreshBoard(num,color);
          neighbor(num);

          // 裏返し処理
          for(j=1;j<n;j++){
            refreshBoard(num+direction[m]*j,color);
          }
          break;
        }
        else{
          break;
        }
      }
    }
  }

  isDeadlock();

  if((isStart)&&(!playerTurn)&&(possibleArea(playerCol).length==0)){
    alert("あなたの置ける場所がないため、パスします。");
    computerBrain();
  }
}


// 手詰まり判定・終了処理
function isDeadlock(){
  if(moveCount == 60){
    isStart = false;
  }
  else if((possibleArea(playerCol).length==0) && (possibleArea(playerCol^1).length==0)){
    alert("両者手詰まりのため、終了します。");
    isStart = false;
  }

  if(!isStart){
    playerVal = 0;
    computerVal = 0;

    for(n=0;n<100;n++){
      if(area[n] == playerCol){ playerVal += 1; }
      else if(area[n] == (playerCol^1)){ computerVal += 1; }
    }

    if(playerVal > computerVal){
		showMessage("柏餅たん : 負けちゃったよ〜。");
		winner = "あなたの勝ち";
    }
    else if(playerVal < computerVal){
		showMessage("柏餅たん : わ〜い！勝ったよ☆");
		winner = "柏餅たんの勝ち";
    }
    else {
		showMessage("柏餅たん : うにゅぅ、引き分けかぁ…。");
		winner = "引き分け";
    }
	document.f.StartButton.value = "対局";
    alert(""+playerVal+"対"+computerVal+"で、"+winner+"です。");
  }
}


// コンピュータ思考用
function computerBrain(){
  state = possibleArea(playerCol^1);
  
//alert(state)

  for(b=0;b<=state.length/2;b++){
    cellNo = state.substring(b*2,b*2+2)-0;
    if((cellNo == 11) || 
       (cellNo == 18) ||
       (cellNo == 81) ||
       (cellNo == 88)){
      turnOverStone(cellNo,(playerCol^1));
      playerTurn = true;
      return;
    }
  }

  for(b=0;b<=state.length/2;b++){
    cellNo = state.substring(b*2,b*2+2)-0;
    if(((cellNo >= 13) && (cellNo <= 16)) || 
       (cellNo == 31) || (cellNo == 38) ||
       (cellNo == 41) || (cellNo == 48) ||
       (cellNo == 51) || (cellNo == 58) ||
       (cellNo == 61) || (cellNo == 68) ||
       ((cellNo >= 83) && (cellNo <= 86))){
      turnOverStone(cellNo,(playerCol^1));
      playerTurn = true;
      return;
    }
  }

  for(b=0;b<=state.length/2;b++){
    cellNo = state.substring(b*2,b*2+2)-0;
    if(((cellNo >= 33) && (cellNo <= 36)) || 
       ((cellNo >= 43) && (cellNo <= 46)) || 
       ((cellNo >= 53) && (cellNo <= 56)) || 
       ((cellNo >= 63) && (cellNo <= 66))){
      turnOverStone(cellNo,(playerCol^1));
      playerTurn = true;
      return;
    }
  }

  for(b=0;b<=state.length/2;b++){
    cellNo = state.substring(b*2,b*2+2)-0;
    if(((cellNo >= 23) && (cellNo <= 26)) || 
       (cellNo == 32) || (cellNo == 37) ||
       (cellNo == 42) || (cellNo == 47) ||
       (cellNo == 52) || (cellNo == 57) ||
       (cellNo == 62) || (cellNo == 67) ||
       ((cellNo >= 73) && (cellNo <= 76))){
      turnOverStone(cellNo,(playerCol^1));
      playerTurn = true;
      return;
    }
  }

  for(b=0;b<=state.length/2;b++){
    cellNo = state.substring(b*2,b*2+2)-0;
    if((cellNo == 22) ||
       (cellNo == 27) ||
       (cellNo == 72) ||
       (cellNo == 77)){
      turnOverStone(cellNo,(playerCol^1));
      playerTurn = true;
      return;
    }
  }

  for(b=0;b<=state.length/2;b++){
    cellNo = state.substring(b*2,b*2+2)-0;
    if((cellNo == 12) ||
       (cellNo == 17) ||
       (cellNo == 21) ||
       (cellNo == 28) ||
       (cellNo == 71) ||
       (cellNo == 78) ||
       (cellNo == 82) ||
       (cellNo == 87)){
      turnOverStone(cellNo,(playerCol^1));
      playerTurn = true;
      return;
    }
  }

  if(isStart){
    alert("柏餅たんは打つ手が無いのでパスします。");
  }
  playerTurn = true;
}




// 盤面の特定セルの画像を更新
function refreshBoard(num,color){
  if(color == 0) stoneImg = blackImage.src;
  else if(color == 1) stoneImg = whiteImage.src;
  else stoneImg = noneImage.src;

  area[num] = color;
  document.images[Math.floor(num/10) * 8 + (num % 10)-9+headImg].src = stoneImg;
//  document.images[Math.floor((num+headImg)/10) * 8 + ((num+headImg) % 10)-9].src = stoneImg;
}


// ゲームスタート
function startReversi(){
  if(!isStart){
    for(m=10;m<=80;m+=10){
      for(n=1;n<=8;n++){refreshBoard(m+n,3)}
    }

    refreshBoard(44,1); neighbor(44);
    refreshBoard(45,0); neighbor(45);
    refreshBoard(54,0); neighbor(54);
    refreshBoard(55,1); neighbor(55);

    playerCol = document.f.initiative[1].checked-0;	// 石の色(黒先攻・白後攻)
    oppoIndex = document.f.opponent.selectedIndex;
    moveCount = 0;	// 着手数
    isStart = true;
	
	showMessage("柏餅たん : よ〜し、がんばるよ！");
	document.f.StartButton.value = "投了";

    if(playerCol == 0){
      playerTurn = true;
    }
    else{
      playerTurn = false;
      computerBrain();
    }
  }
  else{
    if(confirm("投了しますか？")){
      isStart = false;
	  showMessage("柏餅たん : え〜やめちゃうの？");
	  document.f.StartButton.value = "対局";
    }
  }
}


function init(){
  UTFesc = "\u3042";
  em1 = unescape("%4A%61%76%61%53%63%72%69%70%74%20%6C%61%62%6F");
  em2 = "\u3078\u306E\u30EA\u30F3\u30AF\u306F\u6D88\u3055\u306A\u3044\u3067\u304F\u3060\u3055\u3044";
  em3 = unescape("%82%D6%82%CC%83%8A%83%93%83N%82%CD%8F%C1%82%B3%82%C8%82%A2%82%C5%82%AD%82%BE%82%B3%82%A2");

  for(n=0;n<document.links.length;n++){
    if(document.links[n].href == WebsiteURL){
      return;
    }
  }

  if(UTFesc.length == 1) alert(em1+em2);
  else alert(em1+em3);

  eval("function startReversi(){}");
}


