1

これは、単純な矢印シーケンス アプリケーションのコードです。

UP、DOWN、LEFT、および/または RIGHT 矢印キーで構成されるサイズ 4 のランダムなシーケンスを生成し、一度に 1 つずつ表示します。ユーザーがシーケンスを正しく繰り返すと、5 つのキーの別のシーケンスが表示されます。シーケンスのサイズは、ユーザーが正しいシーケンスを入力している限り増加し続けますが、無効なシーケンスが入力された場合は減少します。

私が遭遇している問題は、最初の実行は完璧で、2 回目にシーケンスを表示することさえできますが、2 回目の反復中にキーボード入力を受け入れないことです。

問題をよりよく理解するために、ブロックを実行するメイン アクションと最後に完全なコードに分割しました。

シーケンス生成

for(int flag=1;flag<size;flag++)
    {
    random = randomGenerator.nextInt(4);
    generated[flag]=random;
    setVisible(true);
    switch(random)
        {
            case 0:
            left();
            break;
            case 1:
            up();
            break;
            case 2:
            right();
            break;
            case 3:
            down();
            break;
        }
        delaybig();     
    }

ユーザー入力シーケンス

public void keyPressed(KeyEvent e)
{
    if(cflag<=size) 
    {
        if(e.getKeyCode()==37)
            {
                entered[cflag]=0;
                cflag++;
                Keys.setText("LEFT");
                left();
            }
        else if(e.getKeyCode()==38)
            {
                entered[cflag]=1;
                cflag++;
                Keys.setText("UP");
                up();
            }
        else if(e.getKeyCode()==39)
            {
                entered[cflag]=2;
                cflag++;
                Keys.setText("RIGHT");
                right();
            }
        else if(e.getKeyCode()==40)
            {
                entered[cflag]=3;
                cflag++;
                Keys.setText("DOWN");
                down();
            }
    else
        {
            Keys.setText("INVALID");
        }
    }

Arrays.equals を使用したシーケンス比較

if(cflag==size)
    {
        boolean check = Arrays.equals(generated, entered);
        if(check)
            {
                delaysmall();
                Keys.setText("PERFECT");
                size++;
                cflag=1;
                delaysmall();
                Keys.setText("GO AGAIN");
                delaybig();
                restart();  
            }
        else
            {
                delaysmall();
                Keys.setText("FAILED");
                if(size>5)
                    {
                        delaybig();
                        restart();
                        size--;
                        cflag=1;
                    }
            }
    }

ループスレッド

public void restart() 
{ 
    Thread goagain =  new Thread() 
    {
        @Override
        public void run()
             {
                launchframe();
             }
        };
        goagain.start();
}

私はこれにかなりの時間を費やしましたが、役に立たなかったので、エラーが他の場所で好きだと思われる場合に備えて、完全なコードを次に示します。

import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.Random;
import java.util.Arrays;

class ArrowSorrow extends Frame implements KeyListener{

int flag;
Image img;
int random;
int cflag=1,size=5;
boolean ShowImage=true;
int entered[]=new int[50];
int generated[]=new int[50];
TextField Keys=new TextField(8);
Random randomGenerator = new Random();
MediaTracker mt = new MediaTracker(this);

public ArrowSorrow(String title)
    {
        super(title);
    }

public void restart() 
    { 
        // Create a new thread
    Thread goagain =  new Thread() 
    {
        // Override run() to provide the running behavior of this thread.
        @Override
        public void run()
             {
                launchframe();
             }
        };
        goagain.start();
}
public void launchframe()
{
    for(int flag=1;flag<1;flag++)
        generated[flag]=0;
    for(int flag=1;flag<1;flag++)
        entered[flag]=0;
            splash();
    add(Keys);
            delaybig();
    setSize(400,400);
    Keys.setEditable(false);
    Keys.setText("MEMORIZE");
    Keys.addKeyListener(this);      
    setBackground(Color.black);
    setLayout(new FlowLayout());
for(int flag=1;flag<size;flag++)
        {
        random = randomGenerator.nextInt(4);
        generated[flag]=random;
        setVisible(true);
        switch(random)
            {
                case 0:
                left();
                break;
                case 1:
                up();
                break;
                case 2:
                right();
                break;
                case 3:
                down();
                break;
            }
            delaybig();     
        }
        String sequence=new String("");
        for(flag=1;flag<size;flag++)
            {
                sequence=sequence+(Integer.toString(generated[flag]));
            }
            Keys.setText(sequence);
            delaysmall();
            Keys.setText("REPEAT");
            delaysmall();
            setVisible(true);

            addWindowListener(new WindowAdapter()
                {
                    public void windowClosing(WindowEvent we)
                        {
                            dispose();
                        }
                });
    }
public void splash()
    {
    img = ToolKit.getDefaultToolkit().getImage("image address for splashscreen.jpg");
    mt.addImage(img,0);
    repaint();
    setVisible(true);
}

public void left()
{
    img = Toolkit.getDefaultToolkit().getImage("image address for left.jpg");
    mt.addImage(img,0);
    repaint();
    setVisible(true);
}

public void right()
{
    img = Toolkit.getDefaultToolkit().getImage("image address for right.jpg");
    mt.addImage(img,0);
    repaint();
    setVisible(true);
}

public void up()
{
    img = Toolkit.getDefaultToolkit().getImage("image address for up.jpg");
    mt.addImage(img,0);
    repaint();
    setVisible(true);
}

public void down()
{
    img = Toolkit.getDefaultToolkit().getImage("image address down.jpg");
    mt.addImage(img,0);
    repaint();
    setVisible(true);
}
//minor delay
public void delaysmall()
{
    try 
        {
            Thread.sleep(600);
        } 
    catch(InterruptedException ex) 
        {
            Thread.currentThread().interrupt();
        }   
}
//major delay
public void delaybig()
{
    try 
        {
            Thread.sleep(1200);
        } 
    catch(InterruptedException ex) 
        {
            Thread.currentThread().interrupt();
        }   
}

public void paint(Graphics g)
{
super.paint(g); 
if(img != null)
    g.drawImage(img,70,70, this);
else
    g.clearRect(0, 0, getSize().width, getSize().height);
}

public void keyPressed(KeyEvent e)
{
    if(cflag<size)  
    {
        if(e.getKeyCode()==37)
            {
                entered[cflag]=0;
                cflag++;
                Keys.setText("LEFT");
                left();
            }
        else if(e.getKeyCode()==38)
            {
                entered[cflag]=1;
                cflag++;
                Keys.setText("UP");
                up();
            }
        else if(e.getKeyCode()==39)
            {
                entered[cflag]=2;
                cflag++;
                Keys.setText("RIGHT");
                right();
            }
        else if(e.getKeyCode()==40)
            {
                entered[cflag]=3;
                cflag++;
                Keys.setText("DOWN");
                down();
            }
    else
        {
            Keys.setText("INVALID");
        }
    }
//comparing generated sequence and user input sequence      
if(cflag==size)
    {
        boolean check = Arrays.equals(generated, entered);
        if(check)
            {
                delaysmall();
                Keys.setText("PERFECT");
                size++;
                cflag=1;
                delaysmall();
                Keys.setText("GO AGAIN");
                delaybig();
                restart();  
            }
        else
            {
                delaysmall();
                Keys.setText("FAILED");
                if(size>5)
                    {
                        delaybig();
                        restart();
                        size--;
                        cflag=1;
                    }
            }
    }
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
}

class ArrowSorrowLaunch{
public static void main(String args[])
    {
        ArrowSorrow instance=new ArrowSorrow("Arrow Sorrow");
        instance.launchframe();
    }
}
4

3 に答える 3

1
  1. Swing Timerに変更Thread.sleep(int)します。そうしないと、Swing での同時実行に煩わされます

  2. Thread.sleep(int)Swing GUI終了するまでフリーズします。このスリープ中、MouseまたはKeyイベントはディスパッチまたは消費されません

  3. paintに直接行ったりJFrame、そこに置いJPanelたりしないでください。JComponent

  4. のために、 JPanelまたは代わりにJComponent使用する必要がありますpaintComponentpaint()

  5. を使用しないでください。代わりに s をKeyListener使用してください。KeybindingsetFocusable()

于 2012-10-31T18:17:42.690 に答える
1

launchFrameゲームの各反復を開始するために呼び出します。ただし、一度だけ実行する必要がある多くの作業を行っていますlaunchFrame。その初期化コードを移動して、launchFrame一度だけ実行する必要があります。特に、複数のウィンドウ リスナーを繰り返し呼び出しKeys.addKeyListener(this);たり、追加したりしないでください。

于 2012-10-31T18:23:53.273 に答える