Witam,
W celu przećwiczenia wykorzystywania wskaźników i referencji postanowiłam napisać prostą grę w konsoli (wisielec). Gra jest prawie skończona jednak kompilator pokazuje mi 2 błędy:
- "error invalid type 'const char[int]' for array subscript"-
zwracam się o pomoc, ponieważ zupełnie nie wiem w czym popełniłam błąd- stworzyłam wskaźnik (const char*secretPhrase) na tablicę znaków (type- const char),a następnie stworzyłam pentlę for, aby porównać kolejne elementy tablicy ze zmienną guess (type-char).
fragment kodu:
for(int i=0; i<secretPhraseLength; i++)
{
if(tolower(secretPhrase[i])==guess)
noptrHiddenPhrase[i] = secretPhrase[i];
found = true;
}
if(!found)
{
numberOfGuessesLeft--;
}
dla pewności przeprowadziłam symulację tego tylko problemu w pustym programie (używając wskaźnika, tablicy const char i pętli for ) i w programie testowym wszystko działa jak należy.
-drugim błędem, jaki pokazuje kompilator jest: 'noptrHiddenPhrase was not declared i scope' .- oczywiście przed wywołaniem zdeklarowałam powyżej typ zmiennej. Co wiecej- w całym programie używałam jej kilka razy i przy wcześniejszych podobnych użyciach kompilator nie wskazał żadnego błędu.(noptr to skrót od no owning pointer).
Nie udaje mi się przesłać załącznika, więc zamieszczam też kod programu (struktura projektu; main.cpp, wisielec.cpp, nagłówki funkcji w wisielec.h)
#include <iostream>
#include <cstring>
#include <cctype>
#include "wisielec.h"
using namespace std;
const int IGNORE_CHARS = 256; //to do main
const char * INPUT_ERROR_STRING = "input error! Please, try again.";
//Play Game
void PlayGame()
{
const int MAX_LENGTH_OF_SECRET_PHRASE = 256;
const int MAX_NUMBER_OF_GUESSES = 6;
char secretPhrase[MAX_LENGTH_OF_SECRET_PHRASE];
char* noptrHiddenPhrase = nullptr;
int nubmerOfGuessesLeft = MAX_NUMBER_OF_GUESSES;
int secretPhraseLength = GetSecretPhrase(secretPhrase, MAX_LENGTH_OF_SECRET_PHRASE);//z t¹ lnijk¹ by³ problem
noptrHiddenPhrase = MakeHiddenPhrase(secretPhrase, secretPhraseLength);
DrawBoard(nubmerOfGuessesLeft, noptrHiddenPhrase);
do
{
char guess = GetGuess();
UpdateBoard(guess, noptrHiddenPhrase, secretPhrase, secretPhraseLength, nubmerOfGuessesLeft);
DrawBoard(nubmerOfGuessesLeft, noptrHiddenPhrase);
}while(isGameOver(nubmerOfGuessesLeft, noptrHiddenPhrase, secretPhraseLength));
DisplayResult(secretPhrase, nubmerOfGuessesLeft);
delete [] noptrHiddenPhrase;
}
/*do
{
PlayGame();
}while(WantToPlayAgain());
}*/ ///To muszę się jeszcze zastanowić, gdzie powinnam umieścić ;)
char GetGuess()
{
return GetCharacter("Let's input your guess: ", INPUT_ERROR_STRING);
}
void UpdateBoard(char guess, char*noptrHiddenPhrase, const char secretPhrase, int secretPhraseLength, int&numberOfGuessesLeft)
{
bool found = false;
for(int i=0; i<secretPhraseLength; i++)
{
if(tolower(secretPhrase[i])==guess)
noptrHiddenPhrase[i] = secretPhrase[i];
found = true;
}
if(!found)
{
numberOfGuessesLeft--;
}
}
bool isGameOver(int numberOfGuessesLeft, const char*optrHiddenPhrase, int secretPhraseLength)
{
bool hasDash = false;
for(int i=0;i<secretPhraseLength;i++)
{
if(noptrHiddenPhrase[i]=='-')
{
hasDash = true;
break;
}
}return numberOfGuessesLeft==0 || !hasDash;
}
void DisplayResult(const char*secretPhrase, int numberOfGuessesLeft)
{
if(numberOfGuessesLeft>0)
{
cout<<"You got it! The phrase was: "<<secretPhrase<<endl;
}
else
{
cout<<"You didn't get it...The phrases was: "<<secretPhrase<<endl;
}
}
bool WantToPlayAgain()
{
const char validInputs[] = {'y','n'};
char response = GetCharacter("Would you like to play again? (y/n)", INPUT_ERROR_STRING, validInputs, 2);
return response == 'y';
}
//Get Secret Phrase
int GetSecretPhrase(char secretPhrase[], int maxlength)
{
bool failure;
int length;
do
{
failure = false;
cout<<"Enter the secret phrase: ";
cin.get(secretPhrase, maxlength);
if(cin.fail())
{
cin.clear();
cin.ignore(IGNORE_CHARS, '/n');
cout << INPUT_ERROR_STRING << endl;
failure = true;
}
else
{
length = strlen(secretPhrase);
if(length==0)
{
cout<<"You didn't enter any characters. Please, enter a word.";
failure = true;
}
}
}while(failure);
return length;
}
//Make Hidden Phrase
char*MakeHiddenPhrase(const char*secretPhrase, int secretPhraseLength)
{
char* hiddenPhrase = new char[secretPhraseLength+1];
for(int i=0;i<secretPhraseLength;i++)
{
if(secretPhrase[i] != ' ')
{
hiddenPhrase[i]='-';
}
else hiddenPhrase[i] = ' ';
}
hiddenPhrase[secretPhraseLength]='\0';
return hiddenPhrase;
}
//Draw Board
void DrawBoard(int numberOfGuessesLeft, const char* noptrHiddenPhrase)
{
switch(numberOfGuessesLeft)
{
case 0:
{
cout<<" +---+"<<endl;
cout<<" | |"<<endl;
cout<<" | O"<<endl;
cout<<" | /|\\"<<endl;
cout<<" | / \\"<<endl;
cout<<"-+-"<<endl<<endl;
}
case 1:
{
cout<<" +---+"<<endl;
cout<<" | |"<<endl;
cout<<" | O"<<endl;
cout<<" | /|\\"<<endl;
cout<<" | / "<<endl;
cout<<"-+-"<<endl<<endl;
}break;
case 2:
{
cout<<" +---+"<<endl;
cout<<" | |"<<endl;
cout<<" | O"<<endl;
cout<<" | /|\\"<<endl;
cout<<" | "<<endl;
cout<<"-+-"<<endl<<endl;
}break;
case 3:
{
cout<<" +---+"<<endl;
cout<<" | |"<<endl;
cout<<" | O"<<endl;
cout<<" | /|"<<endl;
cout<<" | "<<endl;
cout<<"-+-"<<endl<<endl;
}break;
case 4:
{
cout<<" +---+"<<endl;
cout<<" | |"<<endl;
cout<<" | O"<<endl;
cout<<" | |"<<endl;
cout<<" | "<<endl;
cout<<"-+-"<<endl<<endl;
}break;
case 5:
{
cout<<" +---+"<<endl;
cout<<" | |"<<endl;
cout<<" | O"<<endl;
cout<<" | "<<endl;
cout<<" | "<<endl;
cout<<"-+-"<<endl<<endl;
}break;
case 6:
{
cout<<" +---+"<<endl;
cout<<" | |"<<endl;
cout<<" | "<<endl;
cout<<" | "<<endl;
cout<<" | "<<endl;
cout<<"-+-"<<endl<<endl;
}break; default: break;
}cout<<"Secret Phrase: "<<noptrHiddenPhrase<<endl<<endl;
}
char GetCharacter(const char* prompt, const char*error)
{
char input;
bool failure;
do
{
failure=false;
cout<<prompt;
cin>>input;
if(cin.fail())
{
cin.clear();
cin.ignore(IGNORE_CHARS, '/n');
cout << error << endl;
failure=true;
}
else
{
cin.ignore(IGNORE_CHARS, '/n');
if(isalpha(input))
{
input = tolower(input);
}
else
{
cout<<error<<endl;
failure = true;
}
}
}while(failure); return input;
}
char GetCharacter(const char* prompt, const char* error, const char validInput[], int validInputLength)
{
char input;
bool failure;
do
{
failure=false;
cout<<prompt;
cin>>input;
if(cin.fail())
{
cin.clear();
cin.ignore(IGNORE_CHARS, '/n');
cout << error << endl;
failure=true;
}
else
{
cin.ignore(IGNORE_CHARS, '/n');
if(isalpha(input))
{
input = tolower(input);
for (int i=0;i<validInputLength;i++)
{
if(input==validInput[i])
{
return input;
}
}
}
cout<<error<<endl;
failure=true;
}
}while(failure); return input;
}
main.cpp:
#include <iostream>
#include "wisielec.h"
using namespace std;
int main()
{
const int IGNORE_CHARS = 256; //to do main
const char * INPUT_ERROR_STRING = "input error! Please, try again.";
PlayGame();
return 0;
}
wisielec.h:
#include <iostream>
using namespace std;
void PlayGame();
bool WantToPlayAgain();
char*MakeHiddenPhrase(const char*secretPhrase, int secretPhraseLength);
void DrawBoard(int numberOfGuessesLeft, const char* noptrHiddenPhrase);
int GetSecretPhrase(char secretPhrase[], int maxlength);
char GetGuess();
void UpdateBoard(char guess, char*noptrHiddenPhrase, const char*secretPhrase, int secretPhraseLength, int&numberOfGuessesLeft);
bool isGameOver(int numberOfGuessesLeft, const char*optrHiddenPhrase, int secretPhraseLength);
void DisplayResult(const char*secretPhrase, int numberOfGuessesLeft);
char GetCharacter(const char* prompt, const char*error);
char GetCharacter(const char* prompt, const char*error, const char validInput[], int validInputLength);
Niestety nie mam żadnego pomysłu jak to naprawić. Nie bardzo mam do kogo się zwrócić o pomoc, a bardzo frustrującym byłoby porzucić niedziałającą, prawie skończoną grę :-(
Będę wdzięczna za każdą odpowiedź :-)