質問: 0){ //数値がとれなかったらバッファをクリアする if(turnplayer==human){ cout<<"その入力は行えません"; }continue; } //数値が範囲内か確認 if(place < 11 || place > 88){ if(turnplayer==human){ cout<<"そこには置けません"< 8 || y > 8){ if(turnplayer==human){ cout<<"input"< w){ cout<<"●の勝利です!\n"; }else if(b < w) { cout<<"○の勝利です"; }else{ cout<<"引き分けです"; } } int main(){ //ゲームの準備 cout<<"オセロ"<
回答: ### 取得できる最大の枚数が異常な理由 このプログラムでは、`reverse` 関数において全てのマスを調べつつ、各マスについて8方向それぞれに対して裏返せるかチェックしています。その際、`number` 関数において裏返せる枚数をチェックすると共に、変数 `flip_max` にその枚数の最大値を記録しています。 注意すべきは、`number` 関数は各方向ごとに呼び出されているため、ある一方向のみに裏返せる最大値が計算されているところです。実際に取得したいのは、8方向全てについての裏返せる枚数の和であるはずです。このため、関数の設計を変えて、8方向すべての `flipno` を足したものの最大値を計算させるようにする必要があります。 ### 補足 その他、蛇足かもしれませんが気になったことを少し補足しておきます。本題のバグが直ったら読んでください。 * コンパイル時に出てくるエラーや警告をきちんと読む癖をつけた方が良さそうです。今のプログラムでも環境によっては動くでしょうが、以下のように微妙な点があります。 + 配列 `vec_tate` と `vec_yoko` を定義しているところで、型が書かれていません。 + (これはコードをここへ投稿する際に起こったことかもしれませんが)コードの行末尾とコメントの間に全角スペース が紛れ込んでいます。これは半角スペース と見分けがつきにくく、しかもエラーを生むので、注意してください。エディタによっては設定を変えることで全角スペースを他と見分けやすくすることができるので、そうしておくと良いです。 + 現在の C++ では、`cout` や `endl` を、`std::cout` や `std::endl` と書く方が良いです。これは名前空間と言って、`std` という名前空間の中にある `cout` や `endl` を意味しています。次の項目とも関係するため、合わせてお読みください。 (`using namespace std;` を使って名前空間を省略できるようにする書き方もあるのですが、慣れるまでは `std::` をつけて書いた方が良いと思います。) * `#include ` のように .h をつけて `#include` するのは C++ では古い方法です。C++ のヘッダファイルを読み込む際は `#include ` とします。しかも今回の場合、`#include` しているヘッダに C++ のものと C のものが混ざっており、更に分かりにくいことになっています。新しく書き直すと、以下のようになります。 ``` #include #include #include #include #include #include ``` c から始まっているファイルは C 言語のヘッダファイルとほぼ同じものです。たとえば `cstdio` は `stdio.h` とほぼ同じものです (ほんの少し違いがあるのですが、とりあえずは問題ないでしょう)。 + ところで `cstdio` は `scanf` 関数や `printf` 関数を C++ で使うために必要ですが、今回のプログラムでは `iostream` で定義されている `std::cin` と `std::cout` しか使っていないため、`#include ` という行自体を削除しても大丈夫です。 + C++ の教科書ではたまに、std 名前空間の説明を省略するために `iostream.h` を使うことがあります。しかし最近の環境だとそもそも `iostream.h` 自体が存在しなかったりするため、これを使うのはやめたほうが良いでしょう。ただしこのことはオセロプログラムの本質とは関係ないため、とりあえず今はこのまま作り、後でもう一回ここに戻ってくるというのでも大丈夫だと思います。 * 不必要にグローバルで定義されている変数があります。たとえば `flipno` は `number` 関数の中でしか使われていないため、`number` 関数のローカル変数にするのが良いでしょう。こうすることでプログラムの流れが読みやすくなり、また、考えてもいなかった場所で勝手にその変数が書き換わることを予防できます。 * コードが適切にインデントできていない場所がところどころあります。コードをより読みやすくするためにも、インデントを正しくつけることを徹底した方が良いでしょう。 * `input` 関数の中で入力がちゃんとした座標値であるか2度チェックしていますが、2回目だけあれば充分です。`place` を10で割った数が1以上8以下で、`place` の1桁目が1以上8以下ならば、`place` は11以上88以下であるからです。 これらについて調べてみても何か分からない点があれば、是非新しく質問してください。