Java 如何添加玩家移动

Java 如何添加玩家移动,java,maze,Java,Maze,我做了一个迷宫,加了一个红方块来代表玩家。为了实现并允许用户通过我的迷宫,我必须做些什么?我之前做的是创建一个单独的类来扩展JPanel并实现actionListener,但没有成功。因此,我正在寻找一种替代方法和一些更容易建立的方法 import java.awt.*; import javax.swing.*; import java.awt.event.*; // Needed for ActionListener import javax.swing.event.*; // Need

我做了一个迷宫,加了一个红方块来代表玩家。为了实现并允许用户通过我的迷宫,我必须做些什么?我之前做的是创建一个单独的类来扩展JPanel并实现actionListener,但没有成功。因此,我正在寻找一种替代方法和一些更容易建立的方法

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;  // Needed for ActionListener
import javax.swing.event.*;  // Needed for ActionListener
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;

public class www extends JFrame
{
    static Maze maze = new Maze ();
    static Timer t;

    //======================================================== constructor
    public www ()
    {
        // 1... Create/initialize components
        // 2... Create content pane, set layout
        JPanel content = new JPanel ();        // Create a content pane
        content.setLayout (new BorderLayout ()); // Use BorderLayout for panel
        JPanel north = new JPanel ();
        north.setLayout (new FlowLayout ()); // Use FlowLayout for input area

        DrawArea board = new DrawArea (500, 500);

        // 3... Add the components to the input area.

        content.add (north, "North"); // Input area
        content.add (board, "South"); // Output area

        // 4... Set this window's attributes.
        setContentPane (content);
        pack ();
        setTitle ("MAZE");
        setSize (490, 500);
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo (null);           // Center window.
    }

    public static void main (String[] args)
    {
        www window = new www ();
        window.setVisible (true);

        //jf.setTitle("Tutorial");
        //jf.setSize(600,400);

    }

    class DrawArea extends JPanel
    {
        public DrawArea (int width, int height)
        {
            this.setPreferredSize (new Dimension (width, height)); // size
        }

        public void paintComponent (Graphics g)
        {
            maze.show (g); // display current state of colony
        }
    }
}

class Maze 
{
    private int grid [][];

    public Maze ()
    {
        int [][] maze = 
            { {1,0,1,1,1,1,1,1,1,1,1,1,1},
                {1,0,1,0,1,0,1,0,0,0,0,0,1},
                {1,0,1,0,0,0,1,0,1,1,1,0,1},
                {1,0,0,0,1,1,1,0,0,0,0,0,1},
                {1,0,1,0,0,0,0,0,1,1,1,0,1},
                {1,0,1,0,1,1,1,0,1,0,0,0,1},
                {1,0,1,0,1,0,0,0,1,1,1,0,1},
                {1,0,1,0,1,1,1,0,1,0,1,0,1},
                {1,0,0,0,0,0,0,0,0,0,1,0,1},
                {1,1,1,1,1,1,1,1,1,1,1,0,1}};

        grid = maze;

    }

    public void show (Graphics g)
    {
        for (int row = 0 ; row < grid.length ; row++)
            for (int col = 0 ; col < grid [0].length ; col++)
            {
                if (grid [row] [col] == 1) // life
                    g.setColor (Color.black);
                else
                    g.setColor (Color.white);
                g.fillRect (col * 30 + 30, row * 30 + 30, 30, 30); // draw life form


            }
             g.setColor(Color.RED);
                g.fillRect(60,30,30,50);
    }

    //     public void player ()
    //     {
    // 
    //         Timer tm = new Timer(5,this);
    //          int x = 0; 
    //           int y = 0;
    //          int velX = 0 ;
    //          int velY = 0;tm.start();
    //         addKeyListener(this);
    //         setFocusable(true);
    //         setFocusTraversalKeysEnabled(false);
    //     }

    //     public void actionPerformed(ActionEvent e)
    //     {
    //         x = x+velX;
    //         y = y +velY;
    //         repaint();
    //     }

    //     public void keyPressed(KeyEvent e)
    //     {
    //         int c =  e.getKeyCode();
    //         if(c == KeyEvent.VK_LEFT)
    //         {
    //             velX = -1;
    //             velY = 0;
    //         }
    //         if (c == KeyEvent.VK_UP)
    //         {
    //             velX = 0;
    //             velY = -1;
    //         }
    //         if( c==KeyEvent.VK_RIGHT)
    //         {
    //             velX = 1;
    //             velY = 0;
    //         }
    //         if(c==KeyEvent.VK_DOWN)
    //         {
    //             velX = 0;
    //             velY = 1;
    //         }
    //     }
    // 
    //     public void keyTyped(KeyEvent e){}
    // 
    //     public void keyReleased(KeyEvent e){}

}
import java.awt.*;
导入javax.swing.*;
导入java.awt.event.*;//ActionListener需要
导入javax.swing.event.*;//ActionListener需要
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.awt.event.ActionListener;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类www扩展JFrame
{
静态迷宫=新迷宫();
静态定时器t;
//====================================================================================构造函数
公共www()
{
//1…创建/初始化组件
//2…创建内容窗格,设置布局
JPanel content=newjpanel();//创建内容窗格
content.setLayout(新的BorderLayout());//对面板使用BorderLayout
JPanel north=新的JPanel();
north.setLayout(新的FlowLayout());//对输入区域使用FlowLayout
绘图区板=新绘图区(500500);
//3…将组件添加到输入区域。
content.add(北,“北”);//输入区域
content.add(board,“South”);//输出区域
//4…设置此窗口的属性。
setContentPane(内容);
包装();
片名(“迷宫”);
设置大小(490500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);//中心窗口。
}
公共静态void main(字符串[]args)
{
www window=newwww();
window.setVisible(true);
//jf.setTitle(“教程”);
//jf.设置尺寸(600400);
}
类DrawArea扩展了JPanel
{
公共绘图区(内部宽度、内部高度)
{
this.setPreferredSize(新尺寸(宽度、高度));//尺寸
}
公共组件(图形g)
{
maze.show(g);//显示菌落的当前状态
}
}
}
班级迷宫
{
专用整数网格[];
公共迷宫()
{
int[][]迷宫=
{ {1,0,1,1,1,1,1,1,1,1,1,1,1},
{1,0,1,0,1,0,1,0,0,0,0,0,1},
{1,0,1,0,0,0,1,0,1,1,1,0,1},
{1,0,0,0,1,1,1,0,0,0,0,0,1},
{1,0,1,0,0,0,0,0,1,1,1,0,1},
{1,0,1,0,1,1,1,0,1,0,0,0,1},
{1,0,1,0,1,0,0,0,1,1,1,0,1},
{1,0,1,0,1,1,1,0,1,0,1,0,1},
{1,0,0,0,0,0,0,0,0,0,1,0,1},
{1,1,1,1,1,1,1,1,1,1,1,0,1}};
网格=迷宫;
}
公共空间展示(图g)
{
对于(int row=0;row
您的
www
类是一个JFrame(扩展),因此您可以向其添加
keyListener
,如下所示:

首先创建一个名为
MyKeyListener
的新类:

class MyKeyListener extends KeyAdapter {
    public void keyPressed(KeyEvent e)
         {
             int c =  e.getKeyCode();
             if(c == KeyEvent.VK_LEFT)
             {
                 velX = -1;
                 velY = 0;
             }
             if (c == KeyEvent.VK_UP)
             {
                 velX = 0;
                 velY = -1;
             }
             if( c==KeyEvent.VK_RIGHT)
             {
                 velX = 1;
                 velY = 0;
             }
             if(c==KeyEvent.VK_DOWN)
             {
                 velX = 0;
                 velY = 1;
             }
         }
}
(你写的是正确的)

然后在初始化www类时执行以下操作:

setKeyListener(new MyKeyListener());
这将向整个JFrame添加一个键侦听器,它将把键侦听器应用于整个网格

编辑:将代码更改为:

public www ()
{
    // 1... Create/initialize components
    // 2... Create content pane, set layout
    JPanel content = new JPanel ();        // Create a content pane
    content.setLayout (new BorderLayout ()); // Use BorderLayout for panel
    JPanel north = new JPanel ();
    north.setLayout (new FlowLayout ()); // Use FlowLayout for input area

    DrawArea board = new DrawArea (500, 500);

    // 3... Add the components to the input area.

    content.add (north, "North"); // Input area
    content.add (board, "South"); // Output area

    // 4... Set this window's attributes.
    setContentPane (content);
    pack ();
    setTitle ("MAZE");
    setSize (490, 500);
    setKeyListener(new MyKeylistener());
    setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo (null);           // Center window.
}

Ik您必须使用keylistener,但在何处实现,以便它与网格一起工作,而不是在单独的帧/面板上。您在何处使用它statement@FN20我改了。现在清楚了吗?出于某种原因,上面写着“找不到符号mykeyListener”@TheProgrammerG:你可能正在输入一个@HovercraftFullOfEels是的。有点累。