0

私はC++プログラミングの初心者であり、AlexAllainによるJumpinginto C ++と呼ばれるこの本をフォローしています。この本には三目並べの演習があり、その演習を完了するのに苦労しています。これは、2d配列に格納されるXまたはO値を入力するようにユーザーに促すことです。たとえば、char Xが配列に3回出現したかどうかを追跡したいので、これまではcounter ++を使用しましたが、増分は1回だけです。以下は、これまでに行ったことのソースです。これにより、質問がより明確になり、コードの構造や機能などのコードの外観に関して、私がどのように行っているかがわかります。

#include "stdafx.h"
#include "iostream"
#include "string"

using namespace std;

void display_array(char array[][3]);
void check_input(char array[][3], int input);
void check_winner(char array[][3]);
int check_x(char array[][3]);
int check_o(char array[][3]);

int _tmain(int argc, _TCHAR* argv[])
{
    char array[3][3];
    int counter = 0;

    for(int row = 0; row < 3; row++){

        cout << "\n";

        for(int col = 0; col < 3; col++){
            counter++;
            array[row][col] = counter;
        }
    }

    display_array(array);

    system("PAUSE");
    return 0;
}

void display_array(char array[][3]){

    int position_input;
    string symbol_input;

    do{

    for(int i=0; i < 3; i++){

        for(int j=0; j < 3; j++){
            cout << " [ ";
            cout << array[i][j];
            cout << " ] ";
        }
        cout << "\n";
    }

    cout << "Position: ";
    cin >> position_input;

    check_input(array, position_input);


    }while(position_input != 0);
} 

void check_input(char array[][3], int input)
{
    char user_input = input;

    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            if(user_input == array[i][j])
            {
                cout << "array[" << i << "][" << j << "] replace with: ";
                cin >> array[i][j];

            }   

        }
    }
    check_winner(array);
}
void check_winner(char array[][3]){
    cout << check_x(array);

    if(check_x(array) == 3){
        cout << check_x(array);
    }

    else if(check_o(array) == true){
        cout << "o";
    }

}
int check_x(char array[][3]){
    int counter, x[3];
    counter = 0;

    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            if(array[i][j] == array[i][j]){
                counter++;
            }
            x[i] = counter;
            return x[i];
        }
    }

}
int  check_o(char array[][3]){

    int counter;
    counter = 0;

    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            if(array[i][j] == 'o'){
                counter++;
                return counter;
            }else{
                return counter;
            }
        }
    }
}
4

2 に答える 2

2

あなたにはたくさんの小さな問題がありますが、最も直接的な問題はこの種のもののようです:

for(int i = 0; i < 3; i++){
    for(int j = 0; j < 3; j++){
        if(array[i][j] == 'o'){
            counter++;
            return counter;
        }else{
            return counter;
        }
    }
}

テストされた要素が「o」であるかどうかに関係なく、1つのループの後に戻ります。次のように変更します。

for(int i = 0; i < 3; i++){
    for(int j = 0; j < 3; j++){
        if(array[i][j] == 'o')
            counter++;
    }
}

return counter;
于 2012-12-22T00:28:21.217 に答える
0

私の答え:

最初の質問の最後の部分:コーディングは良さそうです。プログラムが非常に説得力のあるものであっても、いくつかの操作についてコメントしていただければ幸いです(// / * * /)。

私の意見では、あなたの質問は、演習を解決するという点で少し誤解を招くものです。最初は同じようにあなたのやり方を考えました。問題は、パターンが誤ったチェックパターンを許可するため、パターンが3の頻度で検出されるだけではないことです。視覚化するには:

7 8 9
4 5 6
1 2 3

1、2、5、9 6 5のような3の頻度は正解ではありませんが、-159は正解です。そして、すべての周波数パターンを計算したとしても、私のソリューションの次のブログで定義されている、私が見つけたソリューションよりもはるかに多くのコーディングになります。

    status_check = possibilities(field,player,2,0,1,1,0,2); //diagonal 1 5 9
    status_check = possibilities(field,player,0,0,1,1,2,2); //diagonal 7 5 3
    status_check = possibilities(field,player,0,0,1,0,2,0); //vertical 7 4 1
    status_check = possibilities(field,player,0,1,1,1,2,1); //vertical 8 5 2
    status_check = possibilities(field,player,0,2,1,2,2,2); //vertical 9 6 3
    status_check = possibilities(field,player,0,0,0,1,0,2); //horizontal 7 8 9
    status_check = possibilities(field,player,1,0,1,1,1,2); //horizontal 4 5 5
    status_check = possibilities(field,player,2,0,2,1,2,2); //horizontal 1 2 3

*それが私がnumパッドでプレイできるエクササイズを考え出した方法です(私はそのコードを本当に誇りに思っています。:-))

ちなみに私はその本が大好きですが、残念ながらそれを理解できませんでした。「ボーナス:グリッド全体がいっぱいになる前にどちらの側でもゲームに勝てないかどうかをプログラムに検出させることができますか?」しかし、誰かがその章を飛び越えた場合-この解決策は確かに役立ちます:*

演習は次のようになります(121ページ、Cppにジャンプ)。

2人のプレーヤーが三目並べを競争的にプレイできるようにする小さな三目並べプログラムを作成します。プログラムは、どちらかのプレーヤーが勝ったかどうか、またはボードが完全にいっぱいになっているかどうか(ゲームが引き分けで終了するかどうか)を確認する必要があります。ボーナス:グリッド全体がいっぱいになる前にどちらの側でもゲームに勝てないかどうかをプログラムに検出させることができますか?

次のコードは、c ++ 17標準で簡単にコンパイルおよび実行でき、すべてのライブラリはgcc(GCC)8.2.1で使用できる必要があります。

#include <iostream>
#include <string>
#include <limits> //just for the input validation

using namespace std;

int input_check(char field[3][3],char player);
void display_field(char field[3][3],int size);
void initialize_field(char field[3][3],int size,char player);
string win_check(char field[3][3],char player,int size);
int code(char field[3][3],int i,int j,char player);
int possibilities(char field[3][3],char player,int a,int aa,int b,int bb,int c,int cc);

int main()
{
  char field[3][3];
  int size = 3;
  char player ='-';

  initialize_field(field,size,player);
  display_field(field,size);

  while (field[0][0]!='w')
    {
      player = 'X';
      input_check(field,player);
      system("clear");
      display_field(field,size);
      cout << win_check(field,player,size);

      if (field[0][0] =='w')
      {
        cout << endl;
        break;
      }
      player = 'O';
      input_check(field,player);
      system("clear");
      display_field(field,size);
      cout << win_check(field,player,size);

      if (field[0][0] =='w')
      {
        cout << endl;
        break;
      }
    }
return 0;
}


void initialize_field(char field[3][3],int size,char player)
{
  int i,k;
  for (i = 0; i < size; i++)
    {
      for (k = 0; k < size; k++)
        {
          field[i][k]= player;
        }
    }
}

int input_check(char field[3][3],char player)
{
  int input = 0;
  bool def = false;
  while (def != true)
  {
    while(!(cin >> input))
      {  //check the Input format for integer the right way
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Invalid input.  Try again: ";
      }
    switch (input)
    {
      case 1:{
        def = code(field,2,0,player);
        break;}
      case 2:{
        def = code(field,2,1,player);
        break;}
      case 3:{
        def = code(field,2,2,player);
        break;}
      case 4:{
        def = code(field,1,0,player);
        break;}
      case 5:{
        def = code(field,1,1,player);
        break;}
      case 6:{
        def = code(field,1,2,player);
        break;}
      case 7:{
        def = code(field,0,0,player);
        break;}
      case 8:{
        def = code(field,0,1,player);
        break;}
      case 9:{
        def = code(field,0,2,player);
        break;}
      default:{
        cout << "Invalid input.  Try again: " << endl;
        break;}
    }
  }
/*
7 8 9   00 01 02
4 5 6   10 11 12
1 2 3   20 21 22
*/
  return input;
}

int code(char field[3][3],int i,int j,char player)
{
  int def=0;
  if (field[i][j]=='-')
    {
      field[i][j]=player;
      def = true;
    }
  else
    {
      cout << "Invalid input.  Try again: " << endl;
    }
  return def;
}

void display_field(char field[3][3],int size)
{
  int i,k;
  for (i = 0; i < size; i++)
    {
      for (k = 0; k < size; k++)
        {
          cout << field[i][k];
          cout << " ";
            if (k==2) //seperate with new line after the third k
              {
                cout << endl;
              }
        }
    }
}

string win_check(char field[3][3],char player,int size)
{
  string status;
  int status_check;

  /*
  7 8 9   00 01 02
  4 5 6   10 11 12
  1 2 3   20 21 22
  */

  if ((field[0][0]!='-')&&(field[0][1]!='-')&&(field[0][2]!='-') &&(field[1][0]!='-')&&(field[1][1]!='-')&&(field[1][2]!='-')&&(field[2][0]!='-')&&(field[2][1]!='-')&&(field[2][2]!='-'))
    {
      status = "Rien ne va plus - Nichts geht mehr meine Lieben. Unentschieden";
      field[0][0]='w';
    }

    status_check = possibilities(field,player,2,0,1,1,0,2); //diagonal 1 5 9
    status_check = possibilities(field,player,0,0,1,1,2,2); //diagonal 7 5 3
    status_check = possibilities(field,player,0,0,1,0,2,0); //vertical 7 4 1
    status_check = possibilities(field,player,0,1,1,1,2,1); //vertical 8 5 2
    status_check = possibilities(field,player,0,2,1,2,2,2); //vertical 9 6 3
    status_check = possibilities(field,player,0,0,0,1,0,2); //horizontal 7 8 9
    status_check = possibilities(field,player,1,0,1,1,1,2); //horizontal 4 5 5
    status_check = possibilities(field,player,2,0,2,1,2,2); //horizontal 1 2 3

    if (status_check == true)
    {
      status = "Player " + string(1, player) + " won!!";
      field[0][0] ='w';
    }
return status;
}

int possibilities(char field[3][3],char player,int a,int aa,int b,int bb,int c,int cc)
{
  int status;

  if ((field[a][aa]==player)&&(field[b][bb]==player)&&(field[c][cc]==player))
  {
    status = true;
  }


  return status;
}
于 2019-03-30T18:21:07.313 に答える