/**
* IntBoard クラスは、碁盤に見立てた行列で石の配置を表します。
* @author Jiro Suzuki
*/
public class IntBoard{
private static final int ROSU=19;
private static final int SQUARENUM=ROSU*ROSU;
private int[][] intBoard=new int[ROSU][ROSU];
private int bhama;
private int whama;
private int lastTurn;
private int dame;
private int[][] agehamaPT;
private int nxtR;
private int nxtC;
private int ixAG; //アゲハマ着点テーブル用インデックス初期化
private int ixAGMax; //アゲハマ着点テーブルデータ数最大値初期化
private int row;
private int col;
/**
* 石が置かれていない空のインスタンスを生成します。
*/
IntBoard(){
initializeBan();
bhama=0;
whama=0;
agehamaPT=new int[SQUARENUM][2];
}
/**
* インスタンスを初期化します。
*/
public void initialize(){
initializeBan();
bhama=0;
whama=0;
agehamaPT=new int[SQUARENUM][2];
}
private void initializeBan(){
for(int r=0;r<ROSU;r++){
for(int c=0;c<ROSU;c++){
intBoard[r][c]=0;
}
}
}
/**
* 盤面を一手更新します。入力の座標はJava添字形式(0〜18)で受取ります。
* @param inColor 石の色
* @param inRow 行番号
* @param inCol 列番号
*/
public void update(int inColor,int inRow,int inCol){
lastTurn=inColor;
//本当はここで着点エラー判定を行う予定。エラーでないときは石を置く。
returnValue(); //前回最終手を、表示用の値(11or12)から通常の値(1or2)に戻す。
if(intBoard[inRow][inCol]==0){
intBoard[inRow][inCol]=inColor;
procAgehama(); //アゲハマ処理
}
//今回の最終手を表示用の値(11or12)に変換する。
translateValue(inColor,inRow,inCol);
}
private void returnValue(){
for(int row=0;row<ROSU;row++){
for(int col=0;col<ROSU;col++){
if(intBoard[row][col]>10){
intBoard[row][col]=intBoard[row][col]-10;
}
}
}
}
private void translateValue(int inColor,int inRow,int inCol){
intBoard[inRow][inCol]=inColor + 10;
}
//----- アゲハマ処理 START -----
private void procAgehama(){ //盤上に配置された石すべてについて
for(row=0;row<ROSU;row++){
for(col=0;col<ROSU;col++){
if(intBoard[row][col]!=0 & intBoard[row][col]!=lastTurn){
checkAgehama();
}
}
}
}
private void checkAgehama(){
countDame();
removeAgehama();
}
private void countDame(){
//アゲハマ着点テーブル初期化
for(int i=0;i<SQUARENUM;i++){
agehamaPT[i][0]=-1;
agehamaPT[i][1]=-1;
}
agehamaPT[0][0]=row; //検索開始着点設定
agehamaPT[0][1]=col;
dame=0; //ダメ個数初期化
ixAG=0; //アゲハマ着点テーブル用インデックス初期化
ixAGMax=0; //アゲハマ着点テーブルデータ数最大値初期化
while(ixAG<=ixAGMax){
if(dame==0){
nxtR=agehamaPT[ixAG][0]-1; //検索基点の上の点
nxtC=agehamaPT[ixAG][1];
countDameSub();
}
if(dame==0){
nxtR=agehamaPT[ixAG][0]+1; //検索基点の下の点
nxtC=agehamaPT[ixAG][1];
countDameSub();
}
if(dame==0){
nxtR=agehamaPT[ixAG][0];
nxtC=agehamaPT[ixAG][1]-1; //検索基点の左の点
countDameSub();
}
if(dame==0){
nxtR=agehamaPT[ixAG][0];
nxtC=agehamaPT[ixAG][1]+1; //検索基点の右の点
countDameSub();
}
ixAG=ixAG+1;
}
}
private void countDameSub(){
boolean isNotMatch=true;
if(nxtR>=0 && nxtR<ROSU && //盤上の着点の場合のみ処理続行
nxtC>=0 && nxtC<ROSU){
if(intBoard[nxtR][nxtC]==0){ //検索点に石がないときはダメをカウント
dame++;
}
else{
if(intBoard[nxtR][nxtC]!=lastTurn){ //最終手番の反対色のとき処理続行
for(int i=0;i<SQUARENUM;i++){
if(nxtR==agehamaPT[i][0] && nxtC==agehamaPT[i][1]){
isNotMatch=false;
}
}
if(isNotMatch){
ixAGMax=ixAGMax+1;
agehamaPT[ixAGMax][0]=nxtR;
agehamaPT[ixAGMax][1]=nxtC;
}
}
}
}
}
private void removeAgehama(){
if(dame==0){ //石群のダメが空いていないとき
for(ixAG=0;ixAG<=ixAGMax;ixAG++){
switch(intBoard[agehamaPT[ixAG][0]][agehamaPT[ixAG][1]]){
case 1:whama=whama+1;
break;
case 2:bhama=bhama+1;
break;
}
intBoard[agehamaPT[ixAG][0]][agehamaPT[ixAG][1]]=0;
}
}
}
//----- アゲハマ処理 END -----
/**
* 盤面データを取得します。
* @return 盤面データ
*/
public int[][] getIntBoard(){
return intBoard;
}
/**
* 黒番のアゲハマ数を取得します。
* @return 黒番のアゲハマ数
*/
public int getBhama(){
return bhama;
}
/**
* 白番のアゲハマ数を取得します。
* @return 白番のアゲハマ数
*/
public int getWhama(){
return whama;
}
}