プロが教える店舗&オフィスのセキュリティ対策術

C++でオセロのCPUの処理を考えたのですが、40手目あたりからうまくいきません。ReverseOthello関数の石を探して裏返す処理がおかしいと思われます。一番裏返せる石が多い位置を裏返すという処理をしています。プログラミング経験が豊富な方よろしくお願いします。

#include "stdafx.h"
bool Othello(int (*pBoard)[8] ){
int i;
int j;
int ans;
int k = 0;
int num[3] = {0,0,0};
int sum[28][3];
i = 0;
while(i < 28){
j = 0;
while(j < 3){
sum[i][j] = 0;
j++;
}
i++;
}
i = 0;
while(i < 8){
j= 0;
while(j < 8){
if(pBoard[i][j] == 0){
ans = SeachStone(i,j,pBoard);
if(ans != 0){
sum[k][0] = i;
sum[k][1] = j;
sum[k][2] = ans;
k++;
}
}
j++;
}
i++;
}
i = 0;
while(i < 28){
if(num[2] < sum[i][2]){
num[0] = sum[i][0];
num[1] = sum[i][1];
num[2] = sum[i][2];
}
i++;
}
if(num[2] == 0){
return false;
}
ReverseStone(num[0],num[1],pBoard);
return true;
}
void ReverseStone(int y1,int x1,int (*pBoard)[8]){
int cnt = 0;
int y2;
int x2;
int i;
int j;
int k;
if(y1 == 0){
i = 0;
}
else {
i = y1-1;
}
while(i < y1 + 2){
if(x1 == 0){
j = 0;
}
else {
j = x1-1;
}
while(j < x1 + 2){
y2 = i;
x2 = j;
cnt = 0;
while(pBoard[y2][x2] == -1){
y2 = y2 + (i - y1);
x2 = x2 + (j - x1);
cnt++;
}
if(pBoard[y2][x2] == 1&& cnt != 0){
k = 0;
while(k < cnt + 1){
y2 = y2 + (y1 - i);
x2 = x2 + (x1 - j);
pBoard[y2][x2] = 1;
printf("%d\n",pBoard[y2][x2]);
k++;
}
}
j++;
}
i++;
}
}
int SeachStone(int y1,int x1,int (*pBoard)[8]){
int cnt = 0;
int sumCnt = 0;
int y2;
int x2;
int i;
int j;
if(y1 == 0){
i = 0;
}
else {
i = y1-1;
}
while(i < y1 + 2){
if(x1 == 0){
j = 0;
}
else {
j = x1-1;
}
while(j < x1 + 2){
y2 = i;
x2 = j;
cnt = 0;
while(pBoard[y2][x2] == -1){
y2 = y2 + (i - y1);
x2 = x2 + (j - x1);
cnt++;

}
if(pBoard[y2][x2] == 1&& cnt != 0){
sumCnt = sumCnt + cnt;
}
j++;
}
i++;
}
return sumCnt;
}

A 回答 (2件)

最初のほうしか見ていませんが、検索結果sumの要素が28しかないのは何故ですか? 単純に考えて64だと思いますが(最初に4個駒を配置しているなら60でもよいですが)。

もしもkが28を超えた場合はスタックを破壊するので何が起きても不思議ではありません。

またバグとは関係ありませんが、for文が嫌いですか? 個人的には固定ループならwhile文より見やすいと思います。
    • good
    • 0

コメントが全くないソースコードを読み取るのは、


正直なところ厳しいです。
    • good
    • 0

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