私はゲームの記憶を作っています。あなたが2枚のカードを選んだとき、それらが一致した場合、あなたはそれらを保持することができます。そうでない場合、あなたはそれらを元に戻します。その後、すでに選択したカードを覚えている場合は、次の2枚のカードをより正確に推測することができます。
私が抱えている問題は、repaint()
すぐに塗り直さない方法に関係しています。
2枚目のカードを裏返すときは、結果に関係なく、両方のカードを表向きに裏返してから、捨てるか裏返しにする前に見せたいと思います。これを行うには、を呼び出しsleep()
ます。
もちろんrepaint()
、カードを裏返して少し待ってから、repaint()
その値に基づいて、役立つ小さなJavaは1回だけ再描画します(Cが恋しいです!)。
基本的に、私は私がする前に更新を強制的に呼び出すことを望みsleep()
ます。基本的に、ロジックとグラフィックスを分離するために2つのスレッドを作成するのが最善の方法であると述べている他のスレッドをいくつか読みました。その後、ロジックを作成しsleep()
てGUIを更新し続けることができますが、私は1年目のCSコースの最初の学期にいます。高校では、コースのレベルを維持したいと思います(ただし、夏のWeb開発とCでのコーディングにかなりの時間を費やしました)。
StackOverflowの役立つ人々がコードを読むのが大好きだと知っているので、ここで私が以下で参照しているプログラムの一部を示します。クラスHitArea
はCardオブジェクトであり、cards[]
配列には大量のHitArea
'が含まれています(HitArea
クラスの名前を変更することはできません)。activeCard1
とactiveCard2
はHitArea
、ユーザーの2つの選択を追跡するために使用するインスタンスであり、空白のコンストラクターは予約済みの「非表示」ですが、HitArea
後でnullに変更します。最後に、カードが正しい向きであるかどうかを決定cards.flip()
するブール値を反転します。toggle
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]);
}
}
私のコードにいくつかの問題があることは間違いないので、遠慮なく指摘してください。私の基本的な構造は大丈夫だと思います。このプロジェクトでは複数のスレッドを作成したくありません(基本的なことを覚えておいてください)。