//
Purpose. Memento design pattern lab
//
//
Problem. The GuessGame class expects
multiple "clients" to "connect" to it
// with a call
to join(). Each client has a different
random number chosen
// for it by GuessGame. In order to uniquely identify itself to the GuessGame
//
server, each client passes a string identifier when it calls join() and
//
when it calls evaluateGuess().
GuessGame remembers each string identifier
// in an internal table
in the join() method, and then searches that table in
// the
evaluateGuess() method. If we put the
information that is peculiar to
// each client into a "black
box" object (a Memento), and make the client the
//
"caretaker" of that object; then the implementation of the server
(Guess-
// Game) is greatly simplified.
//
// Assignment.
//
o Declare a class Memento
// o Make class GuessGame a "friend"
of class Memento
// o Class Memento will have a single private int data
member and a private
//
constructor that accepts an int and initializes the data member
//
o GuessGame::join() doesn't need to accept a string identifier. But, it
// does need to: select a random number, "wrap" that
number in a Memento
// object,
and return a pointer to that object.
// o GuessGame::evaluateGuess() will
now accept a Memento object instead of
// a string identifier. It
doesn't need to search its table of string
// identifiers, and then access its table of random numbers. Instead, it
// simply references the Memento's private int
data member.
// o All the private data members of class GuessGame can now
be retired.
// o Add a Memento* member to struct Game
// o The call
to guessServer.join() no longer requires a string argument,
// and, the Memento* returned from join()
needs to be remembered.
// o The call to guessServer.evaluateGuess() now
requires a Memento* argument
//
instead of a string argument.
// o Be sure to clean-up the Memento*
pointers when you are done
#include <iostream.h>
#include
<stdlib.h>
#include <time.h>
#include
<string.h>
class GuessGame {
private:
int
numbers[10];
char
names[10][20];
int total;
public:
GuessGame() {
time_t
t;
srand((unsigned)
time(&t));
total =
0;
}
void join( char* name ) {
strcpy( names[total], name );
numbers[total++] = rand() % 30 +
1;
}
int evaluateGuess( char* name, int guess )
{
int i;
for (i=0; i < total; i++)
if ( ! strcmp( names[i], name ))
break;
if (guess ==
numbers[i]) return 0;
return
((guess > numbers[i]) ? 1 : -1);
}
};
struct Game {
char name[20];
int min, max, done;
Game() { min = 1; max = 30; done = 0;
}
};
void main( void ) {
GuessGame
guessServer;
const
int MAX = 3;
Game
games[MAX];
int gamesComplete = 0;
int
guess, ret;
for
(int i=0; i < MAX; i++) {
cout << "Enter name: " ;
cin >> games[i].name;
guessServer.join( games[i].name );
}
while (gamesComplete != MAX) {
for (int j=0; j < MAX; j++) {
if (games[j].done) continue;
cout << games[j].name <<"
("<<games[j].min <<'-'<<games[j].max <<"):
";
cin >>
guess;
ret =
guessServer.evaluateGuess( games[j].name, guess );
if (ret == 0) {
cout << " lights!!
sirens!! balloons!!"
<< endl;
games[j].done = 1;
gamesComplete++;
}
else if (ret <
0) {
cout <<
" too low" <<
endl;
games[j].min =
guess;
}
else {
cout << " too high" << endl;
games[j].max = guess;
} }
} }
// Enter name:
Tom
// Enter name: Dick
// Enter name: Harry
// Tom (1-30):
10
// too low
// Dick
(1-30): 15
// too high
//
Harry (1-30): 20
// too
high
// Tom (10-30): 22
//
too high
// Dick (1-15): 8
// lights!! sirens!! balloons!!
// Harry (1-20): 10
// too low
// Tom (10-22): 16
// too high
// Harry (10-20): 15
// too low
// Tom (10-16): 13
// too high
// Harry (15-20): 17
// too low
// Tom (10-13): 11
// lights!!
sirens!! balloons!!
//
Harry (17-20): 18
//
lights!! sirens!! balloons!!