I am making the game Memory, when you pick two cards and if they match you get to keep them, otherwise you turn them back. If you then remember cards you have already chosen, you can venture a better guess on the next two cards.
The problem I have involves the repaint()
method not immediately repainting.
When I flip the second card, no matter the outcome, I want to show both cards flipped right-side up before either discarding them or flipping them back over. I do this by calling sleep()
.
Of course if I repaint()
the cards to flip them right-side up, wait a second, and then repaint()
again based on their values, helpful little Java will only repaint once (I miss C!).
Basically I want to force invoke a update before I sleep()
. I have read some other threads that basically say the best way is to create two threads to keep your logic and graphics separate, and then you can sleep()
your logic and keep your GUI updating, but I am in the first semester of a first year CS course in high school, and I would want to keep it on the course's level (although I spent quite a bit of time over the summer web developing and coding in C).
Because I know the helpful folks on StackOverflow love to read code, here is the part of the program I am referring to below. The class HitArea
is the Card object and the cards[]
array contains an amount of HitArea
's.(I haven't gotten to renaming the HitArea
class). activeCard1
and activeCard2
are HitArea
instances I use to keep track of the user's two selections, and the blank constructor is a reserved "invisible" HitArea
, although I will change it to null later. Finally, cards.flip()
inverts a toggle
boolean which determines whether the card is right-side up.
public void respond(HitArea choice)
{
if(choice.inGame)
{
if(activeCard1.value == 0 && activeCard1.value == 0)
activeCard1 = choice;
else if((!(activeCard1.value == 0) && activeCard2.value == 0) && (activeCard1.id != choice.id))
{
activeCard2 = choice;
check();
}
}
}
public void check()
{
update();
pause(250);
if(activeCard2.value == activeCard1.value)
{
score += 2;
activeCard1.inGame = false;
activeCard2.inGame = false;
}
activeCard1.flip();
activeCard2.flip();
activeCard1 = new HitArea();
activeCard2 = new HitArea();
}
public void pause(int milliseconds)
{
try{
Thread.currentThread().sleep(milliseconds);
}
catch(InterruptedException e){
System.out.println("Exception: " + e);
}
}
public void mousePressed(MouseEvent e)
{
int x = e.getX();
int y = e.getY();
for (int i = 0; i < cardNum; i++)
if(cards[i].boundsCheck( x, y ) )
{
repaint();
cards[i].flip();
respond(cards[i]);
}
}
I have no doubt there are some issues in my code, so feel free to point them out. I think my basic structure is okay, and I would rather not create multiple threads for this project (remember, it's basic!).