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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mu

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

#1

投稿記事 by mu » 14年前

どうしてもこのコードがうまく動きません

コード:

#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;
}

コード:


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 14年前

とりあえず、どうしたらどうまく動かないか説明して頂けますか?
それとだれか他の方が作成したコードとお見受けします(違っていたらごめんなさい)。
今コンパイルしようている環境なども教えてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mu

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

#3

投稿記事 by mu » 14年前

このプログラムを実行すると無限ループのようになってしまいますが
放って置けば終了するのでしょうか?
自分で作成したものです
環境はubuntuです

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 14年前

実行しても無限ループにしか見えませんね。
盤面がどうなっているか1ターンごとに経過を表示してみたらどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

box
記事: 2002
登録日時: 14年前

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

#5

投稿記事 by box » 14年前

全部追いかけたわけじゃないですけど、
72行目で、put関数の戻り値が0じゃない場合を想定してるように見えますが、
put関数のコードを見ると必ず0で戻ってますよね。
そのあたり、想定範囲内なんでしょうか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 14年前

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

#6

投稿記事 by box » 14年前

あと、人に見てもらおうとするコードに全くコメントがないってのはどうなんでしょうね。
適所に的確なコメントが書いてあると、コードを追いかけてみようかな、
なんていう気持ちになりますが、今のコードではちょっと…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る