![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
三目並べのプログラムで、以下のようなコンピュータの思考ルーチンを作っている所なのですが、
/* 後手で先手に初めに真ん中に置かれたら角に置く */
/* 後手で先手に初めに角に置かれたら真ん中に置く */
この二つがうまくいかないようで困っています。どこか間違っているのでしょうか?
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;
}
No.1ベストアンサー
- 回答日時:
totalの初期値が設定されていないからでは?
/* 後手で先手に初めに真ん中に置かれたら角に置く */
の部分もおかしかったことに気づきました。ありがとうございます。
/* 後手で先手に初めに角に置かれたら真ん中に置く */
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;
}
}
でしたね。角に置く場所はできればランダムにしたいのですが……。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 インストールしたてのVirtualBoxの仮想マシンにDHCPで割り振られるIPアドレスにつきまして 1 2023/05/03 14:46
- 国産車 エンジンスターター 2 2023/03/11 00:24
- Excel(エクセル) VBA ふたつの同じ様式シートのセルをコピーしたい 2 2023/03/08 15:28
- スペイン語 スペイン語でpor si no lo saben,de eso esta hecha la vida 3 2022/06/17 00:14
- 宗教学 モーツァルトのレクイエムは誰に捧げたもの? 2 2023/02/09 09:30
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- 情報・ワイドショー 「アインシュタイン 科学者たちの罪と勇気」 1 2022/04/12 19:09
- フランス語 フランス語 vous avez une semaine pour vous décider. 1 2022/07/05 04:33
- 教育・ドキュメンタリー NHKスぺ「ビルマ 絶望の戦場」は映画化されないでしょうか? 1 2022/08/16 23:10
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラー Run-Time Check Failur...
-
Win32でシリアル通信
-
エディットボックスの背景の色...
-
C++のcase文の書き方
-
リソースファイルの結合ができない
-
C言語win32api、エディットボッ...
-
音量調節
-
PeekMessageについて
-
Win32APIでウィンドウを中央に...
-
不思議な現象が起こるプログラ...
-
ファンクションキー制御?
-
#define _CRT_SECURE_NO_WARNIN...
-
プログラミング初心者です。 Py...
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
Enterキーを押されたら次の処理...
-
C言語での引数の省略方法
-
既定のコンストラクタがありま...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Win32APIでウィンドウを中央に...
-
エラー Run-Time Check Failur...
-
コンソールアプリケーションの...
-
MessageBoxについて
-
画像を表示したいのですが……
-
【Windowsアプリ】ファイルのド...
-
PeekMessageについて
-
キャレットの現在位置の表示 (W...
-
C言語win32api、エディットボッ...
-
ボタンの色(WINAPI)
-
Win32APIにて、ウィンドウ全体...
-
音量調節
-
エディットコントロール入力時...
-
ダイアログプログラムでEnterキ...
-
不明なエラー
-
C++のcase文の書き方
-
オーバーレイみたいな処理がしたい
-
ゲームとかの解像度変更&全画...
-
WM_CREATE について
-
LoadImageとSetCursorについて
おすすめ情報