#define	DEBUG 0

/* 
	TOWNS囲碁棋譜記録プログラム ban.c
	                                      1992/07/06  久保田俊也

*/
#include <stdio.h>
#include <time.h>
#include "igo.h"
#include "banx.h"
#include "kiffile.h"
#include "kifuctrl.h"
#include "title.h"

static int banx_uchiage2(int ichi, char same_col_flg, GCELL *same_gcellp);

static int bansize, bansize2, up, down;
static char henkan_territory_iro; /* 変換後の領地の所有者 */
static char ban[MAX_BANSIZE2];
static char henkan_ban[MAX_BANSIZE2];
static BANCELL  bancell[MAX_BANSIZE2];	/* 盤の上の一路一路 */
static GCELL	init_gcell;
static GCELL	*current_g_ptr;

int banx_init(char current_ban[])
{
int i, j;
BAN_TYPE ban_type;

	Debugprint("banx_init first!\n");
	ban_type = *title_bantype_read();
	if( ban_type.type == NORMAL){
		bansize = ban_type.size;
		bansize2 = (bansize+1)*(bansize+2)+1;
		up = -(bansize+1);
		down = (bansize+1);
	}

	for(i=0;i<bansize2;i++){
		current_ban[i] = WALL;
		ban[i] = WALL;
	}
	for(i=1;i<(bansize+1);i++){
		for(j=1;j<(bansize+1);j++){
			current_ban[j + i*(bansize+1)] = BLANK;	
			ban[j + i*(bansize+1)] = BLANK;	
		}
	}

	banx_do_judge(current_ban);

	return 0;
}

int banx_handy_set( char current_ban[], int handy)
{

	switch(handy){
		case '2' + 0:
			current_ban[96] = BLACK;
			current_ban[324] = BLACK;
			break;
		
		case '2' + 1:
			current_ban[96] = BLACK;
			current_ban[324] = BLACK;
			current_ban[336] = BLACK;
			break;
		
		case '2' + 2:
			current_ban[84] = BLACK;
			current_ban[96] = BLACK;
			current_ban[324] = BLACK;
			current_ban[336] = BLACK;
			break;
		
		case '2' + 3:
			current_ban[84] = BLACK;
			current_ban[96] = BLACK;
			current_ban[210] = BLACK;
			current_ban[324] = BLACK;
			current_ban[336] = BLACK;
			break;
		
		case '2' + 4:
			current_ban[84] = BLACK;
			current_ban[96] = BLACK;
			current_ban[204] = BLACK;
			current_ban[216] = BLACK;
			current_ban[324] = BLACK;
			current_ban[336] = BLACK;
			break;

		case '2' + 5:
			current_ban[84] = BLACK;
			current_ban[96] = BLACK;
			current_ban[204] = BLACK;
			current_ban[210] = BLACK;
			current_ban[216] = BLACK;
			current_ban[324] = BLACK;
			current_ban[336] = BLACK;
			break;
			
		case '2' + 6:
			current_ban[84] = BLACK;
			current_ban[90] = BLACK;
			current_ban[96] = BLACK;
			current_ban[204] = BLACK;
			current_ban[216] = BLACK;
			current_ban[324] = BLACK;
			current_ban[330] = BLACK;
			current_ban[336] = BLACK;
			break;

		case '2' + 7:
			current_ban[84] = BLACK;
			current_ban[90] = BLACK;
			current_ban[96] = BLACK;
			current_ban[204] = BLACK;
			current_ban[210] = BLACK;
			current_ban[216] = BLACK;
			current_ban[324] = BLACK;
			current_ban[330] = BLACK;
			current_ban[336] = BLACK;
			break;

		case '2' + 8:
			current_ban[84] = BLACK;
			current_ban[96] = BLACK;
			current_ban[324] = BLACK;
			break;

		default:
			break;
	}
	return 0;
}

/* 使用しない 
int banx_end()
{

	gcell_end();
	damecell_end();

	return 0;
}
 */

int banx_uchiage( char current_ban[], int ichi, int *uchiage_number)
{
int i, j;
int houkou[4];
int normal_houkou[4];
int naname_houkou[4];
char input_color;
char rejudge_flg;
char same_col_flg;
GCELL	*same_gcellp;
BANCELL *w_bancellp;
DAMECELL *w_damecellp;

	*uchiage_number = 0;
/*	着手放棄の時 エラ−にする　 */
	if(ichi == 0){
		return  -1;
	}

/*	入力画面がセ−ブしてある画面と同じか確認 */
	input_color = current_ban[ichi];
	current_ban[ichi] = BLANK;

	for(i=0;i<MAX_BANSIZE2;i++){
		if(ban[i] != current_ban[i]){
			for(j=0;j<MAX_BANSIZE2;j++){
				ban[j] = current_ban[j];
			}
			banx_do_judge(ban);
			break;
		}
	}
	ban[ichi] = input_color;

	Debugprint("banx_uchiage before uchiage syori!\n");
/*	打ち上げ処理 */
	houkou[0]=houkou[1]=houkou[2]=houkou[3]=0;
	i=0;
	houkou[i]=up;
	i++;
	if(bancell[ichi+LEFT].g_ptr!=bancell[ichi+up].g_ptr){
		houkou[i] = LEFT;
		i++;
	}
	if(bancell[ichi+RIGHT].g_ptr!=bancell[ichi+up].g_ptr &&
	   bancell[ichi+RIGHT].g_ptr!=bancell[ichi+LEFT].g_ptr){
		houkou[i] = RIGHT;
		i++;
	}
	if(bancell[ichi+down].g_ptr!=bancell[ichi+up].g_ptr &&
	   bancell[ichi+down].g_ptr!=bancell[ichi+LEFT].g_ptr &&
	   bancell[ichi+down].g_ptr!=bancell[ichi+RIGHT].g_ptr){
		houkou[i] = down;
		i++;
	}

	rejudge_flg = 0;
	same_col_flg = 0;
	for(i=0;i<4;i++){
		if(houkou[i]==0){
			break;
		}
		if(ban[ichi] == ban[ichi+houkou[i]] ){
			if(rejudge_flg == 0){
				if(same_col_flg == 0){
					/* グル−プに石を追加する */
					same_col_flg = 1;
					same_gcellp = bancell[ichi+houkou[i]].g_ptr;
				}else{
					/* 2つのグル−プをくっつける */
					rejudge_flg =1;
				}
			}
		}else{
			if(ban[ichi+houkou[i]]==BLANK){
				if(bancell[ichi+houkou[i]].g_ptr->dame_ptr == NULL){
					w_damecellp = damecell_get();
					w_damecellp->ichi = ichi;
					w_damecellp->next = w_damecellp;
					bancell[ichi+houkou[i]].g_ptr->dame_ptr = w_damecellp;
				}else{
					w_damecellp = damecell_get();
					w_damecellp->ichi = ichi;
					w_damecellp->next = bancell[ichi+houkou[i]].g_ptr->dame_ptr->next;
					bancell[ichi+houkou[i]].g_ptr->dame_ptr->next = w_damecellp;
				}
			
			}else if(ban[ichi+houkou[i]]!=WALL){
				if(bancell[ichi+houkou[i]].g_ptr->dame_number == 1 ){
					rejudge_flg =1;
					j = 0;
					w_bancellp = bancell[ichi+houkou[i]].g_ptr->c_ptr;
					do{
						j++;
						ban[w_bancellp-bancell] = BLANK;
						w_bancellp=w_bancellp->next;
					}while(w_bancellp!=bancell[ichi+houkou[i]].g_ptr->c_ptr);
					*uchiage_number += j;
				}else{
				/* ダメ数を減らす */
					--(bancell[ichi+houkou[i]].g_ptr->dame_number);
				}
			}
		}
	}

/* ブランクグル−プが分断される可能性があるならば再分析 */
	if(rejudge_flg == 0){
		normal_houkou[0] = up;
		normal_houkou[1] = LEFT;
		normal_houkou[2] = down;
		normal_houkou[3] = RIGHT;
		naname_houkou[0] = up+LEFT;
		naname_houkou[1] = LEFT+down;
		naname_houkou[2] = down+RIGHT;
		naname_houkou[3] = RIGHT+up;
		for(i=0;i<4;i++){
			if(ban[ichi+normal_houkou[i]] == BLANK &&
		   		bancell[ichi+normal_houkou[i]].g_ptr == 
		   		bancell[ichi+normal_houkou[(i+1)%4]].g_ptr &&
		   		ban[ichi+naname_houkou[i]] != BLANK ){
				rejudge_flg = 1;
				break;
			}
		}
	}

/* 再分析をするならば他の処理をする必要はない  */
	if(rejudge_flg == 1){
		Debugprint("banx_uchiage before rejudge!\n");
		banx_do_judge(ban);
	}else{
		Debugprint("banx_uchiage before uchiage2!\n");
		banx_uchiage2( ichi, same_col_flg, same_gcellp);
	}
/*
	banx_debugprint();
 */
/*	画面の戻し処理 */
	for(i=0;i<MAX_BANSIZE2;i++){
		current_ban[i] = ban[i];
	}
	
	Debugprint("banx_uchiage end!\n");
	return 0;
}

/* banx_uhciage の下請け関数 */
int banx_uchiage2( int ichi, char same_col_flg, GCELL *same_gcellp)
{
int i;
int dame_houkou[4]; /* ダメをチェックする時に使う */
char damecellari_flg;
GCELL	*w_gcellp;
GCELL	dummy_gcell;
DAMECELL dummy_damecell; /* ダミ−で作ったGCELLにつくるダミ−のDAMECELL */
BANCELL *w_bancellp;
DAMECELL *w_damecellp;
DAMECELL *w2_damecellp;
DAMECELL *save_damep;

/* BLANKグル−プからbancellのポインタ−をはずす  */
		if(bancell[ichi].g_ptr->territory_number <= 1){
		/* とりあえず何もしない 害はないと思う GCELLの使い過ぎの問題はある*/
			bancell[ichi].g_ptr->c_ptr = NULL;
			bancell[ichi].g_ptr->territory_number = 0;
			bancell[ichi].g_ptr->dame_ptr = NULL;
			bancell[ichi].g_ptr->dame_number = 0;
		}else{
			--(bancell[ichi].g_ptr->territory_number);
			w_bancellp = bancell[ichi].g_ptr->c_ptr;
			do{
				if(w_bancellp->next == &bancell[ichi]){
					w_bancellp->next = w_bancellp->next->next;
					if(&bancell[ichi] == bancell[ichi].g_ptr->c_ptr){
						/* territory_number = 0 の時はゴミがはいっている筈  */
						bancell[ichi].g_ptr->c_ptr = w_bancellp->next;
					}
					break;
				}
				w_bancellp=w_bancellp->next;
			}while(w_bancellp!=bancell[ichi].g_ptr->c_ptr);
		}
		
		dame_houkou[0] = up;
		dame_houkou[1] = LEFT;
		dame_houkou[2] = down;
		dame_houkou[3] = RIGHT;
		
/* 新規にグル−プを作ったと仮定して処理する bancellの追加とダメの設定 */
		bancell[ichi].g_ptr = &dummy_gcell;
		bancell[ichi].next = &bancell[ichi];

		dummy_gcell.c_ptr = &bancell[ichi];
		dummy_gcell.territory_number = 1;
		dummy_gcell.iro = ban[ichi];
		
		dummy_gcell.dame_ptr = &dummy_damecell;
		dummy_damecell.next = &dummy_damecell;
		dummy_damecell.ichi = 0; /* 絶対に使わない位置として設定  */
		dummy_gcell.dame_number = 0;
		for(i=0;i<4;i++){
			if(ban[ichi+dame_houkou[i]] != ban[ichi] &&
			   ban[ichi+dame_houkou[i]] != WALL){
				w_damecellp = damecell_get();
				w_damecellp->ichi = ichi+dame_houkou[i];
				w_damecellp->next = dummy_gcell.dame_ptr->next;
				dummy_gcell.dame_ptr->next = w_damecellp;
				if(ban[ichi+dame_houkou[i]] == BLANK){
					dummy_gcell.dame_number++;
				}
			}
		}
/* 同色と接していなかった場合､新規にグル−プを作る */
		if(same_col_flg == 0){
			/* ダミ−のDAMECELLを取り除く  */
			w_damecellp = dummy_gcell.dame_ptr;
			do{
				w_damecellp = w_damecellp->next;
			}while(w_damecellp->next != dummy_gcell.dame_ptr);
			w_damecellp->next = dummy_gcell.dame_ptr->next;
			dummy_gcell.dame_ptr = dummy_gcell.dame_ptr->next;

			w_gcellp = gcell_get();
			*w_gcellp = dummy_gcell;

			w_gcellp->next = init_gcell.next;
			init_gcell.next = w_gcellp;
			bancell[ichi].g_ptr = w_gcellp;

		}else{
/* 同色のグル−プに入ったときのダメの取消と追加を行う  */
			/* ダメの追加 */
			save_damep = &dummy_damecell;
			w_damecellp=dummy_damecell.next;
			do{
				damecellari_flg = 0;
				w2_damecellp = same_gcellp->dame_ptr->next;
				do{
					if(w2_damecellp->ichi == w_damecellp->ichi){
						damecellari_flg = 1;
						break;
					}
					w2_damecellp=w2_damecellp->next;
				}while(w2_damecellp!=same_gcellp->dame_ptr->next);
				
				if(damecellari_flg == 1){
					if(ban[w_damecellp->ichi] == BLANK){
						--dummy_gcell.dame_number;
					}
					save_damep->next = w_damecellp->next;
					damecell_free(w_damecellp);
					w_damecellp = save_damep->next;
				}else{
					save_damep = save_damep->next;
					w_damecellp = save_damep->next;
				}
			}while(w_damecellp != &dummy_damecell); /* nextを付けないのはdummy_damecell自体のチェックは不要だから */
			w_damecellp = dummy_gcell.dame_ptr;
			do{
				w_damecellp = w_damecellp->next;
			}while(w_damecellp->next != dummy_gcell.dame_ptr);
			if(w_damecellp != dummy_gcell.dame_ptr){
				w_damecellp->next = same_gcellp->dame_ptr->next;
				same_gcellp->dame_ptr->next = dummy_gcell.dame_ptr->next;
				same_gcellp->dame_number += dummy_gcell.dame_number;
			}
			/* ダメを減らす */
			w_damecellp=same_gcellp->dame_ptr;
			do{
				if(w_damecellp->next->ichi == ichi){
					save_damep = w_damecellp->next;
					w_damecellp->next=w_damecellp->next->next;
					if(save_damep == same_gcellp->dame_ptr){
						same_gcellp->dame_ptr = w_damecellp->next;
					}
					damecell_free(save_damep);
					break;
				}
				w_damecellp=w_damecellp->next;
			}while(w_damecellp!=same_gcellp->dame_ptr);
			/* 打たれた所は常にBLANKにきまっている  */
			--(same_gcellp->dame_number);
			
			/* 領域の追加  */
			++(same_gcellp->territory_number);
			bancell[ichi].next = same_gcellp->c_ptr->next;
			same_gcellp->c_ptr->next = &bancell[ichi];
			bancell[ichi].g_ptr = same_gcellp;
		}


	return 0;
}

int banx_judge( char current_ban[])
{
int i;

/*	入力画面がセ−ブしてある画面と同じか確認 */
	for(i=0;i<MAX_BANSIZE2;i++){
		ban[i] = current_ban[i];
	}

	banx_do_judge(ban);

/*	形勢判断の時は表示する画面を設定 */
	for(i=0;i<MAX_BANSIZE2;i++){
		henkan_ban[i] = ban[i];
	}

	return 0;
}

int banx_do_judge( char current_ban[])
{
int i;

	Debugprint("banx_do_judge first!\n");
 
	for(i=0;i<bansize2;i++){
		bancell[i].g_ptr = NULL;
		bancell[i].next = NULL;
	}
	gcell_init();
	damecell_init();
	current_g_ptr=&init_gcell;

	banx_gchk();
	banx_gptrset();
	banx_dameset();
	banx_damesu();
	banx_ternumber();


	return 0;
}

/* グル−プを設定してバンセルを位置づける */
static int banx_gchk()
{
int i, j;
int ichi;
BANCELL *w_bancellp, *w_ptr;	

	Debugprint2("banx_gchk bansize = %d\n", bansize);
	
	/* グル−プの判別 */
	for(i=1;i<bansize+1;i++){
		for(j=1;j<bansize+1;j++){
			ichi = i*(bansize+1) + j;
			if(ban[ichi] == ban[ichi+up]){
				bancell[ichi].next=bancell[ichi+up].next;
				bancell[ichi+up].next=&bancell[ichi];
				bancell[ichi].g_ptr=bancell[ichi+up].g_ptr;
				if(ban[ichi] == ban[ichi+LEFT]){
					if(bancell[ichi].g_ptr != bancell[ichi+LEFT].g_ptr){
						w_ptr=&bancell[ichi+LEFT];
						do{
							w_ptr->g_ptr=bancell[ichi].g_ptr;
							w_ptr=w_ptr->next;
						}while(w_ptr!=&bancell[ichi+LEFT]);

						w_bancellp = bancell[ichi+LEFT].next;
						bancell[ichi+LEFT].next=bancell[ichi].next;
						bancell[ichi].next=w_bancellp;
					}
				}
			}else{
				if(ban[ichi] == ban[ichi+LEFT]){
					bancell[ichi].next=bancell[ichi+LEFT].next;
					bancell[ichi+LEFT].next=&bancell[ichi];
					bancell[ichi].g_ptr=bancell[ichi+LEFT].g_ptr;
				}else{
					bancell[ichi].g_ptr=gcell_get();
					current_g_ptr->next=bancell[ichi].g_ptr;
					current_g_ptr=bancell[ichi].g_ptr;

					bancell[ichi].g_ptr->iro = ban[ichi];
					bancell[ichi].g_ptr->c_ptr = &bancell[ichi];
					bancell[ichi].next = &bancell[ichi];
				}
			}
		}
	}

	current_g_ptr->next=&init_gcell;

	return 0;
}
	
/* g_ptr のゴミ削除 */
static int banx_gptrset()
{
GCELL *w_ptr;
	
	/* g_ptr のゴミ削除 */
	current_g_ptr=&init_gcell;
	do{
		if(current_g_ptr->next->c_ptr->g_ptr!=current_g_ptr->next){
			w_ptr=current_g_ptr->next;
			current_g_ptr->next=w_ptr->next;
			gcell_free(w_ptr);
		}else{
			current_g_ptr->territory_iro=BLANK;
			current_g_ptr=current_g_ptr->next;
		}
	}while(current_g_ptr->next!=&init_gcell);

	return 0;

}

/* ダメの設定を行う */
static int banx_dameset()
{
int i, j, k;
int ichi;
DAMECELL *w_damep;
int houkou[4];

	/* ダメの設定 */
	for(i=1;i<bansize+1;i++){
		for(j=1;j<bansize+1;j++){
			ichi = i*(bansize+1) + j;
			houkou[0]=houkou[1]=houkou[2]=houkou[3]=0;
			k=0;
			houkou[k]=up;
			k++;
			if(bancell[ichi+LEFT].g_ptr!=bancell[ichi+up].g_ptr){
				houkou[k] = LEFT;
				k++;
			}
			if(bancell[ichi+RIGHT].g_ptr!=bancell[ichi+up].g_ptr &&
			   bancell[ichi+RIGHT].g_ptr!=bancell[ichi+LEFT].g_ptr){
				houkou[k] = RIGHT;
				k++;
			}
			if(bancell[ichi+down].g_ptr!=bancell[ichi+up].g_ptr &&
			   bancell[ichi+down].g_ptr!=bancell[ichi+LEFT].g_ptr &&
			   bancell[ichi+down].g_ptr!=bancell[ichi+RIGHT].g_ptr){
				houkou[k] = down;
				k++;
			}
			for(k=0;k<4;k++){
				if(houkou[k]==0){
					break;
				}
				if(ban[ichi] != ban[ichi+houkou[k]] &&
				  (ban[ichi+houkou[k]]!=WALL)){
					/* dame_ptr はNULL が設置してある */
					if(bancell[ichi+houkou[k]].g_ptr->dame_ptr==NULL){
						w_damep=damecell_get();
						bancell[ichi+houkou[k]].g_ptr->dame_ptr=w_damep;
						w_damep->next=w_damep;
						w_damep->ichi=ichi;
					}else{
						w_damep=damecell_get();
						w_damep->next=bancell[ichi+houkou[k]].g_ptr->dame_ptr->next;
						bancell[ichi+houkou[k]].g_ptr->dame_ptr->next=w_damep;
						w_damep->ichi=ichi;
					}
				}
			}
		}
	}

	return 0;
}

/* ダメ数を計算する */
static int banx_damesu()
{
DAMECELL *w_damep;
char w_iro;

	/* ダメ数の計算 */
	for(current_g_ptr=init_gcell.next;current_g_ptr!=&init_gcell;
		current_g_ptr=current_g_ptr->next){
		if(current_g_ptr->dame_ptr==NULL){
			current_g_ptr->dame_number = 0;
		}else{
			/* ダメ数の計算 */
			w_damep=current_g_ptr->dame_ptr;
			current_g_ptr->dame_number = 0;
			do{
				if(ban[w_damep->ichi] == BLANK){
					current_g_ptr->dame_number++;
				}
				w_damep=w_damep->next;
			}while(w_damep!=current_g_ptr->dame_ptr);
			
			/* territoty_iro の決定 */
			if(current_g_ptr->iro==BLANK){
				w_damep=current_g_ptr->dame_ptr;
				w_iro=ban[w_damep->ichi];
				w_damep=w_damep->next;
				do{
					if(w_iro!=ban[w_damep->ichi]){
						w_iro=BLANK;
						break;
					}
					w_damep=w_damep->next;
				}while(w_damep!=current_g_ptr->dame_ptr);
				current_g_ptr->territory_iro=w_iro;
				
			}
		}
	}
	
	
	return 0;

}

/*  領域の数を計算する */
int banx_ternumber()
{
int w_territory_number;
BANCELL *w_ptr;
GCELL	*cur_g_ptr;

	for(cur_g_ptr=init_gcell.next;cur_g_ptr!=&init_gcell;
		cur_g_ptr=cur_g_ptr->next){
					w_territory_number=0;
					w_ptr=cur_g_ptr->c_ptr;
					do{
						w_territory_number++;
						w_ptr=w_ptr->next;
					}while(w_ptr!=cur_g_ptr->c_ptr);
					cur_g_ptr->territory_number=w_territory_number;
	}

	return 0;
}
	
/*  盤面にデ−タを表示する */
int banx_disp()
{
int i;
int w_territory_number;
BANCELL *w_ptr;
GCELL	*cur_g_ptr;
int ex_ban[MAX_BANSIZE2];

	for(cur_g_ptr=init_gcell.next;cur_g_ptr!=&init_gcell;
		cur_g_ptr=cur_g_ptr->next){
			switch (cur_g_ptr->iro){
				case BLACK:	
					w_territory_number=0;
					w_ptr=cur_g_ptr->c_ptr;
					do{
						if(cur_g_ptr->henkan_territory_iro==BLANK){
							henkan_ban[w_ptr-bancell]=BLACK;
						}else{
							henkan_ban[w_ptr-bancell]=BLACK_CAPTURE;
						}
						w_territory_number++;
						w_ptr=w_ptr->next;
					}while(w_ptr!=cur_g_ptr->c_ptr);
					cur_g_ptr->territory_number=w_territory_number;
					break;
				case WHITE:	
					w_territory_number=0;
					w_ptr=cur_g_ptr->c_ptr;
					do{
						if(cur_g_ptr->henkan_territory_iro==BLANK){
							henkan_ban[w_ptr-bancell]=WHITE;
						}else{
							henkan_ban[w_ptr-bancell]=WHITE_CAPTURE;
						}
						w_territory_number++;
						w_ptr=w_ptr->next;
					}while(w_ptr!=cur_g_ptr->c_ptr);
					cur_g_ptr->territory_number=w_territory_number;
					break;
				case BLANK:
					w_territory_number=0;
					w_ptr=cur_g_ptr->c_ptr;
					do{
						if(henkan_ban[w_ptr-bancell]!=WALL_TERRITORY){
							if(cur_g_ptr->henkan_territory_iro==BLANK){
								if(cur_g_ptr->territory_iro==BLACK)
									henkan_ban[w_ptr-bancell]=BLACK_TERRITORY;
								else if(cur_g_ptr->territory_iro==WHITE){
									henkan_ban[w_ptr-bancell]=WHITE_TERRITORY;
								}else{
									henkan_ban[w_ptr-bancell]=BLANK;
								}
							}else{
								if(cur_g_ptr->henkan_territory_iro==BLACK)
									henkan_ban[w_ptr-bancell]=BLACK_TERRITORY;
								else if(cur_g_ptr->henkan_territory_iro==WHITE){
									henkan_ban[w_ptr-bancell]=WHITE_TERRITORY;
								}else{
									henkan_ban[w_ptr-bancell]=BLANK;
								}
							}
							w_territory_number++;
						}
						w_ptr=w_ptr->next;
					}while(w_ptr!=cur_g_ptr->c_ptr);
					cur_g_ptr->territory_number=w_territory_number;
					break;
				default: break;
			}
	}

	for(i=0;i<bansize2;i++){
		ex_ban[i] = 0;
	}

	disp_te(henkan_ban, ex_ban);

	return 0;
}
	
/*  地の数デ−タを表示する */
int banx_territory(int *black_t_number, int *white_t_number)
{
int black_number=0;
int white_number=0;

	*black_t_number=0;
	*white_t_number=0;
	for(current_g_ptr=init_gcell.next;current_g_ptr!=&init_gcell;
		current_g_ptr=current_g_ptr->next){
		if(current_g_ptr->henkan_territory_iro==BLANK){
			switch (current_g_ptr->territory_iro){
				case BLACK:{
					*black_t_number+=current_g_ptr->territory_number;
					break;
				}
				case WHITE:{
					*white_t_number+=current_g_ptr->territory_number;
					break;
				}
				default: break;
			}
			switch (current_g_ptr->iro){
				case BLACK:{
					black_number+=current_g_ptr->territory_number;
					break;
				}
				case WHITE:{
					white_number+=current_g_ptr->territory_number;
					break;
				}
				default: break;
			}
		}else{
			switch (current_g_ptr->iro){
				case BLACK:{
					*white_t_number+=current_g_ptr->territory_number*2;
					black_number+=current_g_ptr->territory_number;
					break;
				}
				case WHITE:{
					*black_t_number+=current_g_ptr->territory_number*2;
					white_number+=current_g_ptr->territory_number;
					break;
				}
				case BLANK:{
					if(current_g_ptr->henkan_territory_iro==BLACK){
						*black_t_number+=current_g_ptr->territory_number;
					}else{
						*white_t_number+=current_g_ptr->territory_number;
					}
					break;
				}
				default: break;
			}
		}
	}

	return 0;

}

/*  地の変換 */
int banx_put( int ichi)
{
DAMECELL *w_ptr;

	if(ban[ichi]==BLANK){
		if(henkan_ban[ichi]==WALL_TERRITORY){
			henkan_ban[ichi]=BLANK;
		}else{
			henkan_ban[ichi]=WALL_TERRITORY;
		}
	}else{
		if(bancell[ichi].g_ptr->henkan_territory_iro==BLANK){
			henkan_territory_iro=1-bancell[ichi].g_ptr->iro;
		}else{
			henkan_territory_iro=BLANK;
		}
		bancell[ichi].g_ptr->henkan_territory_iro=henkan_territory_iro;
		if((w_ptr=bancell[ichi].g_ptr->dame_ptr)!=NULL){
			do{
				banx_henkan(bancell[w_ptr->ichi].g_ptr);
				w_ptr=w_ptr->next;
			}while(w_ptr!=bancell[ichi].g_ptr->dame_ptr);
		}
	}

	return 0;

}

int banx_henkan(GCELL *gcellp)
{
DAMECELL *w_ptr;
	
	if(henkan_territory_iro==BLANK){
		if(gcellp->henkan_territory_iro==BLANK){
			return 0;
		}
		gcellp->henkan_territory_iro=henkan_territory_iro;
	}else{
		if(gcellp->iro==henkan_territory_iro
		|| gcellp->henkan_territory_iro==henkan_territory_iro){
			return 0;
		}
		gcellp->henkan_territory_iro=henkan_territory_iro;
	
	}
	
	if((w_ptr=gcellp->dame_ptr)!=NULL){
		do{
			banx_henkan(bancell[w_ptr->ichi].g_ptr);
			w_ptr=w_ptr->next;
		}while(w_ptr!=gcellp->dame_ptr);
	}
	return 0;
}

int banx_debugprint()
{
static int i = 0;
FILE *fp;
GCELL	*cur_g_ptr;
BANCELL *w_ptr;
DAMECELL *w_damep;

	if(++i < 67){
		return -1;
	}

	if((fp=fopen("debug.txt","a"))==NULL){
			printf("debug txt open error!\n");
			return -1;
	}

	fprintf(fp, "banx_debugprint(%d)!\n", i);
	for(cur_g_ptr=init_gcell.next;cur_g_ptr!=&init_gcell;
		cur_g_ptr=cur_g_ptr->next){
		fprintf(fp, "g_ptr = %d\n", cur_g_ptr);
		fprintf(fp, "g_ptr.iro = %d\n", cur_g_ptr->iro);
		fprintf(fp, "g_ptr.territory_number = %d\n", cur_g_ptr->territory_number);
/*
		if(cur_g_ptr->iro != BLANK){
 */
					w_ptr=cur_g_ptr->c_ptr;
					do{
						fprintf(fp, " bancell ichi = (%d, %d)\n", (w_ptr - bancell)%(bansize+1), (w_ptr -bancell)/(bansize+1));
						w_ptr=w_ptr->next;
					}while(w_ptr!=cur_g_ptr->c_ptr);
/*
		}
 */
		fprintf(fp, "g_ptr.dame_number = %d\n", cur_g_ptr->dame_number);
		if(cur_g_ptr->dame_ptr==NULL){
			;
		}else{
			w_damep=cur_g_ptr->dame_ptr;
			do{
				fprintf(fp, " damecell ichi = (%d, %d)\n", (w_damep->ichi)%(bansize+1), (w_damep->ichi)/(bansize+1));
				w_damep=w_damep->next;
			}while(w_damep!=cur_g_ptr->dame_ptr);
		}
		
		fprintf(fp, "g_ptr.territory_iro = %d\n", cur_g_ptr->territory_iro);
		fprintf(fp, "g_ptr.henkan_territory_iro = %d\n\n", cur_g_ptr->henkan_territory_iro);
	}

	fprintf(fp, "banx_debugprint end! \n\n");

	fclose(fp);

	return 0;
}

