Yes! Thanks Dark for the explanation. It took me hours to think about that, and your code worked out.
My last task (yes!) is to compute the average, minimum, and maximum amount of probes in each round.
I was thinking about implementing those in my void correct function:
void correct (int i)
{
cout << "You got it in " << i << " probes" << endl;
// cout << "Average: " << (i+1)/rounds;
}
I'm starting with average, and that causes a problem because rounds is not declarede it says. How should I go upon on this .. ?
Here's my updated code:
#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <fstream>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <ctime>
using namespace std;
const int MAXWORDS = 8000;
const int MAXWORDLENGTH = 6;
const int MINWORDLENGTH = 4;
int nWords;
void fillWords(char words[][MAXWORDLENGTH + 1], int maxwords, int& num);
int playOneRound (int wordnum);
void correct (int i);
char wordList [MAXWORDS][MAXWORDLENGTH + 1];
// fills the wordList array
void fillWords(char words[][MAXWORDLENGTH+1], int MAXWORDS, int& num)
{
ifstream wordfile("C:/words.txt");
if ( ! wordfile)
{
cout << "Cannot open words.txt!" << endl;
exit(1);
}
char line[10000];
num = 0;
while (wordfile.getline(line, 10000))
{
if (num == MAXWORDS)
{
cout << "Using only the first " << num
<< " words from words.txt" << endl;
break;
}
int k;
for (k = 0; islower(line[k]); k++)
;
if (line[k] == '\0' && k >= MINWORDLENGTH && k <= MAXWORDLENGTH)
{
strcpy(words[num], line);
num++;
}
}
}
int myRand(int myLimit)
{
return std::rand() % myLimit;
}
bool hasUpperCaseLetters(char guess[MAXWORDLENGTH+1])
{
for (int b=0; b < strlen(guess); b++)
{
if (isupper(guess[b]))
return true;
}
return false;
}
bool doesNotExist (char guess[MAXWORDLENGTH+1])
{
for (int h=0; h < MAXWORDS; h++)
{
if (strcmp (wordList[h], guess) == 0) // check if guess is not in wordList
return false;
}
return true;
}
// choose a secret word
// check to see if secret word is in wordList
// if in, type in a guess
// count the number of correct characters in guess
int playOneRound (int wordnum)
{
char guess[MAXWORDLENGTH+1];
int i = 0;
int h;
do
{
cout << "Probe: ";
cin >> guess;
i++;
for (int b=0; b < strlen(guess); b++)
{
if (hasUpperCaseLetters (guess))
{
cout << "Your probe must be a word of 4 to 6 lower case letters" << endl;
break;
}
if (doesNotExist (guess))
{
cout << "I don't know that word" << endl;
break;
}
}
if (strcmp (wordList[wordnum], guess) == 0) // if probe is correct
{
correct(i);
break;
}
else // if probe not correct
{
for (h=0; h < MAXWORDS; h++)
{
if ( strcmp (wordList[h], guess) == 0 ) // if guess is in wordlist
{
int numCorrect = 0; // declare numCorrect
bool boolArray [MAXWORDLENGTH] = {false}; // set all elements in boolArray to false
for (int z=0; z < MAXWORDLENGTH; z++) // goes through each char in guess
{
for (int j=0; j < MAXWORDLENGTH; j++) // goes through each char in secret word
{
// if found match, change that element to true
if ((guess[z] == wordList[wordnum][j]) && (boolArray[j] == false)&& (guess[z] != '\0'))
{
boolArray [j] = true;
break; // break out, so we don't count matches twice
}
}
}
for (int a=0; a < MAXWORDLENGTH; a++)
{
if ( boolArray [a])
numCorrect++;
}
cout << numCorrect << endl;
break;
}
}
}
}
while (strcmp (wordList[wordnum], guess) != 0);
return i;
}
void correct (int i)
{
cout << "You got it in " << i << " probes" << endl;
// cout << "Average: " << (i+1)/rounds;
// << ",minimum:" << //minimum
// ", maximum:"; << // maximum << endl;
}
int main ()
{
fillWords (wordList, MAXWORDS, nWords);
int rounds;
cout << "How many rounds do you want to play? ";
cin >> rounds;
if (rounds < 0)
{
cout << "Number of rounds must be positive" << endl;
exit (1);
}
for (int a=1; a < rounds+1; a++)
{
cout << "Round " << a << endl;
int random = 5; //myRand(10);
int length = strlen(wordList[random]);
cout << "The secret word is " << length << " letters long" << endl;
int result = playOneRound (random);
}
return 0;
}