J'essaye de créer un jeu de tic tac toe en C ++. J'essaie d'utiliser un tableau 2d char pour construire la carte, mais lorsque mon code ci-dessous va être compilé, j'obtiens une erreur error: can't convert '
Voici le code:
. . . . . . . . .
Si j'ajoute le bloc suivant à main (et ajustez d'autres choses):
char grid[3][3] = { {'.', '.', '.'},
{'.', '.', '.'},
{'.', '.', '.'}};
for (int i =0; i < 3; i ++){
for (int j =0; j < 3; j++){
cout << grid[i][j] << " ";
} //end inner j for
cout << endl;
} // end outer i for
J'obtiens le résultat attendu de:
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
// Player Class
class Player
{
public:
explicit Player(string name){
this->name = name;
}
string getName(){
return name;
}
string setName(string newname){
name = newname;
}
int generateRowMovement(){
int row = rand() % 2; // Random number between 0 and 2
return row;
}
int generateColMovement(){
int col = rand() % 2; // Random number between 0 and 2
return col;
}
int placeMove(){
int rowMove, colMove;
rowMove = rand() % 2;
colMove = rand() % 2;
return rowMove, colMove;
}
private:
string name;
};
//Board Class
class Board
{
public:
explicit Board(){
this->state[3][3] = {
{'.', '.', '.'},
{'.', '.', '.'},
{'.', '.', '.'}}
} // end board
void printBoard(char state[3][3]){
for (int i =0; i < 3; i ++){
for (int j =0; j < 3; j++){
cout << state[i][j] << " ";
}
cout << endl;
}
} //end printboard
void printBoard(){
for (int i =0; i < 3; i ++){
for (int j =0; j < 3; j++){
cout << this->state[i][j] << " ";
} //end inner j for
cout << endl;
} // end outer i for
} //end printboard
private:
char state[3][3];
};
int main(){
// Player Tony("Tony");
// cout << Tony.getName();
Player Tony("Tony");
Board game();
cout << Tony.getName() << endl;
Tony.setName("Bob");
cout << Tony.getName() << endl;
int currRow, currCol;
currRow = Tony.generateRowMovement();
currCol = Tony.generateColMovement();
cout << currRow << currCol << endl;
return 0;
} //end main
Pourquoi ne puis-je pas définir la valeur par défaut construction de cet objet un tableau [3] [3] char comme ci-dessus?
3 Réponses :
L'initialisation d'accolades de tableau ne fonctionne que lors de la déclaration d'un tableau.
Si vous utilisez C ++ 1x, essayez d'ajouter l'instruction d'initialisation {...} à la déclaration de membre:
std::fill (&state[0][0], &state[3][3], '.'); std::fill_n(&state[0][0], sizeof(state)/sizeof(state[0][0]), '.');
Vous pouvez également remplir le tableau en utilisant std :: fill ou std::fill_n:
private:
char state[3][3] = {...};
De cette façon, je ne pourrais jamais modifier la valeur, non, car elle est privée?
@JerryM. Il est déjà privé dans votre code. Privé signifie qu'il n'est pas accessible en dehors de la classe, mais qu'il peut être accédé par des méthodes de classe (comme vous le faites)
this-> state [3] [3] = {...} n'est pas une affectation valide. Vous ne pouvez pas attribuer de tableaux de cette façon. Et l'initialisation d'accolades ne fonctionne que dans une déclaration, pas dans une affectation. Votre constructeur de Board doit utiliser des boucles pour remplir le membre state :
explicit Board(){
for (int i =0; i < 3; i ++){
for (int j =0; j < 3; j++){
state[i][j] = '.';
}
}
}
state [i] [j] << '.' ou state [i] [j] == '.' ?
Pourquoi ne puis-je pas faire de la construction par défaut de cet objet un [3] [3] tableau de caractères comme ci-dessus?
Oui, vous pouvez.
explicit Board() : state({ {'.', '.', '.'}, {'.', '.', '.'}, {'.', '.', '.'}}) { } // end board
this-> state [3] [3] =est une instruction d'affectation de variable, vous ne pouvez pas utiliser d'accolade liste jointe. Mais vous pouvez l'utiliser dans le constructeur.
Votre constructeur de carte doit utiliser des boucles pour remplir l'état membre. Pouvez-vous donner un exemple? Si vous ne pouvez pas le dire, je suis assez nouveau en C ++. Je ne sais pas comment faire.N'utilisez pas
randen C ++. Il est officiellement connu comme un RNG de basse qualité. Utilisez plutôtstd :: uniform_int_distribution. Essayez également d'éviterd'utiliser l'espace de noms std;car cela est considéré comme une mauvaise pratique et causera de sérieux problèmes. Voir Pourquoi "using namespace std;" considéré comme une mauvaise pratique?Vous avez un deuxième problème dans votre code: je ne pense pas que votre fonction
Player :: placeMovefasse ce que vous pensez qu'elle fait. Il semble que vous vouliez renvoyer une paireligne, col, mais ce n'est pas ce qui se passe là-bas. Voir ici pour plus d'informations sur l'opérateur virgule: stackoverflow.com/questions/52550/… ou fr. cppreference.com/w/cpp/language/... (les deux disent la même chose, juste dans des styles différents).Si vous voulez renvoyer une ligne, une paire de col, alors changez pour fonctionner comme ceci:
pair placeMove () {... return make_pair (rowMove, colMove); } , puis utilisez-le comme ceci:auto b = Tony.placeMove (); cout << b.first << "," << b.second << endl;. Je pense que cela vous donnera ce que vous recherchez.Je me posais la question. Comment pourrais-je utiliser cette paire pour placer un marqueur, disons «X», sur le tableau
char [3] [3]?