Я делаю игру «Память», когда вы выбираете две карты, и если они совпадают, вы оставляете их себе, в противном случае возвращаете их обратно. Если вы затем вспомните карты, которые вы уже выбрали, вы сможете лучше угадать следующие две карты.
Моя проблема связана с методом repaint ()
, который не перерисовывается немедленно.
Когда я переворачиваю вторую карту, независимо от результата, я хочу показать обе карты перевернутыми, прежде чем либо их сбросить, либо перевернуть. Я делаю это, вызывая sleep ()
.
Конечно, если я repaint ()
карты, чтобы перевернуть их правой стороной вверх, подождать секунду, а затем repaint ()
снова на основе их значений, полезная маленькая Java буду перекрашивать только один раз (скучаю по C!).
Обычно я хочу вызвать обновление до того, как я sleep ()
. Я читал некоторые другие потоки, которые в основном говорят, что лучший способ - создать два потока, чтобы ваша логика и графика были разделены, а затем вы можете sleep ()
свою логику и поддерживать обновление вашего графического интерфейса, но я первый семестр первого года курса CS в старшей школе, и я хотел бы сохранить его на уровне курса (хотя я потратил довольно много времени на летние разработки и кодирование на C).
Поскольку я знаю, что полезные люди из StackOverflow любят читать код, вот часть программы, о которой я говорю ниже. Класс HitArea
является объектом Card, а массив cards []
содержит количество HitArea
. (Я не успел переименовать ] HitArea
класс). activeCard1
и activeCard2
- это экземпляры HitArea
, которые я использую для отслеживания двух выбранных пользователем вариантов, а пустой конструктор является зарезервированным «невидимым» HitArea
, хотя позже я изменю его на null. Наконец, cards.flip ()
инвертирует переключатель
логический, который определяет, находится ли карта правой стороной вверх.
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]);
}
}
Я не сомневаюсь, что в моем коде есть некоторые проблемы, поэтому не стесняйтесь указывать на них. Я думаю, что моя базовая структура в порядке, и я бы предпочел не создавать несколько потоков для этого проекта (помните, это базовая!).