• Status: Solved
• Priority: Medium
• Security: Public
• Views: 470

# Bulls&Cows game - how to figure out no. of cows

Hi Experts
I'm writing an applet, Bulls&Cows game, as part of my java exam.
I have difficulties to check how many cows ( same color - different position) there are after comparing combination of user chosen colors (userGuesses[number_of_guesses][i]) and secretCode colors (secretCode[i]).
Retrieving number of bulls (same color - same position) is working OK, I think.
This is very urgent for me.

Here is my code for doComparing method:

public void doComparing() {

int bulls = 0; // number of bulls
int cows = 0;  // number of cows

// four pegs have been selected
// count up the number of bulls and cows
if ((userGuesses[number_of_guesses][0]).fillCircle.equals((secretCode[0]).fillCircle)) {bulls++;}

else if ((userGuesses[number_of_guesses][0]).fillCircle.equals((secretCode[1]).fillCircle)) {cows++;}

else if ((userGuesses[number_of_guesses][0]).fillCircle.equals((secretCode[2]).fillCircle)) {cows++;}

else if ((userGuesses[number_of_guesses][0]).fillCircle.equals((secretCode[3]).fillCircle)) {cows++;}

if ((userGuesses[number_of_guesses][1]).fillCircle.equals((secretCode[1]).fillCircle)) {bulls++;}

else if ((userGuesses[number_of_guesses][1]).fillCircle.equals((secretCode[0]).fillCircle)) {cows++;}

else if ((userGuesses[number_of_guesses][1]).fillCircle.equals((secretCode[2]).fillCircle)) {cows++;}

else if ((userGuesses[number_of_guesses][1]).fillCircle.equals((secretCode[3]).fillCircle)) {cows++;}

if ((userGuesses[number_of_guesses][2]).fillCircle.equals((secretCode[2]).fillCircle)) {bulls++;}

else if ((userGuesses[number_of_guesses][2]).fillCircle.equals((secretCode[0]).fillCircle)) {cows++;}

else if ((userGuesses[number_of_guesses][2]).fillCircle.equals((secretCode[1]).fillCircle)) {cows++;}

else if ((userGuesses[number_of_guesses][2]).fillCircle.equals((secretCode[3]).fillCircle)) {cows++;}

if ((userGuesses[number_of_guesses][3]).fillCircle.equals((secretCode[3]).fillCircle)) {bulls++;}

else if ((userGuesses[number_of_guesses][3]).fillCircle.equals((secretCode[0]).fillCircle)) {cows++;}

else if ((userGuesses[number_of_guesses][3]).fillCircle.equals((secretCode[1]).fillCircle)) { cows++;}

else if ((userGuesses[number_of_guesses][3]).fillCircle.equals((secretCode[2]).fillCircle)) {cows++;}

for (int i = 0; i<bulls; i++) {

(bullsCowsScore[number_of_guesses][i]).fillCircle = Color.BLACK;
(bullsCowsScore[number_of_guesses][i]).repaint();

}

for (int j = bulls; j<(bulls + cows); j++) {
(bullsCowsScore[number_of_guesses][j]).fillCircle = Color.WHITE;
(bullsCowsScore[number_of_guesses][j]).repaint();

}

if (bulls==4) {
winLooseLabel.setText(" YOU WON! ");

restartLabel.setText("<html> Click the green peg to </n> restart </n><html>");
showSecretCode();
finished =true;
//      doReset();
}

if ((number_of_guesses == 9) && (bulls!=4)) {
finished = true;
winLooseLabel.setText(" YOU LOOSE! ");
restartLabel.setText("<html> Click the green peg to </n> restart </n><html>");
showSecretCode();
}

}
0
BUCKA
• 3
• 2
• 2
1 Solution

Commented:
Tut tut, homework questions are not allowed on EE, never mind exam questions...

If you tell us more about the problem you're having we can steer you in the right direction, but not do it for you!!!
0

Author Commented:
Fair enough,
I didn't expect code of course, just idea where I'm making mistake in logic for checking equality.
I was trying to do checking using 2 nested for loops and excluding number of found bulls but it doesn't make much more difference. That's my problem.
0

Commented:
Try using == instead of .equals().  I'm not sure, but this might make a difference since its static final constants you're using to check the equality with (i.e. Color.BLACK etc.).

== checks to see if the references being cmpared are in fact poiting to the same ovbject. As such, since the Color.BLACK etc is static and final, if you use these static final fields to set your colours, then the == should work (as static means 'only one copy of, belonging to the class).
0

Commented:
Hi BUCKA,

You should use 'for' loop instead of multiple if.

you need an array of boolean (local variable)   used=new boolean[4]; // 4 ==secretCode.length

first found the correct colors at correct place :
- for each i in 0..3 :
- if userGuesses[i] == secretCode[i] then   bulls++  used[i]=true

then find the other guesses in secretcode :
- for each i in 0..3 :
- for each j in 0..3 :
-if  !used[j] and userGuesses[i] == secretCode[j] then   cows++  used[j]=true
0

Commented:
>>then find the other guesses in secretcode :
correction, you also need a second boolean array, initialized by the first one :
boolean[] used_g=(boolean[])used.clone();
- for each i in 0..3 :
-if  !used_g[i]
- for each j in 0..3 :
-if  !used[j] and userGuesses[i] == secretCode[j] then   cows++  used[j]=true

0

Author Commented:
Hi Webstorm
You are genious!!!
I implemented what you suggested and it works perfectly now.
Thank you, thank you, thank you!
Well deserved 500 points
0

Commented:
:-)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.