class/member function (Choice::Set) issue

Hey guys. I'm new to C++ (this semester) and I'm having an issue with my member function Choice::Set(int, int).



So, what do we think would cause a set member function of a class with a case statement to cause the second member of the class that was used to set the private variable to set twice? I'm not going to post specific code here but if anyone is interested in helping, throw me a message. I'll be at the school all day tomorrow so feel free to send a line my way. :) However, I will send out some pseudo code real quick

set class with private user and comp members

public choice set function.

->Two variables, user choice and comp choice are passed into the set function as integers from input (for user choice) and a random generator (1 to 3) for the computer choice, as well as a int var(u) for whos turn it is.

switch for user

case 1:
switch for choice made
case 1:
user = 1
case 2:
user = 2
case 3:
user = 3
case 2: same for comp

-> next is the pseudo for the part that passes the variable. u = users, c = user choice, cchoice = comp choice. Assume all variables are declared and present, accounted for. all three are integers. Also user and comp variables are declared to be passed into the .set function The game logic break down is this. The whole logic is in a do/while loop set to whether the player wants to keep playing. Inside the play do/while is a for loop that controls three rounds of play. Inside of that is the Control do/while loop that validates that u and cchoice are not equal to one another. Inside the Control do/while the user selects 1, 2, or 3 for their choice and a random number between 1 and 3 is generated for the computer. Both are validated to make sure they are greater than zero but less than four and numeric values. When those conditions are met, the u is set to equal 1 and the user.set(u, c) member function is called to set user's choice. The same is done for cchoice.set(u, comp) after u = 2.

->The problem is in that bit right there I do believe. I have the code on request and it's documented thoroughly. I think I set the private user and comp values wrong. In my case instead to doing user = 1 (for choice) i should have done user = c (still choice). Also, I have a question about references if anyone has a moment or two tomorrow.


This code is over commented because I was getting caught up in the brackets while it was late and my eyes were getting buggy. Any direction would be much appreciated.



Again, thank you for any thoughts any of you have on this topic. Again, the issue I am having (using VS 2010 Ultimate) is Choice::Set(int, int) (as far as I can tell) is being called twice when it comes to the random num generated for comp choice.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <cctype>

using namespace std;

//***************************************
//          Class Definition            *
//***************************************

class Choice
{
private: 
	int user;
	int comp;

public: 
	void set(int, int);
	void draw(int, int); 
	bool winner(); 
}; 

//*************************************
//     Member Function Definitions    * 
//*************************************

void Choice::set(int u, int c)
{
switch (u)
{
	case 1: 
		switch (c)
			{
				case 1: 
					user = 1;
					cout << "user " << user; //This is here to check how many and what values are being output by user and comp.
					break;
				case 2: 
					user = 2;
					cout << "user " << user;
					break;
				case 3: 
					user = 3;
					cout << "user " << user;
					break;
				}
		 
	case 2: 
		switch (c) 
			{
				case 1: 
					comp = 1;
					cout << "comp " << comp;
					break;
				case 2:
					comp = 2; 
					cout << "comp " << comp;
					break;
				case 3: 
					comp = 3; 
					cout << "comp " << comp;
					break; 
			}    
}
}
void Choice::draw(int u,int c)
{
	switch (u)
	{
		case 1: 
			switch (c)
				{
					case 1: 
						cout << "\nYou chose rock!!!\n\n"; 
						cout << "/'''''''''''''\\n" 
							<< "|* ** * **** ***\\n"
							<< "\* ** ** **** ***|\n"
							<< " \** *** **** ** /\n"
							<< "  \,,,,,,,,,,,,,/\n";
							break; 
					case 2:
						cout << "You chose paper!!!\n\n"; 
						cout << "____________\n" 
							<< "|............|\n"
							<< "|............|\n"
							<< "|...PEBKAC...|\n"
							<< "|............|\n"	
							<< "|............|\n"	
							<< "|............|\n"
							<< "|____________|\n"; 
							break;
					case 3:
						cout << "\nYou chose scissors!!!\n\n"; 
						cout << "     ...        __________             \n"
							 << "    // \\....../__________\            \n"
							 << "    \\ //''''''\__________/            \n"
							 << "     '''                               \n";
							 break;
				}
		case 2: 
			switch (c)
			{
					case 1: 
						cout << "\nThe computer chose rock!!!\n\n"; 
						cout << "/'''''''''''''\\n" 
							<< "|* ** * **** ***\\n"
							<< "\* ** ** **** ***|\n"
							<< " \** *** **** ** /\n"
							<< "  \,,,,,,,,,,,,,/\n";
							break; 
					case 2:
						cout << "\nThe computer chose paper!!!\n\n"; 
						cout << "____________\n" 
							<< "|............|\n"
							<< "|............|\n"
							<< "|...PEBKAC...|\n"
							<< "|............|\n"	
							<< "|............|\n"	
							<< "|............|\n"
							<< "|____________|\n"; 
							break;
					case 3:
						cout << "\nThe computer chose scissors!!!\n\n"; 
						cout << "     ...        __________             \n"
							 << "    // \\....../__________\            \n"
							 << "    \\ //''''''\__________/            \n"
							 << "     '''                               \n";
							 break;
			}
	}
}
bool Choice::winner()
{
	if ((user == 1 && comp == 3) || (user == 2 && comp == 1) || (user == 3 && comp == 2)) 
	{
		cout << "\nYou win the round!!\n\n"; 
		system("pause"); 
		return true;
	}
	else
		cout << "\nYou lose!\n\n";
		system("pause"); 
	return false; 
}
void menu();
void game(); 
void instructions();
bool validate(int &); 


int roundWinArr[3][2]; 

int main () 

{
	menu();  
	return 0;
}
void menu ()
{
	int choice; 
	
	cout << "Welcome to Rock, Paper, Scissors says, \"Shoot!!\"  Please choose from the options below by entering a 1, 2, or 3: " << endl << endl
		 << "\t1 - Start the simulation\n" 
		 << "\t2 - Instructions\n" 
		 << "\t3 - Quit Simulation\n"
		 << "\nPlease make your choice: ";
	cin >> choice; 
	


	switch (choice) 
	{	
	case 1: 
			game(); 
			break;
	case 2: 
			instructions();
			menu(); 
			break; 
	case 3: 
		return; 
	}

}
void game()
{  //<----function begin 
	char again; 
	int u;
	int c;
	int compC;
	int userScr = 0; 
	int compScr = 0; 
	Choice user; 
	Choice comp; 


	do
	{ //<---------- play until user quits loop do while loop 
		for (int r = 0; r < 3; r++)
		{   //<--------3 round for loop start 
		do 
		{ //<---------reroll choice while choices are a tie do while loop start
			cout << "Make your selection please:\n\n"
				 << "\t1 -- Rock\n" 
				 << "\t2 -- Paper\n"
				 << "\t3 -- Scissors\n"; 
			cout << "Please make your selection: "; 
			cin >> c; 
			validate(c); 
			while (validate == false)
			{   //<------------- user validation while loop start
				cout << "\nYou entered an invalid character.  Please enter your choice: ";
				cin >> c; 
				validate(c); 
			} //<-------------user validation while loop end 

			srand(time( NULL ));  //<--------Seed random num
			compC = (rand() % 3) + 1; //<-------------set comp rand num between 1 & 3

			validate(compC);  
			while (validate == false) 
			{    //<-----------computer validation while loop start
				cout << "\nYou entered an invalid character. Please enter your choice: "; 
				compC = (rand() % 3) + 1; 
				validate(compC); 
			}   //<-----------computer validation while loop end
		
	
		if (c == compC)
		{ //<-----------tie output if statement begin 
			cout << "\nTie.  Choose again!\n"; 
		} //<----------tie output if statement end 
} //<----------reroll choice while choice are a tie do while loop end
	while (c == compC);
					for (int i = 1; i < 3; i++)
					{
					if (i == 1) 
					{
					u = 1; 
					user.set(u, c);
					user.draw(u, c); 
					}
					if (i == 2)
					{
					u = 2;
					comp.set(u, compC); 
					comp.draw(u, compC); 
					}
					}
			
		
		if (user.winner() == true)
		{                          //<------Boolean win if statement begin
			roundWinArr[r][0] = 1;
			roundWinArr[r][1] = 0;
		}
		else 
		{
			roundWinArr[r][0] = 0; 
			roundWinArr[r][1] = 1; 
		}                        //<---------------boolean win if statement end 

	} //<-----3 round for loop end 
		for (int s = 0; s < 3; s++) 
		{                                  //<----------Score allocation for loop start
			userScr += roundWinArr[s][0]; 
			compScr += roundWinArr[s][1]; 
		}                                 //<----------Score allocation for loop end 
		if ( userScr > compScr) 
		{                            //<-----------score comparison if statement start
			cout << "\nYou won the game!  Would you like to play again? [Y/N]:  "; 
			cin >> again; 
		}                //<-------------score comparison if statement end
		else 
			cout << "\nYou lost the game. :(  Would you like to play again? [Y/N]: "; 
			cin >> again; 
} //<------play until user quits do while loop end 
	while (toupper(again) == 'Y'); 

} //<----------Function end 
void instructions () 
{ 
	cout << "\n  This is a simple game of Rock, Paper, Scissors." << 
			"  The player chooses between Rock, Paper, or Scissors and, depending upon the computer's choice" << 
			" one wins.   Rock smashes scissors, paper suffocates rock, and scissors slice paper.\n"; 
			cout << endl; 
			system("pause"); 
			cout << endl; 
} 
bool validate(int &c)
{
	if (c < 1 || c > 3 || isdigit(c) == false) 
	{
		return false; 
	}
	else 
		return true; 
}
Topic archived. No new replies allowed.