Reputation: 4147
I'm currently working through some exercises in a c++ book, which uses text based games as its teaching tool. The exercise I am stuck on involves getting the pc to select a word from a const array of words (strings), mixing the letters up and asking the player to guess the word. This was easy, but as a follow on the book asks to add the option to provide a hint to the player to help them guess, firstly as a parallel array (again, no problem) and then as a 2 dimensional array. This is where I'm stuck. My (shortened) array of words is as follows:
const string WORDS[NUM_WORDS] = {"wall", "glasses"};
I need to provide a hint for each of these words but not sure how to go about it. Posting this from phone so extensive googling is not an option!
My parallel array was as follows:
const string HINTS[NUM_WORDS] = "brick...", "worn on head"};
Just need to combine the two.
Thanks in advance, Barry
Upvotes: 6
Views: 33981
Reputation: 69
Use a struct array:
typedef struct
{
string Word;
string Hint;
}
WORDDEF;
const WORDDEF WordList[] =
{
{"wall", "brick..."},
{"glasses", "worn on head"},
...
};
Then you refer to them as:
printf ("For entry %d, Word is %s, Hint is %s\n", 1, WordList[1].Word, WordList[1].Hint);
Upvotes: 6
Reputation: 118
Though the book tells you to use 2 arrays, the better way to do this would be an array of structures so that you can access the words and hints by name rather than by an integer index. An ad hoc structure is also better than a pair since you can name the members. Another useful trick in C++ is to have the compiler calculate the number of elements in the array using the sizeof operator. This reduces redundancy in the code which reduces the chances of bugs.
int main(){
/////////////version 1 - the way I would do it
struct element{
string word;
string hint;
};
const element array[] = {
{"wall", "brick..."},
{"glasses", "corrective eye tool thingymajig"},
{"calculator", "number cruncher"}
};
const size_t NUM_WORDS = sizeof(array)/sizeof(element);
for(size_t i=0; i<NUM_WORDS; i++){
cout << array[i].word << ": " << array[i].hint << endl;
}
/////////////version 2 - the way the book asks for it
const string array2[][2] = {
{"wall", "brick..."},
{"glasses", "corrective eye tool thingymajig"},
{"calculator", "number cruncher"}
};
const size_t NUM_WORDS2 = sizeof(array2)/(sizeof(string)*2);
for(size_t i=0; i<NUM_WORDS2; i++){
cout << array2[i][0] << ": " << array2[0][1] << endl;
}
}
Upvotes: -1
Reputation: 2503
Here is a simple example That will give you a 2 dimensional array[2][2] from the other two arrays that you already have that you can use as a starting point.
#include "stdafx.h"
#include "iostream"
#include "string"
#define NUM_WORDS 2
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
const string WORDS[NUM_WORDS] = {"wall", "glasses"};
const string HINTS[NUM_WORDS] = {"brick", "worn on head"};
string hw[NUM_WORDS][NUM_WORDS];
for(int i=0; i < NUM_WORDS; i++)
for(int j=0; j < NUM_WORDS; j++)
{
if(i > 0)
hw[i][j] = HINTS[j];
else if(j > 0)
hw[i][j] = WORDS[i+1];
else
hw[i][j] = WORDS[i];
}
for(int i=0; i < NUM_WORDS; i++)
for(int j=0; j < NUM_WORDS; j++)
{
cout << "hw[" << i << "][" << j << "]= " << hw[i][j] << endl;
}
char c;
cin.get(c);
return 0;
}
For some reason no matter what I do the box will not let me copy and paste the code in so that it formats correctly. sorry.
Upvotes: 0
Reputation: 414
you could make 2d array?
string aArray[][2] = {{"wall", "brick..."},
{"glasses", "corrective eye tool thingymajig"},
{"calculator", "number cruncher"}};
not sure if the syntax is right but i hope you get the concept.
it's an array inside another array.
EDITED: i removed the NUM_WORDS from the first square bracket. you can't declare multi dimentional array from variables.. sorry i forgot about that. i just tested it and it works.
Upvotes: 17
Reputation: 3097
huh... maybe you should use pair struct?
std::pair<std::string, std::string> WORDS[10] = { make_pair("wall", "brick"),
make_pair("glasses, worn") }
now, you can use WORDS[i].first -- as the unknown word
and WORDS[i].second as its hint.
Upvotes: 0