ページ 11

ゲームの得点計算

Posted: 2012年2月19日(日) 14:54
by kall
あるゲームの得点の計算方法についてなのですが、どのように計算していけばいいのかわかりません.
あるゲームというのはローゼンケーニッヒというもので,領地を増やしていくゲームなのですが得点計算の際に自分の領地が上下隣り合っていれば
その隣り合っている数の2乗になるというものです.そうでなければ1点となります.計算方法がわからないのでまったく完成していないのですが、あらかじめ計算する盤面を用意しました.この盤面では白○が13,赤●が23となります.解説お願いします.

コード:

#include<stdio.h>
 
#define WIDTH 9
#define HEIGHT 9


void print_board(int board[WIDTH*HEIGHT]);
void init_board(int board[WIDTH*HEIGHT]);

int main(){
	int board[WIDTH*HEIGHT],i,atai;



	init_board(board);
	print_board(board);

	return 0;
}
void init_board(int board[WIDTH*HEIGHT]){
	int i;

	for(i=0;i<WIDTH*HEIGHT;i++){
		board[i]=0;
	}

	board[2]=board[23]=board[25]=board[34]=board[12]=board[13]=board[11]=board[15]=board[56]=1;
	board[1]=board[35]=board[45]=board[57]=board[78]=board[92]=board[29]=board[28]=board[17]=board[16]=2;

}

void print_board(int board[WIDTH*HEIGHT]){
	int i,x;

	for(i=0;i<WIDTH*HEIGHT;i++){
		if(board[i]==1){
			printf("●");
		}
		else if(board[i]==2){
			printf("○");
		}
		else{
			printf("□");
		}
		if(i%9==8){
			printf("\n");
		}
	}
}

Re: ゲームの得点計算

Posted: 2012年2月19日(日) 15:17
by みけCAT
人間にわかりやすい形で、計算する盤面を用意できませんか?
あと、WIDTH*HEIGHT==9*9==81なので、board[92]にアクセスするとアクセス違反になると思います。

Re: ゲームの得点計算

Posted: 2012年2月19日(日) 15:39
by kall
わかりやすくとはどういったことでしょうか?もっと簡単な配列でということでしょうか?
board[92]はすいません.その部分だけ削除してください.

Re: ゲームの得点計算

Posted: 2012年2月19日(日) 15:42
by みけCAT
盤面が見えるようにということです。
これですね。

コード:

□○●□□□□□□
□□●●●□●○○
□□□□□●□●□
□○○□□□□●○
□□□□□□□□□
○□□□□□□□□
□□●○□□□□□
□□□□□□□□□
□□□□□□○□□
ソースコード中では、直接通し番号を添字に指定するのではなく、
(x,y)に置く(左上が(0,0))の場合
y*WIDTH+x
というように指定した方が見やすいと思います。

Re: ゲームの得点計算

Posted: 2012年2月19日(日) 16:00
by みけCAT
盤面の端から順番に調べていき、
コマがあったら、そこからつながっているコマの数を数えながら消していきます。
つながっているコマを全て消したら、消したコマの数の2乗を点数に足します。

コード:

#include<stdio.h>

#define WIDTH 9
#define HEIGHT 9


void print_board(int board[WIDTH*HEIGHT]);
void init_board(int board[WIDTH*HEIGHT]);

void calc_score(int* s1,int* s2,int board[WIDTH*HEIGHT]);

int main(){
	int board[WIDTH*HEIGHT],i,atai;

	int score_white,score_red;



	init_board(board);
	print_board(board);

	calc_score(&score_red,&score_white,board);
	printf("white=%d,red=%d\n",score_white,score_red);
 
	return 0;
}
void init_board(int board[WIDTH*HEIGHT]){
	int i;

	for(i=0;i<WIDTH*HEIGHT;i++){
		board[i]=0;
	}

	board[2]=board[23]=board[25]=board[34]=board[12]=board[13]=board[11]=board[15]=board[56]=1;
	board[1]=board[35]=board[45]=board[57]=board[78]=board[29]=board[28]=board[17]=board[16]=2;
 
}

void print_board(int board[WIDTH*HEIGHT]){
	int i,x;

	for(i=0;i<WIDTH*HEIGHT;i++){
		if(board[i]==1){
			printf("●");
		}
		else if(board[i]==2){
			printf("○");
		}
		else{
			printf("□");
		}
		if(i%9==8){
			printf("\n");
		}
	}
}

int tadoru(int board[WIDTH*HEIGHT],int x,int y,int color) {
	int sum=1;
	/*そこに調べているコマが無ければ終了*/
	if(board[y*WIDTH+x]!=color)return 0;
	/*そこのコマを消す*/
	board[y*WIDTH+x]=0;
	/*上下左右にたどる*/
	if(x>0)sum+=tadoru(board,x-1,y,color);
	if(y>0)sum+=tadoru(board,x,y-1,color);
	if(x<WIDTH-1)sum+=tadoru(board,x+1,y,color);
	if(y<HEIGHT-1)sum+=tadoru(board,x,y+1,color);
	/*コマの数を返す*/
	return sum;
}

void calc_score(int* s1,int* s2,int board[WIDTH*HEIGHT]) {
	int board2[WIDTH*HEIGHT];
	int i;
	int x,y;
	int score;
	/*盤面をコピーする*/
	for(i=0;i<WIDTH*HEIGHT;i++) {
			board2[i]=board[i];
	}
	/*点数を初期化する*/
	/*s1は1の点数、s2は2の点数*/
	(*s1)=0;
	(*s2)=0;
	/*盤面を順番に調べる*/
	for(y=0;y<HEIGHT;y++) {
		for(x=0;x<WIDTH;x++) {
			/*コマがあったら*/
			if(board2[y*WIDTH+x]==1) {
				/*つながっているコマの数を調べながら消す*/
				score=tadoru(board2,x,y,1);
				/*その数の2乗を点数に加える*/
				(*s1)+=score*score;
			} else if(board2[y*WIDTH+x]==2) {
				/*つながっているコマの数を調べながら消す*/
				score=tadoru(board2,x,y,2);
				/*その数の2乗を点数に加える*/
				(*s2)+=score*score;
			}
		}
	}
}

Re: ゲームの得点計算

Posted: 2012年2月19日(日) 16:17
by kall
投稿ありがとうございます.これでプログラムが完成できそうです.
短時間での投稿ありがとうございます