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;
}
No.2ベストアンサー
- 回答日時:
最初のほうしか見ていませんが、検索結果sumの要素が28しかないのは何故ですか? 単純に考えて64だと思いますが(最初に4個駒を配置しているなら60でもよいですが)。
もしもkが28を超えた場合はスタックを破壊するので何が起きても不思議ではありません。またバグとは関係ありませんが、for文が嫌いですか? 個人的には固定ループならwhile文より見やすいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
複数桁10進数の*桁目だけを抽出...
-
systemの戻り値を取得する方法
-
PowerShellがうまくいかない
-
std::set<int> で、ある値が何...
-
c言語
-
式は定数値が必要です」という...
-
C言語で行列の積を計算できるよ...
-
変数名を引数として渡す、アド...
-
C++ でカンマ "," で区切られた...
-
if と配列の組み合わせ
-
C++で作ったDLLをC#で使うには?
-
C言語についてなんですが
-
ラップ関数とはどんなものですか?
-
VC#2005で逆さ文字を表示する
-
「{ } で囲むだけ」は正しい?
-
C言語のファイル入力が分かりま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
system関数がうまくいかない
-
(int *)の意味
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
C言語初心者です、、、お助けく...
-
std::set<int> で、ある値が何...
-
PowerShellがうまくいかない
-
read関数をノンブロッキングで...
-
ColorをRGBで指定する方法
-
(マルチスレッド)_beginthrea...
-
数字列を3桁ごとにカンマで区切...
-
C言語で分からないところがあり...
おすすめ情報