こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

[C言語]三目並べ

三目並べのプログラムで、以下のようなコンピュータの思考ルーチンを作っている所なのですが、
/* 後手で先手に初めに真ん中に置かれたら角に置く */
/* 後手で先手に初めに角に置かれたら真ん中に置く */
この二つがうまくいかないようで困っています。どこか間違っているのでしょうか?

void com( char te )
{
int total,kado,aite,a,tate,yoko,ok = 0;

/*
0 = 空 te = 1(○) → aite = 2(×)
1 = ○ te = 2(×) → aite = 1(○)
2 = ×
*/
/* 勝てる場所を探す */
for ( tate = 0; tate < 3; tate++ ) { /* 横一列 */
if( brd[tate][0] == 0 && brd[tate][1] == te && brd[tate][2] == te ) {
brd[tate][0] = te;
return;
}
if( brd[tate][0] == te && brd[tate][1] == 0 && brd[tate][2] == te ) {
brd[tate][1] = te;
return;
}
if( brd[tate][0] == te && brd[tate][1] == te && brd[tate][2] == 0 ) {
brd[tate][2] = te;
return;
}
}
for ( yoko = 0; yoko < 3; yoko++ ) { /* 縦一列 */
if( brd[0][yoko] == 0 && brd[1][yoko] == te && brd[2][yoko] == te ) {
brd[0][yoko] = te;
return;
}
if( brd[0][yoko] == te && brd[1][yoko] == 0 && brd[2][yoko] == te ) {
brd[1][yoko] = te;
return;
}
if( brd[0][yoko] == te && brd[1][yoko] == te && brd[2][yoko] == 0 ) {
brd[2][yoko] = te;
return;
}
}
if( brd[0][0] == 0 && brd[1][1] == te && brd[2][2] == te ) { /* 斜め1 */
brd[0][0] = te;
return;
}
if( brd[0][0] == te && brd[1][1] == 0 && brd[2][2] == te ) {
brd[1][1] = te;
return;
}
if( brd[0][0] == te && brd[1][1] == te && brd[2][2] == 0 ) {
brd[2][2] = te;
return;
}
if( brd[0][2] == 0 && brd[1][1] == te && brd[2][0] == te) { /* 斜め2 */
brd[0][2] = te;
return;
}
if( brd[0][2] == te && brd[1][1] == 0 && brd[2][0] == te) {
brd[1][1] = te;
return;
}
if( brd[0][2] == te && brd[1][1] == te && brd[2][0] == 0) {
brd[2][0] = te;
return;
}

/* 相手の勝ちを阻止する */

aite = te % 2 + 1;
for ( tate = 0; tate < 3; tate++ ) { /* 横一列 */
if( brd[tate][0] == 0 && brd[tate][1] == aite && brd[tate][2] == aite){
brd[tate][0] = te;
return;
}
if( brd[tate][0] == aite && brd[tate][1] == 0 && brd[tate][2] == aite){
brd[tate][1] = te;
return;
}
if( brd[tate][0] == aite && brd[tate][1] == aite && brd[tate][2] == 0){
brd[tate][2] = te;
return;
}
}
for ( yoko = 0; yoko < 3; yoko++ ) { /* 縦一列 */
if( brd[0][yoko] == 0 && brd[1][yoko] == aite && brd[2][yoko] == aite){
brd[0][yoko] = te;
return;
}
if( brd[0][yoko] == aite && brd[1][yoko] == 0 && brd[2][yoko] == aite){
brd[1][yoko] = te;
return;
}
if( brd[0][yoko] == aite && brd[1][yoko] == aite && brd[2][yoko] == 0){
brd[2][yoko] = te;
return;
}
}
if( brd[0][0] == 0 && brd[1][1] == aite && brd[2][2] == aite){ /* 斜め1 */
brd[0][0] = te;
return;
}
if( brd[0][0] == aite && brd[1][1] == 0 && brd[2][2] == aite ) {
brd[1][1] = te;
return;
}
if( brd[0][0] == aite && brd[1][1] == aite && brd[2][2] == 0 ) {
brd[2][2] = te;
return;
}
if( brd[0][2] == 0 && brd[1][1] == aite && brd[2][0] == aite){ /* 斜め2 */
brd[0][2] = te;
return;
}
if( brd[0][2] == aite && brd[1][1] == 0 && brd[2][0] == aite) {
brd[1][1] = te;
return;
}
if( brd[0][2] == aite && brd[1][1] == aite && brd[2][0] == 0) {
brd[2][0] = te;
return;
}

/* 後手で先手に初めに角に置かれたら真ん中に置く */
if ( te == 2 ) {
for ( a = 0; a < 9; a++ ) {
total += brd[a/3][a%3];
}
kado = brd[0][0] + brd[0][2] + brd[2][0] + brd[2][2];
if ( total == 1 && kado ==1){
brd[1][1] = te;
return;
}
}

/* 後手で先手に初めに真ん中に置かれたら角に置く */
if ( te == 2 ) {
for ( a = 0; a < 9; a++ ) {
total += brd[a/3][a%3];
}
if ( total == 1 && brd[1][1] == aite){
brd[0][0] = te;
return;
}
}


/* ランダム */
srandomdev();
do {
a = random() % 9;
tate = a/3;
yoko = a%3;
if ( brd[tate][yoko] == 0 ) {
ok = 1;
}
} while ( ok == 0 );

/* 盤面に書き込み */
brd[tate][yoko] = te;
}

投稿日時 - 2012-02-09 18:02:49

QNo.7295426

困ってます

質問者が選んだベストアンサー

totalの初期値が設定されていないからでは?

投稿日時 - 2012-02-09 18:34:13

お礼

うっかり見逃していました。ありがとうございます!

投稿日時 - 2012-02-10 14:52:25

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

変数totalの用途を教えてください。

投稿日時 - 2012-02-09 19:25:29

補足

totalは手数を判断するためのものです。

投稿日時 - 2012-02-10 14:51:48

お礼

/* 後手で先手に初めに真ん中に置かれたら角に置く */
の部分もおかしかったことに気づきました。ありがとうございます。

/* 後手で先手に初めに角に置かれたら真ん中に置く */
if ( te == 2 ) {
for ( a = 0; a < 9; a++ ) {
total += brd[a/3][a%3];
}
kado = (brd[0][0] + brd[0][2] + brd[2][0] + brd[2][2]);
if ( total == 1 && kado ==1){
brd[1][1] = te;
return;
}

/* 後手で先手に初めに真ん中に置かれたら角に置く */
else if ( total == 1 && brd[1][1] == aite){
brd[0][0] = te;
return;
}
}

でしたね。角に置く場所はできればランダムにしたいのですが……。

投稿日時 - 2012-02-10 15:03:04

あなたにオススメの質問