オセロで、石を反転する範囲の捜索の仕方がわかりません

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

オセロで、石を反転する範囲の捜索の仕方がわかりません

#1

投稿記事 by sadora3 » 11年前

VC++2010でDxライブラリを使ってプログラムを組んでいます。
初めてここで質問します。見難くてすみません。
#define BAN_SIZE 64//盤目の大きさ
#define WALL -1//壁
#define BAN 0//盤目
#define SIRO 1//白の石
#define KURO 2//黒の石
#define FLASH 3//石を置ける場所の表示

と定義してあり、

コード:

static int BanDate[10][10]={
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,0,0,0,0,0,0,0,0,-1},
{-1,0,0,0,0,0,0,0,0,-1},
{-1,0,0,0,0,0,0,0,0,-1},
{-1,0,0,0,1,2,0,0,0,-1},
{-1,0,0,0,2,1,0,0,0,-1},
{-1,0,0,0,0,0,0,0,0,-1},
{-1,0,0,0,0,0,0,0,0,-1},
{-1,0,0,0,0,0,0,0,0,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
};

void Draw_init(){
GH_HAIKEI = LoadGraph("画像/背景.png");
GH_SIRO = LoadGraph("画像/白.png");
GH_KURO = LoadGraph("画像/黒.png");
GH_BAN = LoadGraph("画像/将棋板.png");
GH_FLASH = LoadGraph("画像/フラッシュ.png");}

void Draw_board(){
int x,y;
DrawGraph(0,0,GH_HAIKEI,FALSE);

for(x=0;x<10;x++){
for(y=0;y<10;y++){
switch(BanDate[y][x]){

case BAN:
DrawGraph(x*BAN_SIZE,y*BAN_SIZE,GH_BAN,TRUE);
if((masuY==y)&&(masuX==x)){
SetDrawBlendMode(DX_BLENDMODE_ADD,255);
DrawGraph(x*BAN_SIZE,y*BAN_SIZE,GH_BAN,TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0); }
break;

case SIRO:
DrawGraph(x*BAN_SIZE,y*BAN_SIZE,GH_BAN,TRUE);
if((masuY==y)&&(masuX==x)){
SetDrawBlendMode(DX_BLENDMODE_ADD,255);
DrawGraph(x*BAN_SIZE,y*BAN_SIZE,GH_BAN,TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0); }
DrawGraph(x*BAN_SIZE,y*BAN_SIZE,GH_SIRO,TRUE);
break;

case KURO:
DrawGraph(x*BAN_SIZE,y*BAN_SIZE,GH_BAN,TRUE);
if((masuY==y)&&(masuX==x)){
SetDrawBlendMode(DX_BLENDMODE_ADD,255);
DrawGraph(x*BAN_SIZE,y*BAN_SIZE,GH_BAN,TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0); }
DrawGraph(x*BAN_SIZE,y*BAN_SIZE,GH_KURO,TRUE);
break;

case FLASH:
DrawGraph(x*BAN_SIZE,y*BAN_SIZE,GH_BAN,TRUE);
if((masuY==y)&&(masuX==x)){
SetDrawBlendMode(DX_BLENDMODE_ADD,255);
DrawGraph(x*BAN_SIZE,y*BAN_SIZE,GH_BAN,TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0); }
DrawGraph(x*BAN_SIZE,y*BAN_SIZE,GH_FLASH,TRUE);
break;
}}}}

int Draw_mouse_input(){
int mouseX=0;
int mouseY=0;

GetMousePoint(&mouseX,&mouseY);

masuX=mouseX/BAN_SIZE;
masuY=mouseY/BAN_SIZE;

return 0;
}
このようにして、盤を光らせてみました。
次は石を置ける場所にFLASHを代入して盤を光らせたいのですが、どうしたらよいのでしょうか?
説明下手ですみません。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#2

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

インデントが無いため大変読みづらいです。バグ防止のためにもインデントを使ってください。
「mixcpp/投稿前チェックリスト - PukiWiki」
http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8

で内容ですが演出の前に、オセロの他の部分は完成しているんでしょうか?
コマを置く処理とか、ひっくり返す処理とか、勝敗判定とか。
置ける場所を探す処理は、ひっくり返す処理ができていれば応用で出来ると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#3

投稿記事 by sadora3 » 11年前

申し訳ありません。今後から気をつけます。
オセロの他の部分は全くさわっておりません。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#4

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

sadora3 さんが書きました:申し訳ありません。今後から気をつけます。
オセロの他の部分は全くさわっておりません。
さわっていないと言うのは作っていないと言うことですね。
であれば、そちらを先に進めてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#5

投稿記事 by sadora3 » 11年前

ひっくり返す処理はどのようにすればよいのでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#6

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

sadora3 さんが書きました:ひっくり返す処理はどのようにすればよいのでしょうか?
どの様にって話だと、その前にコマを置けないと行けません。
まず、ひっくり返しや判定なしに盤面にコマを置く処理を書いてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#7

投稿記事 by sadora3 » 11年前

Stone_put関数を作り、右クリックしたらそこが盤なら白石を置けるようにしました。

コード:

int Stone_put(int masuY,int masuX){
	if(BanDate[masuY][masuX]==BAN){
		BanDate[masuY][masuX]=SIRO;
	}
	return 0;
}

//Draw_mouse_input関数の中で上の関数を使っています。

int Draw_mouse_input(){
int mouseX=0;
int mouseY=0;

GetMousePoint(&mouseX,&mouseY);
masuX=mouseX/BAN_SIZE;
masuY=mouseY/BAN_SIZE;

if((GetMouseInput()&MOUSE_INPUT_LEFT)!=0){
	Stone_put(masuY,masuX);
	}
	return 0;
}
これでよいのでしょうか?
また、ここからどうすればいいのでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#8

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

上にも書きましたがインデントをお願いします。

プログラムとしては、Draw_mouse_inputと言う関数内にコマを置く処理を加えると関数の機能が不明確になりますのでStone_putを書く場所を変えるべきです。
Draw_mouse_inputと言う関数名も関数機能が不明確なので、動詞+名前などで機能を最小限にして名前と機能を一致させてください。
input_mouse_pointなどの名前のほうが良いと思います。

で、今コマが置かれた場所の真上に何があるか調べる関数を書いてみてください。
それが最初の一歩です。

あと再帰処理を使う予定なのですがご存知でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#9

投稿記事 by sadora3 » 11年前

コード:

int Check_up(int masuY,int masuX){
	int A;
	if(BanDate[masuY][masuX]=SIRO){
		A=BanDate[masuY+1][masuX];
	}
return 0;
}
こんなものしか出来ませんでしたが、これでいいのでしょうか?
それとDraw_mouse_inputはマウスに関する関数で、マウスに関係するものは全てここに書こうと思っているのですが、ダメでしょうか?
再帰処理というのは初めて聞きました。なのでわかりません。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#10

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

sadora3 さんが書きました:

コード:

int Check_up(int masuY,int masuX){
	int A;
	if(BanDate[masuY][masuX]=SIRO){
		A=BanDate[masuY+1][masuX];
	}
return 0;
}
こんなものしか出来ませんでしたが、これでいいのでしょうか?
それとDraw_mouse_inputはマウスに関する関数で、マウスに関係するものは全てここに書こうと思っているのですが、ダメでしょうか?
再帰処理というのは初めて聞きました。なのでわかりません。
えーと、まずインデントを直しましょうか? インデントが理解されていない気がするのですが分からないなら質問してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#11

投稿記事 by sadora3 » 11年前

すみません。インデントとはなんでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#12

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

sadora3 さんが書きました:すみません。インデントとはなんでしょうか?
上に方に書いた「mixcpp/投稿前チェックリスト - PukiWiki」を読んでください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#13

投稿記事 by sadora3 » 11年前

読んで、気をつけていたつもりなのですが、何処かおかしかったでしょうか。
改行や空白を揃えればよろしいのですよね?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#14

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

sadora3 さんが書きました:読んで、気をつけていたつもりなのですが、何処かおかしかったでしょうか。
改行や空白を揃えればよろしいのですよね?
return 0;の位置が変ですね。
ポイントは書かれている通り次の3つです。
・行頭を揃える
・特に開き波カッコ { と、それに対応する閉じ波カッコ } の位置は意識して揃える
・{ と } の間の行は、スペース4個分字下げする
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#15

投稿記事 by sadora3 » 11年前

コード:

int Check_up( int masuY , int masuX ){
    int A;
    if( BanDate[ masuY ][ masuX ] = SIRO ){
        A = BanDate[ masuY + 1 ][ masuX ];
    }
    return 0;
} 
なるほど。つまりこういうことですね?
昔はこうしてましたが、今は汚い方でなれていたようです。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#16

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

sadora3 さんが書きました:

コード:

int Check_up( int masuY , int masuX ){
    int A;
    if( BanDate[ masuY ][ masuX ] = SIRO ){
        A = BanDate[ masuY + 1 ][ masuX ];
    }
    return 0;
} 
なるほど。つまりこういうことですね?
昔はこうしてましたが、今は汚い方でなれていたようです。
はい、これで正しいです。

で、プログラムの問題ですが、
1) 比較を書くべき所に代入をしている間違いがあります。
2) 白を置いたのに白を調べようとしています。と言うか置いたのは分かっているのに調べても意味が無いのでは?
3) masuY + 1は盤面で上方向ですか?
4) return 0;だと何も返していません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#17

投稿記事 by sadora3 » 11年前

うーん。
今コマが置かれた場所の真上に何があるか調べる関数っていうのがよくわかりません。
Stone_put関数は関係ありますか?
masuY+1は盤面の一個上です。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#18

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

sadora3 さんが書きました:うーん。
今コマが置かれた場所の真上に何があるか調べる関数っていうのがよくわかりません。
最終的には置いた石の周りの8方向の状態を調べたいわけです。オセロですからね。
更に方向によっては盤面から外に出てしまうかも知れませんし、その方向には石が置かれていないかも知れません。
あるいは、自分と同じ色の石が既に隣に置かれているかも知れません。
そういう事も含めて調べる関数が欲しいわけです。違う色の石が隣に置かれていて初めてその先を調べる意味があるって事です。

プログラムというのは人が無意識レベルでやっていることも含めてプログラムにしないと動きません。
よく考えて、オセロで行なっているルールを文章化してみてください。
sadora3 さんが書きました: Stone_put関数は関係ありますか?
masuY+1は盤面の一個上です。
表示が
for(x=0;x<10;x++){
for(y=0;y<10;y++){
DrawGraph(x*BAN_SIZE,y*BAN_SIZE,GH_BAN,TRUE);
ですので、画面上でyが大きくなるほど下に表示されます。これは画面の座標系で画面左上の座標が(0,0)で下に行くほど数値が大きくなるからです。
なのでmasuY+1は上ですか?とお聞きしました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#19

投稿記事 by sadora3 » 11年前

コード:

int Check_up( int masuY , int masuX ){
	if( BanDate[ masuY ][ masuX ] = BAN ){
	     return 4;
	}
}
よくわかりませんが、一様書いてきました。
もしかしてこれ戻り値複数ありますか?

>>比較を書くべき所に代入をしている間違いがあります
これの意味がよくわかりません

それとmasuY+1は確かに下ですね。すみません。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#20

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

=は代入演算子で==が比較演算子です。
あと4は何の意味でしょうか?

>もしかしてこれ戻り値複数ありますか?

それを決めるのは関数の設計者のsadora3さんで有るべきですが、私の説明したことから推測される必要な関数の戻り値のパターンを書きだしてみてください。
私の説明がよくわからないのなら、まずオセロのコマを置くルールをできるだけ細かく書き出すことから始めてください。
プレイしたことがない人にも分かるレベルでお願いします。これはゲームをプログラムに落としこむ時に最初にすべき作業です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#21

投稿記事 by sadora3 » 11年前

コード:

int Check_Board( int masuY , int masuX ){
	if( BanDate[ masuY ][ masuX ] == SIRO ){
		return 1;
	}
	if( BanDate[ masuY ][ masuX ] == KURO ){
		return 2;
	}
}
4はわけわからなかったので、特に意味はありません。
これでどうですか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#22

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

sadora3 さんが書きました:

コード:

int Check_Board( int masuY , int masuX ){
	if( BanDate[ masuY ][ masuX ] == SIRO ){
		return 1;
	}
	if( BanDate[ masuY ][ masuX ] == KURO ){
		return 2;
	}
}
4はわけわからなかったので、特に意味はありません。
これでどうですか?
私の書いた仕様だと

最終的には置いた石の周りの8方向の状態を調べたいわけです。オセロですからね。
1)更に方向によっては盤面から外に出てしまうかも知れませんし
2)その方向には石が置かれていないかも知れません。
3)あるいは、自分と同じ色の石が既に隣に置かれているかも知れません。
4)違う色の石が隣に置かれていている。

の3)と4)しか調べていませんね。なので足りません。

先にやはりオセロのコマを置くルールを書きだして抜けのないこと確認しながら作業したほうがよさそうです。
案外説明できないものですよ。
ルールを詳細に説明できるだけ頭の中にイメージが固めているのならプログラムで抜けがあると違和感を感じると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#23

投稿記事 by sadora3 » 11年前

コード:

int Check_Board( int masuY , int masuX ){
	if( BanDate[ masuY ][ masuX ] == SIRO ){
		return 1;
	}else{
		return 0;
	}
	if( BanDate[ masuY ][ masuX ] == KURO ){
		return 2;
	}else{
		return 0;
	}
}
こういうことですか?
オセロのコマを置くルールといえば、
・既に置いてある自分のコマと相手のコマを挟む様にして置く
・上下左右斜めに上の状況が出来れば相手の石をひっくり返すことが出来る
ぐらいではありませんか?他にはなにも出てこないのですが・・・。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#24

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

プログラムは大問題がありますが、とりあえず置いておいて、こちらを更に細かくして行きましょう。

1)既に置いてある自分のコマと相手のコマを挟む様にして置く
これに石置いた時のすべての場合に分けて表に書いてみましょうか。
簡単にするために、1方向で2つ離れたマスまでとします。あり得ることをすべて表に書き出してください。
------------------------------------------------------------------------
自分コマ 1つ離れたマス 2つ離れたマス 処理すべき動作
------------------------------------------------------------------------
白い石
------------------------------------------------------------------------

2)上下左右斜めに上の状況が出来れば相手の石をひっくり返すことが出来る
ここをもっと明確に書きましょう。
どういう場合は置けますか?
どういう場合は置けませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#25

投稿記事 by sadora3 » 11年前

自分コマも白ですよね?
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分コマ 1つ離れたコマ               2つ離れたコマ                    処理すべき動作
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
白い石 なにもできない、黒にされる可能性がある   間に黒があったら白に出来る、黒にされる可能性がある   黒の場所に白を代入
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2)どういう場合はおけるか
白石の周り8マスに黒が存在する場合
どういう場合は置けないか
白石の周り8マスに白石しかない又はなにもない場合

(1)のはよくわかりません。一方向というのはつまり、
{-1,0,0,0,0,0,0,0,0,-1}
という意味でしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#26

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

sadora3 さんが書きました:自分コマも白ですよね?
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分コマ 1つ離れたコマ               2つ離れたコマ                    処理すべき動作
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
白い石 なにもできない、黒にされる可能性がある   間に黒があったら白に出来る、黒にされる可能性がある   黒の場所に白を代入
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分が白い石です。
EXCELのような表で書いてくださいね。こういうのを条件表って言います。
1つ離れたマスに 白い石、黒い石・・・・とそれぞれ条件別に行を書いてください。1行には1つの列毎に1つの条件しか書いてはいけません。
同様に2つ離れたマスも1つ離れたマスと組み合わせの数だけ書きます。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分コマ 1つ離れたマス 2つ離れたマス 処理すべき動作 ← 誤解を招くのでマスに変更します。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
白い石  白い石      ?        どうなりますか?   
白い石  黒い石      ?        ?


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------


2)どういう場合はおけるか
白石の周り8マスに黒が存在する場合  ← もっと正確に。 黒があっても置けない場合があります。上の表示の処理すべき動作で書きましょう。
あと8マス全部が黒じゃないと誤解を受ける書き方なので

どういう場合は置けないか
白石の周り8マスに白石しかない又はなにもない場合 ← 上と同様です。
これも表にしてみましょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#27

投稿記事 by sadora3 » 11年前

------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分コマ 1つ離れたマス 2つ離れたマス 処理すべき動作
------------------------------------------------------------------------------------------------------------------------------------------------------------------
白い石  白い石      白い石     なにもできない
白い石  白い石      黒い石     なにもできない
白い石  黒い石      白い石     黒を白にする
白い石  黒い石      黒い石     なにもできない
------------------------------------------------------------------------------------------------------------------------------------------------------------------
2)どういう場合はおけるか、の上の表示の処理すべき動作で書きましょうっていうのがよくわかりません。なので、文字だけで・・
・どういう場合はおけるか
白石の周り8マスのどれかに黒石が存在する場合で且つ、
その黒石から見て白石が存在する反対方向が盤面であるとき。
もしくはその黒石から見て白石が存在する反対方向が黒石の連続で最後が白石であるとき。
・どういう場合は置けないか
白石の周り8マスに黒が存在しない場合。
あるいは、白石の周り8マスのでれかに黒が存在するが、その黒石から見て白石が存在する反対方向に白石がない場合

アバター
asd
記事: 319
登録日時: 13年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#28

投稿記事 by asd » 11年前

sadora3 さんが書きました:------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分コマ 1つ離れたマス 2つ離れたマス 処理すべき動作
------------------------------------------------------------------------------------------------------------------------------------------------------------------
白い石  白い石      白い石     なにもできない
白い石  白い石      黒い石     なにもできない
白い石  黒い石      白い石     黒を白にする
白い石  黒い石      黒い石     なにもできない
------------------------------------------------------------------------------------------------------------------------------------------------------------------
横から失礼します。
上記の表ではマスに石がある前提のみ書かれていますが、石がまだ置かれていないマスである場合も考えなくてはなりませんし、盤面の端のほうでは範囲外になってしまうかもしれません。
なので、上記の条件表に
・何もない(石が置かれていない)
・盤面をはみ出す
も加えたほうがいいのではないでしょうか。

言うまでもなく、1マス隣り、2マス隣りが何もなかったり、盤面をはみ出す場合には石をとる(裏返す)ことはできませんよね。
Advanced Supporting Developer
無理やりこじつけ(ぉ

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#29

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

asdさん、ありがとうございます。
私が書いた「白い石、黒い石・・・・」の・・・・にそういうのを含めたつもりなんですけどね。

sadora3さん。
これまでもヒントで書いてますので全部を見なおしてみてください。
プログラムと言うのは全部のバリエーションを網羅しないとちゃんと動いてくれませんなので、想定される状況をすべて書くというのは絶対に必要な作業です。
実際のオセロをやるときには無意識には行なってる事ですが、それを文章にしないといけないのがプログラムなんです。

>・どういう場合はおけるか
>白石の周り8マスのどれかに黒石が存在する場合で且つ、
>その黒石から見て白石が存在する反対方向が盤面であるとき。

>もしくはその黒石から見て白石が存在する反対方向が黒石の連続で最後が白石であるとき。 ← ここだけ怪しいです。連続の最後が白石である必然は無いはずです。

>・どういう場合は置けないか
>白石の周り8マスに黒が存在しない場合。
>あるいは、白石の周り8マスのでれかに黒が存在するが、その黒石から見て白石が存在する反対方向に白石がない場合
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#30

投稿記事 by sadora3 » 11年前

------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分コマ 1つ離れたマス 2つ離れたマス 処理すべき動作
------------------------------------------------------------------------------------------------------------------------------------------------------------------
白い石  白い石      白い石     なにもできない
白い石  白い石      黒い石     なにもできない
白い石  黒い石      白い石     黒を白にする
白い石  黒い石      黒い石     なにもできない
白い石  何もない     白い石     なにもできない
白い石  何もない     黒い石     なにもできない
白い石  白い石      何もない    なにもできない
白い石  黒い石      何もない    白が置ける
白い石  何もない     何もない    なにもできない
白い石  壁        壁       なにもできない
白い石  白い石      壁       なにもできない
白い石  黒い石      壁       なにもできない
------------------------------------------------------------------------------------------------------------------------------------------------------------------
・もしくはその黒石から見て白石が存在する反対方向が黒石の連続で最後が白石であるとき
これ最後白石ではなく、盤面であるときでしたね。すみません。

アバター
little
記事: 44
登録日時: 12年前
連絡を取る:

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#31

投稿記事 by little » 11年前

気になったので失礼します。

白い石, 黒い石, 何もない, 白が置ける
オセロではなく、五目並べになってませんか…?

難しいですね。。
百聞は~

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#32

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

並べ直して整理してみました。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分コマ 1つ離れたマス 2つ離れたマス 処理すべき動作
------------------------------------------------------------------------------------------------------------------------------------------------------------------
白い石  白い石      白い石     なにもできない
白い石  白い石      黒い石     なにもできない
白い石  白い石      何もない    なにもできない
白い石  白い石      壁       なにもできない
白い石  黒い石      白い石     黒を白にする ← 白がおける。挟んだ黒をひっくり返す。と両方書きましょう。
白い石  黒い石      黒い石     なにもできない ← これは「先を調べる」ですね。
白い石  黒い石      何もない    白が置ける ← オセロで置けるんでしょうか? 私の知るルールでは置けません。
白い石  黒い石      壁       なにもできない
白い石  何もない     白い石     なにもできない
白い石  何もない     黒い石     なにもできない
白い石  何もない     何もない    なにもできない
白い石  壁        壁       なにもできない
------------------------------------------------------------------------------------------------------------------------------------------------------------------

五目並べになっていると指摘がありますが、まあご容赦ください。

2マス目を見なくて良い時は-とでも書きましょうか。どんな状態でもその先は調べないと言う意味です。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分コマ 1つ離れたマス 2つ離れたマス 処理すべき動作
------------------------------------------------------------------------------------------------------------------------------------------------------------------
白い石  白い石      -       なにもできない
 :
 :
------------------------------------------------------------------------------------------------------------------------------------------------------------------
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#33

投稿記事 by sadora3 » 11年前

------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分コマ 1つ離れたマス 2つ離れたマス 処理すべき動作
------------------------------------------------------------------------------------------------------------------------------------------------------------------
白い石  白い石      白い石     なにもできない
白い石  白い石      黒い石     なにもできない
白い石  黒い石      白い石     白がおける。挟んだ黒をひっくり返す
白い石  黒い石      黒い石     先を調べる
白い石   -       白い石     なにもできない
白い石   -       黒い石     なにもできない
白い石  白い石       -      なにもできない
白い石  黒い石       -      なにもできない
白い石   -        -      なにもできない
白い石  壁        壁       なにもできない
白い石  白い石      壁       なにもできない
白い石  黒い石      壁       なにもできない
------------------------------------------------------------------------------------------------------------------------------------------------------------------
なるほど。これで見やすくなりました。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#34

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

まだ整理できますよ。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分コマ 1つ離れたマス 2つ離れたマス 処理すべき動作
------------------------------------------------------------------------------------------------------------------------------------------------------------------
白い石  白い石      -        (a)なにもできない
白い石  黒い石      白い石     (b)白がおける。挟んだ黒をひっくり返す
白い石  黒い石      黒い石     (c)先を調べる
白い石  黒い石      何もない盤  (a)なにもできない
白い石  黒い石      壁       (a)なにもできない
白い石  何もない盤   -       (a)なにもできない
白い石  壁        -       (a)なにもできない
------------------------------------------------------------------------------------------------------------------------------------------------------------------
じゃないでしょうか? 1マス目に注目すると隣に黒い石がなければ、その先は調べなくて良いのですよね?
2マス目でも同じですから、つまり黒い石以外が出たらその先は調べなくて良いのです。
【追記】そして最後に調べたマスが白い石なら「(b)白がおける。挟んだ黒をひっくり返す」の条件成立です。

あと8方向ルールを再確認します。
上のルールで処理すべき動作に(a)(b)(c)と書きましたが下の説明に(a)(b)(c)を使ってください。

[どういう場合はおけるか]
1)白石の周り8マスのどれかに黒石が存在する場合で且つ、その黒石から見て白石が存在する反対方向が盤面であるとき。
2)その黒石から見て白石が存在する反対方向が黒石の連続で最後が盤面であるとき。

[どういう場合は置けないか] これは[どういう場合はおけるか] の否定なので[どういう場合はおけるか] が完成すれば良いものとします。一応別視点で考えてもらえたかったので書いてもらったのですが、ちゃんと排他的な関係になっていますか?
1)白石の周り8マスに黒が存在しない場合。
2)あるいは、白石の周り8マスのでれかに黒が存在するが、その黒石から見て白石が存在する反対方向に白石がない場合
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#35

投稿記事 by sadora3 » 11年前

[どういう場合はおけるか]
1)白石の周り8マスのどれかに黒石が存在する場合で且つ、(b)であるとき。
2)白石の周り8マスのどれかに黒石が存在するが、(c)の様な条件であるならば、(b)の条件にあてはまった場合。

[どういう場合は置けないか]
1)白石の周り8マスに黒が存在しないとき。
2)白石の周り8マスのどれかに黒石が存在するが、(c)であっても、(b)の条件にあてはまらないとき。

こういうことですか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#36

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

sadora3 さんが書きました:[どういう場合はおけるか]
1)白石の周り8マスのどれかに黒石が存在する場合で且つ、(b)であるとき。
2)白石の周り8マスのどれかに黒石が存在するが、(c)の様な条件であるならば、(b)の条件にあてはまった場合。

[どういう場合は置けないか]
1)白石の周り8マスに黒が存在しないとき。
2)白石の周り8マスのどれかに黒石が存在するが、(c)であっても、(b)の条件にあてはまらないとき。

こういうことですか?
(a)が何処かに消えてます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#37

投稿記事 by sadora3 » 11年前

[どういう場合はおけるか]
1)白石の周り8マスのどれかに黒石が存在する場合で且つ、(b)であるとき。
2)白石の周り8マスのどれかに黒石が存在するが、(c)の様な条件であるならば、(b)の条件にあてはまった場合。

[どういう場合は置けないか]
(a)である場合

こうでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#38

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

はい。シンプルが一番です。
で、元のプログラミングに戻ってマスを調べる関数としてCheck_Boardを組んでいましたが、これを組み直すとしましょう。
ルールはコレです。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分コマ 1つ離れたマス 2つ離れたマス 処理すべき動作
------------------------------------------------------------------------------------------------------------------------------------------------------------------
白い石  白い石      -        (a)なにもできない
白い石  黒い石      白い石     (b)白がおける。挟んだ黒をひっくり返す
白い石  黒い石      黒い石     (c)先を調べる
白い石  黒い石      何もない盤  (a)なにもできない
白い石  黒い石      壁       (a)なにもできない
白い石  何もない盤   -       (a)なにもできない
白い石  壁        -       (a)なにもできない
------------------------------------------------------------------------------------------------------------------------------------------------------------------
じゃないでしょうか? 1マス目に注目すると隣に黒い石がなければ、その先は調べなくて良いのですよね?
2マス目でも同じですから、つまり黒い石以外が出たらその先は調べなくて良いのです。
【追記】そして最後に調べたマスが白い石なら「(b)白がおける。挟んだ黒をひっくり返す」の条件成立です。
まだ、プログラム向きじゃないので流れの順番に書き直すとしましょう。
引数として置くマスの座標と調べる方向が欲しいですね。※ 調べる方向をどう処理するかも考えないと行けません。ベクトルなのか、方位なのか? これも考えてみてください。いろんな方法があります。
1) 調べる方向の1つ先マスを計算する。
2) 計算された座標のマスを調べる。黒い石以外なら(a)の値を返す。 → Check_Boardと言う関数にするほどでも無さそうです。
ここから先は考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#39

投稿記事 by sadora3 » 11年前

申し訳ありませんが、夏休みの課題を片付けなくてはならないので、プログラミングの時間がほぼなくなってしまいました。
次の送信はいつになるかわかりません。
>引数として置くマスの座標と調べる方向が欲しいですね
置くマスの座標はmasuY,masuXでよろしいですよね?

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#40

投稿記事 by sadora3 » 11年前

うーん。やはりわかりませんでした。
もう少しヒントをくれませんか?
調べる向きはベクトルではなく方位にしたいです。
ベクトルのほうが難しそうだと思ったので。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#41

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

方向で構いませんよ。
分かり辛かったら表にある条件をすべてif文で書いてみましょう。
1つ離れたマスの条件が成立した{}の中に2つ離れたマスの条件を書いてみてください。

[補足]
今までの書き方だ分かりづらいので、擬似コードの書き方としてこうしてみてください。

コード:

1つ離れたマスの座標 = 方向の座標計算(置いた石の座標,調べる方向)
if( マスの情報[1つ離れたマスの座標 ]==白い石 ) {
	2つ離れたマスの座標 = 方向の座標計算(1つ離れたマスの座標,調べる方向)
	if( マスの情報[2つ離れたマスの座標 ]==白い石 ) {	← 表に従うと不要ですが例として書いてみました。
	}
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#42

投稿記事 by sadora3 » 11年前

やっとできました・・・。
プログラミングの時間を確保できなくて時間がかかりすぎました。すみません。

コード:

int Draw_mouse_input(){
     int mouseX=0;
     int mouseY=0;

     GetMousePoint(&mouseX,&mouseY);
     masuX=mouseX/BAN_SIZE;
     masuY=mouseY/BAN_SIZE;

     if( マウスの左クリックが押されたら ){ WhiteStoneFunction(); }
     if( マウスの右クリックが押されたら ){ BlackStoneFunction(); }
     return 0;
}

void White_Stone_Function(){
        if( BanDate[ マウスの座標Y ][ マウスの座標X ] == BAN ){
                          BanDate[ マウスの座標Y ][ マウスの座標X ] = SIRO;
                          WU(); WUr(); WUR(); WURr(); WR(); WRr(); WDR(); WDRr();
                          WD(); WDr(); WDL(); WDLr(); WL(); WLr(); WUL(); WULr();
	}
}

void Black_Stone_Function(){
        if( BanDate[ マウスの座標Y ][ マウスの座標X ] == BAN ){
             BanDate[ マウスの座標Y ][ マウスの座標X ] = KURO;
             BU(); BUr(); BUR(); BURr(); BR(); BRr(); BDR(); BDRr();
             BD(); BDr(); BDL(); BDLr(); BL(); BLr(); BUL(); BULr();
	}
}

//黒の石があったら白の石にする
void White_UP(){
        if( BanDate[ マウスの座標Y-1 ][ マウスの座標X ] == KURO ){
             for( int i = 2; i < 8; i++ ){
                  if( BanDate[ マウスの座標Y-i ][ マウスの座標X ] == SIRO ){ ReversW = 1; }
        else if( BanDate[ マウスの座標Y-i ][ マウスの座標X ] == BAN ){ break; }
                   }
         }
}

void White_UP_Revers(){
        if( ReversWhite==1 ){ ReversWhite = 0; for( int i = 1; i < 8; i++ ){
        if( BanDate[ マウスの座標Y-i ][ マウスの座標X ] == KURO ){
             BanDate[ マウスの座標Y-i ][ マウスの座標X ] = SIRO; }
         else{ break; }
                 }
          }
}
以下略

//白の石があったら黒の石にする
void Black_UP(){
        if( BanDate[ マウスの座標Y-1 ][ マウスの座標X ] == SIRO ){
            for( int i = 2; i < 8; i++ ){
                   if( BanDate[ マウスの座標Y-i ][ マウスの座標X ] == KURO ){ ReversB = 1; }
        else if[ マウスの座標Y-i ][ マウスの座標X ] == BAN ){ break; }
                }
         }
}

void BUr(){
      if( ReversB == 1 ){ReversB = 0; for( int i = 1 ; i < 8; i++ ){
      if( BanDate[ マウスの座標Y-1 ][ マウスの座標X ] == SIRO ){
           BanDate[ マウスの座標Y-1 ][ マウスの座標X ] = KURO; }
       else{ break; }
                }
       }
}
右クリックと左クリックを交互に押せば、オセロとして最低限機能してくれます。
少し強引にやりすぎた気がします。
これをループ文で簡潔にまとめるにはどうすればよいでしょうか。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#43

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

BanDate[ マウスの座標Y ][ マウスの座標X ]
ではなく
BanDate[ masuY ][ masuX ]なのでは?
あと今気づきましたがDateではなくDataですよね。

それと何故私の書き方で書いてもらえないのでしょうか?ちゃんと機能が実現されていない気がします。
私の書き方に従っていないので、やたら関数が増えてますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#44

投稿記事 by sadora3 » 11年前

投稿の間がこんなに開いてすみません。
修学旅行やテストで忙しかったです。

>>今までの書き方だ分かりづらいので、擬似コードの書き方としてこうしてみてください。
この類似コードの書き方がよくわからないのですが、2つ離れたマスの条件とはどういうことでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#45

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

sadora3 さんが書きました:投稿の間がこんなに開いてすみません。
修学旅行やテストで忙しかったです。

>>今までの書き方だ分かりづらいので、擬似コードの書き方としてこうしてみてください。
この類似コードの書き方がよくわからないのですが,2つ離れたマスの条件とはどういうことでしょうか?
分からない事を理由にスルーしてはいけませんよ。分からなかれば聞いてください。

ルールを書き出しまたよね?
------------------------------------------------------------------------------------------------------------------------------------------------------------------
自分コマ 1つ離れたマス 2つ離れたマス 処理すべき動作
------------------------------------------------------------------------------------------------------------------------------------------------------------------
白い石  白い石      -        (a)なにもできない
白い石  黒い石      白い石     (b)白がおける。挟んだ黒をひっくり返す
白い石  黒い石      黒い石     (c)先を調べる
白い石  黒い石      何もない盤  (a)なにもできない
白い石  黒い石      壁       (a)なにもできない
白い石  何もない盤   -       (a)なにもできない
白い石  壁        -       (a)なにもできない
------------------------------------------------------------------------------------------------------------------------------------------------------------------
じゃないでしょうか? 1マス目に注目すると隣に黒い石がなければ、その先は調べなくて良いのですよね?
2マス目でも同じですから、つまり黒い石以外が出たらその先は調べなくて良いのです。
【追記】そして最後に調べたマスが白い石なら「(b)白がおける。挟んだ黒をひっくり返す」の条件成立です。
このルールに「2つ離れたマス」と言う列がありますが、それが条件です。

もう一度表通り書くと

コード:

とりあえず言語でどうするか置いておいて機能を定義します。

定義:マスの座標は(x,y)座標である。

1つ離れたマスの座標 = 方向の座標計算をする関数(置いた石のマスの座標,調べる方向) //1つ離れたマスの座標が得られる。
if( マスの情報[1つ離れたマスの座標 ]==白い石 ) {	//マスの情報[1つ離れたマスの座標 ]は、マス配列からマス座標の石の状態を得る。
	//	 (a)なにもできない
	
	
} else if( マスの情報[1つ離れたマスの座標 ]==黒い石 ) {	//マスの情報[1つ離れたマスの座標 ]は、マス配列からマス座標の石の状態を得る。
    2つ離れたマスの座標 = 方向の座標計算をする関数(1つ離れたマスの座標,調べる方向)	//	更に1つ離れたマスの座標が得られる。
    if( マスの情報[2つ離れたマスの座標 ]==白い石 ) {
    	//	(b)白がおける。挟んだ黒をひっくり返す
    	
    }
    	:
    	:
}}
この擬似コードが表とどう対応しているかよく見てください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#46

投稿記事 by sadora3 » 11年前

申し訳ありませんでした・・・。
こうでしょうか?

コード:

1つ離れたマスの座標   =   方向の座標計算をする関数(置いた石のマスの座標,調べる方向)

if( マスの情報[ 1つ離れたマスの座標 ] == 白い石 ){   (a)なにもできない   }
else if( マスの情報[ 1つ離れたマスの座標 ] == 黒い石 ){

2つ離れたマスの座標 = 方向の座標計算をする関数(1つ離れたマスの座標 , 調べる方向 )

if( マスの情報[ 2つ離れたマスの座標 ] == 白い石 ){   (b)白がおける。挟んだ黒をひっくり返す   }
else if( マスの情報[ 2つ離れたマスの座標 ] == 黒い石 ){   (c)先を調べる   }
else if( マスの情報[ 2つ離れたマスの座標 ] == 何もない盤 ){   (a)なにもできない   }
else if( マスの情報[ 2つ離れたマスの座標 ] == かべ ){   (a)なにもできない   }
}
else if( マスの情報[ 1つ離れたマスの座標 ] == 何もない盤 ){   (a)なにもできない   }
else if( マスの情報[ 1つ離れたマスの座標 ] == かべ ){   (a)なにもできない   }

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#47

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

そうです。
こういこうことをしたかったのです、さて問題は「(c)先を調べる」です。

ここで、再帰呼び出しと言う考え方を使います。1つの次は2つの次は3つの次は・・。と繰り返すからです。
「Programming Place Plus C言語編 第53章 再帰」
http://www.geocities.jp/ky_webid/Progra ... c/053.html
「C言語講座:再帰呼び出し」
http://www1.cts.ne.jp/~clab/hsample/Rec/Rec1.html
ボードゲームには不可欠なので、ぜひ理解してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#48

投稿記事 by sadora3 » 11年前

ある関数の中でその関数を使うのですね。
一様読んできました。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#49

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

sadora3 さんが書きました:ある関数の中でその関数を使うのですね。
一様読んできました。
ということであれば、擬似コードで2マス目以降を再帰処理する関数のコードを書いてみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#50

投稿記事 by sadora3 » 11年前

1つ離れたマスの座標 = 方向の座標計算をする関数(置いた石のマスの座標,調べる方向)
この「方向の座標計算をする関数」という関数の作り方がわかりません。
それと引数はよくわからなくて逃げてきました・・・。
引数はやはり大切なのでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#51

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

sadora3 さんが書きました:1つ離れたマスの座標 = 方向の座標計算をする関数(置いた石のマスの座標,調べる方向)
この「方向の座標計算をする関数」という関数の作り方がわかりません。
それと引数はよくわからなくて逃げてきました・・・。
引数はやはり大切なのでしょうか?
無いと相当無駄なことしないと同じ事は出来ません。そっちのほうがバグらずに作るのは難しいでしょう。
つまり引数を使わないとバグが増え、プログラムが肥大化し、プログラムのは読み辛く成ると言うことです。
特に再帰は引数なしには成立しないと言ってよいものです(厳密には出来ますが、そんな面倒なこと誰もしません)。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#52

投稿記事 by sadora3 » 11年前

引数を再び勉強してきました。しかし、方向の座標計算をする関数(置いた石のマスの座標,調べる方向)の作り方がやはりわかりません。
int Way_Cheak( int masu_Y , int masu_X , int );
いまこんな感じです。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#53

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

考えるべき方向ってのは8方向なのでswitch~caseで場合分けしてそれぞれの座標を方向別に+1,-1するだけです。
置いた石のマスの座標ってのはx,yの入った構造体です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#54

投稿記事 by sadora3 » 11年前

方向の座標計算をする関数はこうでしょうか?

コード:


int Way_Cheak( int y , int x , int way ){
	switch( way ){
		case 1:
			y-1;
			break;
		case 2:
			y-1;
			x+1;
			break;
		case 3:
			x+1;
			break;
		case 4:
			y+1;
			x+1;
			break;
		case 5:
			y-1;
			break;
		case 6:
			y-1;
			x-1;
			break;
		case 7:
			x-1;
			break;
		case 8:
			y+1;
			x-1;
			break;
	}
	return 0;
}
また、構造体の方はこうでしょうか?

コード:

struct Masu_Data{
	int y;
	int x;
}masu = { masuY , masuX };

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#55

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

関数の考え方はそれでOKですね。
構造体宣言と構造体変数の定義は分けてくださいね。
あと関数の引数と戻り値も構造体にします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#56

投稿記事 by sadora3 » 11年前

遅れてしまって申し訳ありません。

構造体宣言と構造体変数の定義を分けるというのはこうでしょうか?

コード:

struct Masu_Data{
      int y;
      int x;
};

struct Masu_Data masu = { masuY , masuX };
関数の引数と戻り値を構造体にするのはこれであっていますか?

コード:

int Way_Cheak( struct Masu_Data W , int way ){
     switch( way ){
            case 1:
                  W.y-1;
                  break;
            case 2:
                  W.y-1;
                  W.x+1;
                  break;
            case 3:
                  W.x+1;
                  break;
            case 4:
                  W.y+1;
                  W.x+1;
                  break;
            case 5:
                  W.y-1;
                  break;
            case 6:
                  W.y-1;
                  W.x-1;
                  break;
            case 7:
                  W.x-1;
                  break;
            case 8:
                  W.y+1;
                  W.x-1;
                  break;
      }
      return W;
}

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#57

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

OKです。
私の回答を待つより、自分で動作確認したほうが速いと思います。
動作をテストする方法も考えてみてください。関数単位の動作確認はプログラムを組む上で非常に重要な技術ですので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#58

投稿記事 by sadora3 » 11年前

コード:

struct Masu_Data{
    int y;
    int x;
};
struct Masu_Data masu = { masuY , masuX };
struct Masu_Data masu_one;
struct Masu_Data masu_two;

int Cheak_Stone(){
    masu_one = Way_Cheak( masu , WAY );
    if( BanData[ masu_one.y ][ masu_one.x ] == KURO ){
        masu_two = Way_Cheak( masu_one , WAY );
        if( BanData[ masu_two.y ][ masu_two.x ] == SIRO ){
            BanData[ masuY ][ masuX ] = SIRO;
            BanData[ masu_one.y ][ masu_one.x ] = SIRO;
        }
        else if( BanData[ masu_two.y ][ masu_two.x ] == KURO ){
        //先を調べる
        }
    }
    return 0;
}
コメントの「先を調べる」という箇所に2マス目以降を再帰処理する関数のコードを書けばよろしいのですよね?
一体どのような再起処理するプログラムを書けばいいのでしょうか・・・。
それとCheak_Stone関数を再起させるのですよね?
あと、このCheak_Stone関数は現段階でおかしな点はありませんか?
(a)なにもできない、という処理はいらないと思い省いたのですが。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#59

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

練習のため階乗の再帰処理を書いてみましょか。
引数と戻り値をうまく使います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#60

投稿記事 by sadora3 » 11年前

うーん・・・。分かりません・・・。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#61

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

何処ら辺がわからないか書いてもらわないと返答しようがないのですが、再帰処理自体の仕組みは調べられましたか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#62

投稿記事 by sadora3 » 11年前

仕組み・・・は多分わからないと思います。
スタックという単語を見た覚えがあります。
10の階乗をやってみようと思ったのですが、何をどうすればいいのかさっぱり分かりませんでした。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#63

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

sadora3 さんが書きました:仕組み・・・は多分わからないと思います。
スタックという単語を見た覚えがあります。
10の階乗をやってみようと思ったのですが、何をどうすればいいのかさっぱり分かりませんでした。
C言語のアルゴリズムの勉強をされたことはありますか?
結局ゲームは、C言語の様々なアルゴリズムや再帰処理などテクニックを使わないと組めない難易度が高くなりがちな分野です。
特にパズルやオセロなどは再帰処理を始めとして簡易なAIなど様々な知識を必要とします。
そこを勉強する気がなかったり、勉強する方法を見つけられないと前に進めないと思ってもらうしか無いのです。厳しい言い方かも知れませんが現実的にそうなのです。

階乗の答えでもありますが、参考サイトです。
「パズル問題解法のアルゴリズム」
http://www.ic-net.or.jp/home/takaken/pz/index.html
読んだ上で、見ずに階乗のプログラムを自分で組んでみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#64

投稿記事 by sadora3 » 11年前

なるほど。勉強になりました。

コード:

#include <stdio.h>
int F(int);
int main(){
        int a;
        a = F(10);
        printf("%d\n" , a);
        return 0;
}

int F(int N){
        int a;
        if( N == 1 ){ a = 1; }
        else a = N * F(N-1);
        return a;
}
10階乗はこうですね。
次はどうすればいいのでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#65

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

それじゃ練習として再帰で、オセロの(1,1)から(8,8)までのポイントに白を置く関数を書いてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#66

投稿記事 by sadora3 » 11年前

すみません・・・。ヒント下さい・・・。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#67

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

分からないにしても出来る限りのコードを書いてもらえないでしょうか。
ヒントは、今までの内容を見なおして下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#68

投稿記事 by Tatu » 11年前

>>sadora3 さん

softya(ソフト屋) さんの書いた
再帰で、オセロの(1,1)から(8,8)までのポイントに白を置く関数について
どこまで考えられたでしょうか?

(1)この関数を呼び出したとき、どのポイントが白になればよいのでしょうか

(2)この関数の引数はどうなると思いますか

(3)あるポイントに白を置く処理はどう書きますか

(4)あるポイントに白を置いた次のポイントはどう表現しますか

(5)この関数の定義の中でこの関数を呼び出すかどうかをどう判定しますか

たいちう
記事: 418
登録日時: 13年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#69

投稿記事 by たいちう » 11年前

再帰の初歩的な使い方については、自分で考えろというのは酷ではないでしょうか。
階乗やフィボナッチ数列の例しか初心者には見つけられず、
それ以上の使い方を考えだせる人は少数派なのでは?

せめてアルゴリズムを日本語で説明するとかしないと、
知らない人には雲をつかむような話ではないかと思います。

このように私は考えますので、再帰で白を置く関数を書いてみました。
見るかどうかはsadora3さんが判断してください。
► スポイラーを表示

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#70

投稿記事 by sadora3 » 11年前

tatuさん。たいちうさん。ありがとうございます。
tatuさんのヒントを頼りに、たいちうさんのは見ずに頑張ってみようかと思います。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#71

投稿記事 by Tatu » 11年前

>>sadora3 さん
私の書いたことを頼りにするつもりでしたら

(1)この関数を呼び出したとき、どのポイントが白になればよいのでしょうか

についてどう考えているかを書いてください。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#72

投稿記事 by sadora3 » 11年前

全てのマスが白になればいいかと・・・。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#73

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

sadora3 さんが書きました:全てのマスが白になればいいかと・・・。
そういう誤解の余地があるんですね。言葉が足りませんでした。
それでは、ルールを書き加えて(1,1)から(8,8)まで直線で白を置いて下さい。
(1,1),(2,2)・・・・(8,8)と白を置きます。
その他の盤面は何も置いていない状態とします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#74

投稿記事 by sadora3 » 11年前

コード:

WhiteLine(1);

void WhiteLine( int a ){
	if( a==9 ){ return; }
	BanData[ a ][ a ] = SIRO;
	WhiteLine( a+1 );
}
そういうことでしたかw
誤解してすみません。こうでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#75

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

それでOKですよ。
じゃあ、今後のためにx,yは別引数にして、かつ盤面の外側が-1で埋まっていたはずですので、それを判断して止まるように変えてもらえますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#76

投稿記事 by sadora3 » 11年前

出来ました。WALLは#defineで-1に置換しています

コード:

WhiteLine( 1 , 1 );

void WhiteLine( int y , int x ){
             if( BanData[ y ][ x ] == WALL ){ return; }
             BanData[ y ][ x ] = SIRO;
             WhiteLine( y+1 , x+1 );
}

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#77

投稿記事 by ISLe » 11年前

プログラミングのできるひとというのは、日本語でも抽象的な説明ができるひとだと思うんですよね。

経験としての話ですが…
プログラミングに慣れていないひとは、「どこ」と問われたら、具体的にマスの位置を答えようとします。
ひとつのマスに絞れないので結果から求めてしまう。
結果だけを求めているように見える。

プログラミングに慣れているひとは、この程度だと、引数x,yが示すマスを現在注目しているマスとする、とか、現在注目しているマスを引数x,yで示す、とかの設計や実装にあたる作業を無意識に一瞬で済ませてしまいます。
プログラミングに慣れていないひとは、「現在注目しているマス」という考え方からしてできない。
関数原型すら作れず手も足も出ない。

#書いてるうちに進んでた。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#78

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

つづいて、これを改造していきます。
置く色を引数に追加しましょう。SIROの部分をWhiteLineの引数とするわけです。

ISLeさん、ありがとうございます。
やはり、抽象化がネックなんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#79

投稿記事 by sadora3 » 11年前

コード:

WhiteLine( 1 , 1 , 1 );

void WhiteLine( int y , int x , int S ){
	if(BanData[ y ][ x ] == WALL ){ return; }
	BanData[ y ][ x ] = S;
	WhiteLine( y+1 , x+1 , 1 );
}
これであってますか?

追記;すみません。デバックせずに張ってました。修正しました。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#80

投稿記事 by ISLe » 11年前

softya(ソフト屋) さんが書きました:ISLeさん、ありがとうございます。
やはり、抽象化がネックなんでしょうか?
変数で何かを示すという基本的なところですけどね。

そういう意味では、動作が変わらなくても変数名にこだわることが重要かもしれません。
文章のように読める、読み易いコードにも繋がると思います。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#81

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

せっかく引数にしたのに、WhiteLineの再帰呼び出し時に使っていませんね。これを直しましょう。
それとSの引数変数名はSIRO/KUROどちらでも使えるような変数名を考えてみて下さい。
最初の呼び出しもWhiteLine( 1 , 1 , SIRO );とすべきです。

あと今更ですが、WhiteLine( int y , int x ,よりはWhiteLine( int x , int y ,の方が後々混乱しないと思うので今のうちに直しましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#82

投稿記事 by sadora3 » 11年前

コード:

WhiteLine( 1 , 1 , SIRO );

void WhiteLine( int x , int y , int C ){
    if(BanData[ y ][ x ] == WALL ){ return; }
    BanData[ y ][ x ] = C;
    WhiteLine( y+1 , x+1 , C );
}
こうでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#83

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

コードとしてはOKだと思います。
ただ、Cは何かの略だと思いますが変数名として意味がわからないほど短い気がしますね。もっと良い名前を考えてみましょう。

次の改造は斜め以外に対応するために方向を追加しますが、前回苦しんでいるのでx,yの増加分を引数とする形にしようと思います。
y+1 , x+1 の+1をx,yで分けて引数にします。そうすれば、引数を変えるだけで好きな方向に白い線を引くことができますよね。

引数を追加した場合の最初の呼び出し。
WhiteLine( 1 , 1 , 1 , 1 , SIRO ); //右下へ
// いろんなパターン
WhiteLine( 1 , 1 , 1 , 0 , SIRO ); //右へ
WhiteLine( 1 , 1 , 0 , 1 , SIRO ); //下へ
WhiteLine( 4 , 4 , -1 , -1 , SIRO );//左上へ
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#84

投稿記事 by sadora3 » 11年前

コード:

WhiteLine( 1 , 1 , 1 , 1 , SIRO );

void WhiteLine( int x , int y , int Way_x , int Way_y , int Color ){
    if(BanData[ y ][ x ] == WALL ){ return; }
    BanData[ y ][ x ] = Color;
    WhiteLine( x + Way_x , y + Way_y , Way_x , Way_y , Color );
}
出来ました。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#85

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

それじゃ、またまた機能追加で何個置けたか戻り値で返すようにしましょうか。※ 今後のための機能です。
int WhiteLine( int x , int y , int Way_x , int Way_y , int Color, int count )
にしてcountで置けた数を再帰的にカウントアップして、returnで最終的に置けた個数を返しますが、再帰でうまくカウントされるようにしないと行けません。
それを考えてみて下さい。

最初の呼び出しは
int IshiCount = WhiteLine( 1 , 1 , 1 , 1 , SIRO, 0 );//初期のカウントは0個
となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#86

投稿記事 by sadora3 » 11年前

コード:

int IshiCount = WhiteLine( 1 , 1 , 1 , 1 , SIRO, 0 );

int WhiteLine( int x , int y , int Way_x , int Way_y , int Color , int count){
    if(BanData[ y ][ x ] == WALL ){ return count; }
    BanData[ y ][ x ] = Color;
    WhiteLine( x + Way_x , y + Way_y , Way_x , Way_y , Color , count + 1 );
}
こうでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#87

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

おしいですね。エラーになりませんかこれ?
再起した時の戻り値の処理がありませんよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#88

投稿記事 by sadora3 » 11年前

再起した時の戻り値とはなんでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#89

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

再帰におけるWhiteLineの戻り値が処理されていないって事です。
あとプログラムの流れ次第でreturn 値;が無い流れがあるのも問題です。

コンパイラで警句が出るはずなんですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#90

投稿記事 by sadora3 » 11年前

うーん・・・コンパイル時、一瞬「値を返さない~」みたいなメッセージが出てきますが、その後ちゃんと実行されてました。戻り値は4行目のreturn count;があると思うのですが・・・。

Priest
記事: 123
登録日時: 11年前
住所: 愛知

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#91

投稿記事 by Priest » 11年前

sadora3 さんが書きました:

コード:

int IshiCount = WhiteLine( 1 , 1 , 1 , 1 , SIRO, 0 );

int WhiteLine( int x , int y , int Way_x , int Way_y , int Color , int count){
    if(BanData[ y ][ x ] == WALL ){ return count; }
    BanData[ y ][ x ] = Color;
    WhiteLine( x + Way_x , y + Way_y , Way_x , Way_y , Color , count + 1 );
}
こうでしょうか?
処理を追ってみましょう。
WhiteLine( 1 , 1 , 1 , 1 , SIRO, 0 ); BanData[1][1]に白が置かれます
再帰→ WhiteLine( 2 , 2 , 1 , 1 , SIRO, 1 ); BanData[2][2]に白が置かれます
再帰→ WhiteLine( 3 , 3 , 1 , 1 , SIRO, 2 ); BanData[3][3]に白が置かれます
……
再帰→ WhiteLine( 8 , 8 , 1 , 1 , SIRO, 7 ); BanData[8][8]に白が置かれます
再帰→ WhiteLine( 9 , 9 , 1 , 1 , SIRO, 8 ); BanData[9][9]に白を置こうとしますが、BanData[9][9]は壁なので8を返します。

WhiteLine( 8 , 8 , 1 , 1 , SIRO, 7 )の6行目に返ってきました。この返り値をWhiteLine( 7 , 7 , 1 , 1 , SIRO, 6 )に渡してあげたいですが、返り値を返せません。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#92

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

実行はされると思います。警告ですから。

>戻り値は4行目のreturn count;があると思うのですが・・・。

4行目のreturnは、1つ前の関数に戻るだけです。
それ以前には戻りません。

じゃあ、勉強になると思うのでデバッガで4行目でブレークしてF10トステップトレースしてみて下さい。
流れがわかると思います。

「デバッガの使い方」
http://ext-web.edu.sgu.ac.jp/koike/semi/VC2005/c17.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#93

投稿記事 by sadora3 » 11年前

遅れてすみません。

コード:

int WhiteLine( int x , int y , int Way_x , int Way_y , int Color , int count){
	int a;
	if( BanData[ y ][ x ] == WALL ){ return count; }
		BanData[ y ][ x ] = Color;
		a = WhiteLine( x + Way_x , y + Way_y , Way_x , Way_y , Color , count + 1 );
	return a;
}
これであってますか?
デバッガ使うとプログラムの流れが凄くわかりやすくなりますね。
Priestさん回答ありがとうございました。
Priestさんの言っていることが少し理解できませんでしたが、デバッガを使って良く理解出来ました。

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#94

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

okですが、インデントが変です。

コード:

int WhiteLine( int x , int y , int Way_x , int Way_y , int Color , int count){
    int a;
    if( BanData[ y ][ x ] == WALL ){ return count; }
    BanData[ y ][ x ] = Color;
    a = WhiteLine( x + Way_x , y + Way_y , Way_x , Way_y , Color , count + 1 );
    return a;
}
それと安易にaなどと名前をつけるのは止めましょう。

それとこう書く方法もあります。※ 弱点:戻り値をデバッグしにくい。

コード:

int WhiteLine( int x , int y , int Way_x , int Way_y , int Color , int count){
    if( BanData[ y ][ x ] == WALL ){ return count; }
    BanData[ y ][ x ] = Color;
    return  WhiteLine( x + Way_x , y + Way_y , Way_x , Way_y , Color , count + 1 );
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#95

投稿記事 by sadora3 » 11年前

分かりました。変数の名前は何か考えて変えておきます。
次は何をすればよろしいのでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#96

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

ちょっと思い出すのに時間がかかりました。
これで、任意の方向に石を置くだけの処理は出来ましたね。
既に白だけじゃないのでWhiteLine()でなくPutLine()が正しいかもしれませんが名前も考えておいて下さい。
関数名は動詞+名詞を基本とすることがお勧めです。

さて、次は置く場所の盤の状態を見て置くかどうか決める処理を追加します。
本物のオセロなら石をひっくり返すのですが、この場合は上書きしてしまいましょう。
基本的はWALLと同じですが、同じ色なら、違う色なら、空きならの条件を追加しましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#97

投稿記事 by sadora3 » 11年前

コード:

int PutLine( int x , int y , int Way_x , int Way_y , int Color , int count){
	int BackValue;
	if( BanData[ y ][ x ] == WALL ){ return count; }
	else if( BanData[ y ][ x ] != Color ){ BanData[ y ][ x ] =Color; }
	else if( BanData[ y ][ x ] ==Color ){ return count; }
	else if( BanData[ y ][ x ] == BAN ){ return count; }
	BackValue = PutLine( x + Way_x , y + Way_y , Way_x , Way_y , Color , count + 1 );
	return BackValue;
}
こうでしょうか?

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

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#98

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

その順番だとうまく行かないと思います。
テストプログラムを組んで試してみて下さい。
テストプログラムは、今後の動作確認のためにも必要です。

それとBackValueよりBackCountの方が良いですかね。
あるいはRetrunCountとかTotalCountとか。countであると言う意味は残っていたほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
asd
記事: 319
登録日時: 13年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#99

投稿記事 by asd » 11年前

目の前にプログラムを実行し、デバッグする環境があるのですから、
作ってみたものに対してテストデータ(テスト用の盤面データ)を用意し、適当な引数を与えて関数を呼び出せば
自分が想定している動作をしているかどうかすぐに確認できると思います。

softyaさんも指摘していますが、自分で作ったものはまず自分でテストして確認してみましょう。
そのうえで動作がおかしい場合には、
1.想定している動作(こうなってほしい動作)
2.実際の動作(与えたパラメータ、結果)
を添えて質問するようにしないと、回答者のみなさんに公開デバッグをお願いするような形になってしまい
自分の身にならないですよ。

ちなみに、盤面データBanDataの初期化・宣言部分を#ifdefなどで
切り分けてテスト用盤面を用意しておくと、今後デバッグ、テストをするうえで
楽になりますよ^^

コード:

#ifdef DEBUG
//テスト用初期盤面
static int BanDate[10][10]={
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {-1,0,1,1,1,1,1,1,1,-1},
    {-1,2,1,0,0,0,0,0,2,-1},
    {-1,2,0,1,0,0,0,0,2,-1},
    {-1,2,0,0,1,2,0,0,2,-1},
    {-1,2,0,0,2,1,0,0,2,-1},
    {-1,2,0,0,0,0,1,0,2,-1},
    {-1,2,0,0,0,0,0,1,2,-1},
    {-1,2,1,1,1,1,1,1,0,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
};
#else
//初期盤面
static int BanDate[10][10]={
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {-1,0,0,0,0,0,0,0,0,-1},
    {-1,0,0,0,0,0,0,0,0,-1},
    {-1,0,0,0,0,0,0,0,0,-1},
    {-1,0,0,0,1,2,0,0,0,-1},
    {-1,0,0,0,2,1,0,0,0,-1},
    {-1,0,0,0,0,0,0,0,0,-1},
    {-1,0,0,0,0,0,0,0,0,-1},
    {-1,0,0,0,0,0,0,0,0,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
};
#endif
こうしておくとプロプロセッサ(ビルドオプション)でDEBUGというシンボルが定義(#define DEBUGでも可)されているときは、初期盤面がテスト用の盤面に置き換わります。
本当の初期盤面からテストすると望んだ状況を作るのは難しいので、こういう方法で考えられる石の配置を自分で用意して
それにたいして関数を呼び出して望んだ動作をしてくれるか確認するといいですよ。

ちなみに上のテスト盤面では左上は白も黒も1個も取れない場所、右下は白も黒も裏返すことができる場所になっています。
Advanced Supporting Developer
無理やりこじつけ(ぉ

sadora3
記事: 175
登録日時: 11年前

Re: オセロで、石を反転する範囲の捜索の仕方がわかりません

#100

投稿記事 by sadora3 » 11年前

うーん・・・。何をすればいいのか分からなくなってきました。
「置く場所の盤の状態を見て置くかどうか決める処理」とはなんでしょうか?
この処理は何が出来るようになるのでしょうか?
asdさんのテスト用の盤面の左上からどちらも裏返せますか?

それと公開デバッグみたいになっていてすみませんでした。

閉鎖

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