dポイントプレゼントキャンペーン実施中!

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

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

A 回答 (2件)

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2012/02/10 14:52

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

この回答への補足

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

補足日時:2012/02/10 14:51
    • good
    • 0
この回答へのお礼

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

/* 後手で先手に初めに角に置かれたら真ん中に置く */
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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!