ページ 11

オセロのプログラムについて

Posted: 2011年4月19日(火) 00:12
by mu
どうしてもこのコードがうまく動きません

コード:

#include <stdio.h>

#define BOARD_W	8
#define BOARD_H	8

#define BLACK	0
#define WHITE	1
#define NONE	2

#define PUT_LINE(xx, yy)	if ( put_line(0, p, x, y, xx, yy) ) if ( m ) put_line(1, p, x, y, xx, yy); else return 1;

char turn, board[][BOARD_W] = {
{NONE,NONE,NONE,NONE,NONE,NONE,NONE,NONE},
{NONE,NONE,NONE,NONE,NONE,NONE,NONE,NONE},
{NONE,NONE,NONE,NONE,NONE,NONE,NONE,NONE},
{NONE,NONE,NONE,BLACK,WHITE,NONE,NONE,NONE},
{NONE,NONE,NONE,WHITE,BLACK,NONE,NONE,NONE},
{NONE,NONE,NONE,NONE,NONE,NONE,NONE,NONE},
{NONE,NONE,NONE,NONE,NONE,NONE,NONE,NONE},
{NONE,NONE,NONE,NONE,NONE,NONE,NONE,NONE}};

char put_line(const char, char (*)[], const char, const char, const char, const char);
char put(const char, char (*)[], const char, const char);
char search(const char (*)[], const char, const char);

int main() {
	char x, y;

	for ( y = 0 ; y < BOARD_H ; ++y )
		for ( x = 0 ; x < BOARD_W ; ++x )
			if ( search(board, x, y) ) {
				turn = !turn;
				puts("On original board");
			}

	return 0;
}

char put_line(const char m, char (*p)[BOARD_W], const char x, const char y, const char xx, const char yy) {
	char px, py;

	for ( px = x + xx, py = y + yy ; px >= 0 && py >= 0 && px < BOARD_W && py < BOARD_H ; px += xx, py += yy )
		if ( p[py][px] == !turn ) {
			if ( m ) p[y][x] = turn;
		} else {
			if ( p[py - yy][px - xx] == !turn ) return 1;
			return 0;
		}
}

char put(const char m, char (*p)[BOARD_W], const char x, const char y) {
	if ( p[y][x] == NONE ) {
		PUT_LINE(0, 1)
		PUT_LINE(1, 0)
		PUT_LINE(1, 1)
		PUT_LINE(-1, 0)
		PUT_LINE(0, -1)
		PUT_LINE(-1, -1)
		PUT_LINE(1, -1)
		PUT_LINE(-1, 1)

		if ( m ) {
			p[y][x] = turn;
			turn = !turn;
		}
	}

	return 0;
}

char search(const char (*s)[BOARD_W], const char x, const char y) {
	if ( put(0, s, x, y) ) {
		char d[BOARD_H][BOARD_W], px, py;

		for ( py = 0 ; py < BOARD_H ; ++py )
			for ( px = 0 ; px < BOARD_W ; ++px ) d[py][px] = s[py][px];

		put(1, d, x, y);

		for ( py = 0 ; py < BOARD_H ; ++py )
			for ( px = 0 ; px < BOARD_W ; ++px )
				if ( search(d, px, py) ) {
					turn = !turn;
					puts("On virtual board");
				}

		return 1;
	}

	return 0;
}

コード:


Re: オセロのプログラムについて

Posted: 2011年4月19日(火) 01:02
by softya(ソフト屋)
とりあえず、どうしたらどうまく動かないか説明して頂けますか?
それとだれか他の方が作成したコードとお見受けします(違っていたらごめんなさい)。
今コンパイルしようている環境なども教えてください。

Re: オセロのプログラムについて

Posted: 2011年4月19日(火) 23:17
by mu
このプログラムを実行すると無限ループのようになってしまいますが
放って置けば終了するのでしょうか?
自分で作成したものです
環境はubuntuです

Re: オセロのプログラムについて

Posted: 2011年4月19日(火) 23:24
by softya(ソフト屋)
実行しても無限ループにしか見えませんね。
盤面がどうなっているか1ターンごとに経過を表示してみたらどうでしょうか?

Re: オセロのプログラムについて

Posted: 2011年4月19日(火) 23:53
by box
全部追いかけたわけじゃないですけど、
72行目で、put関数の戻り値が0じゃない場合を想定してるように見えますが、
put関数のコードを見ると必ず0で戻ってますよね。
そのあたり、想定範囲内なんでしょうか?

Re: オセロのプログラムについて

Posted: 2011年4月20日(水) 00:11
by box
あと、人に見てもらおうとするコードに全くコメントがないってのはどうなんでしょうね。
適所に的確なコメントが書いてあると、コードを追いかけてみようかな、
なんていう気持ちになりますが、今のコードではちょっと…。