java - 使用多个 java 概念的箭头悲伤游戏

标签 java swing awt

这是我的简单箭头排序应用程序的代码。

它生成一个大小为 4 的随机序列,其中包含向上、向下、向左和/或向右箭头键,并一次显示一个。如果用户正确地重复该序列,则会显示另一个由 5 个键组成的序列。只要用户输入正确的序列,序列的大小就会不断增加,但如果输入了无效的序列,序列的大小就会减少。

我遇到的问题是,第一次执行是完美的,它甚至第二次显示序列,但在第二次迭代期间它不接受我的键盘输入。

为了更好地理解问题,我将其分解为主要操作执行 block 以及最后的完整代码。

序列生成

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();
    }
}

最佳答案

您调用launchFrame来启动游戏的每次迭代。但是,您在 launchFrame 中做了很多只应该完成一次的工作。您应该将该初始化代码移出 launchFrame 并只执行一次。特别是,您不应重复调用 Keys.addKeyListener(this); 或添加多个窗口监听器。

关于java - 使用多个 java 概念的箭头悲伤游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13164169/

相关文章:

java - 如何知道在 Google Maps v2 for Android 上点击了哪个标记?

java - 使用 OData 接口(interface)开发 Spring REST 服务

java - 合并 JPanel 类和对象声明类

java - 查找特定字体的所有适用字体大小

java - 鼠标拖动时画线问题

java - 如何从 Android 中的 java 代码中删除任何 xml 属性

java - 如何使用密码保护已经存在的 PDF?

java - 这些构造函数调用语句之间的区别?

java - 将 JButton 从不同的类添加到 JPanel

java - 使用 JLayer 阻止对 Canvas 的输入