当前位置: 首页 > 面试题库 >

使用Java创建Snake

宰父衡
2023-03-14
问题内容

我决定使用Java重新创建Snake,但是我有些困惑。目前,我有一个正方形,用户可以使用箭头键在屏幕上移动。当您按一次LEFT时,方型会开始使用计时器向左移动。当您按任何其他已设置的键(向右,向上,向下)时,它会改变方向。我的目标是使用ArrayList容纳组成蛇的正方形。目前,我已经创建了一个ArrayList,其中仅包含一个Snake对象,如果我将第二个Snake对象添加到列表中并将其添加到框架(以及第一个)中,则只有一个Snake对象可见,并且要移动的键它不起作用。我正在寻找有关如何进行该项目的一些想法-
请不要给我完整的答案,因为我 d想自己解决大部分问题;我只需要一些指示。在此先感谢-代码在下面。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Snake extends JPanel implements KeyListener, ActionListener
{
int x = 0, y = 0, velx = 0, vely = 0;
Timer t = new Timer(250, this);


public Snake(int num1, int num2)
{
    t.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(true);
    x = num1;
    y = num2;
}
public void paintComponent(Graphics g)
{   
    super.paintComponent(g);

    g.setColor(Color.blue);
    g.fillRect(x, y, 20, 20);
}
public void actionPerformed(ActionEvent e)
{
    repaint();
    x += velx;
    y += vely;
}
public void up()
{
    vely = -20;
    velx = 0;
}
public void down()
{
    vely = 20;
    velx = 0;
}
public void left()
{
    vely = 0;
    velx = -20;
}
public void right()
{
    vely = 0;
    velx = 20;
}
public void keyPressed(KeyEvent e)
{
    int code = e.getKeyCode();

    if(code == KeyEvent.VK_UP)
        up();
    else if(code == KeyEvent.VK_DOWN)
        down();
    else if(code == KeyEvent.VK_RIGHT)
        right();
    else if(code == KeyEvent.VK_LEFT)
        left();

}
public void keyReleased(KeyEvent e)
{

}
public void keyTyped(KeyEvent e)
{

}
}
//Driver Class
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;

public class UserClass
{
private static JFrame frame = new JFrame("Snake");
private static ArrayList<Snake> mySnake = new ArrayList<Snake>();

public static void main(String[] args)
{
    frame.setSize(500,500);
    frame.setBackground(Color.black);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    mySnake.add(new Snake(20,20));
    frame.add(mySnake.get(0));
}
}

PS:当我在Mac上的Eclipse中输入相同的完全相同的代码时,框架的背景是黑色,但在Windows上它是浅灰色…有人知道为什么吗?谢谢。


问题答案:

要回答您的后记,请设置背景色或在其他所有颜色后面添加JPanel。

要继续进行该项目,请考虑使其成为MVC框架中的一个练习。现在发生的事情是您的Model和View链接在同一个类中-这使得很难遵循所有事物背后的逻辑。

您可以做的是首先将Snake与与视图相关的任何事物分开-用ArrayList<Integer[]> segmentLocations或代表一条蛇,以表示您定义的板上每个段位置的(x,y)-您可以使用绝对值坐标,也可以创建任意网格并在视图中更改为绝对坐标(这更好地代表了MVC关系)。Snake还应该为蛇所面对的方向提供一个字段-
我会使用enum Direction {N, S, E, W},但是您可以选择,因为您也可以使用整数来表示方向,或者使用多种其他方式。

然后,您的Snake也将具有更新自身的方法-
move(),根据当前路段的初始方向来移动所有路段的位置,并使所有其他路段都跟随前一个路段的移动(此操作如果您考虑几分钟,就非常容易)。

您的视图可能是一个具有GridLayout的JFrame,该GridLayout由JPanel组成,这些JPanel轮询您的Snake实例,并查看该位置是否存在线段(如果有的话),绘制该线段,或者使用其他多种选择。

您的控制器将是KeyAdapter,当按下箭头键时,该适配器会将更新发送到您的Snake。

小提示,让您的生活更轻松:添加新片段时,只需将其放在Snake的最后一个片段的位置即可。下次移动时,新片段将位于同一位置,其余的Snake也应相应移动。



 类似资料:
  • 问题内容: 我试图找到有关此信息,但空手而归: 我认为可以使用反射或代理在Java中动态创建类,但我不知道如何做。我正在实现一个简单的数据库框架,在其中使用反射创建SQL查询。该方法获取具有数据库字段作为参数的对象,并基于该对象创建查询。但是,如果我还可以动态创建对象本身,那将非常有用,这样我就不必为每个表都拥有一个简单的数据包装对象。 动态类只需要简单的字段(,,),例如 这可能吗,我该怎么做?

  • 我感兴趣的是拍摄一个tif图像,并在其中添加一个包含Java文本的层,如果可能的话,最好使用十二只猴子图像库。 我可以从这里调整代码以将文本添加到tif或仅使用文本创建相同大小的新tif,但不能将它们保存为多页tif。例如: Maven公司: 如何从图像和生成的文本图像创建多页tif? 我能够为JPG运行以下代码,但JPG没有层。 非常感谢。

  • 我使用数据库中的数据获取默认表模型,我想以doc word打印为表。如何实现。请参阅下面的代码:

  • 问题内容: 用Java创建GUID的最佳方法是什么? 问题答案: java.util.UUID.randomUUID();

  • 问题内容: 以root用户身份登录后,在 MySQL 命令行客户端中键入: 现在在 Java中 ,我使用驱动程序使用admin userid成功连接到数据库。 为什么插入命令有效,但授权命令却无法通过Java工作? 请帮忙。 问题答案: 在这里,您只能执行MySQL查询,但 不是MySQL查询,它只是MySQL的命令。

  • 是否可以使用java代码创建/删除windows用户帐户并设置其权限以使其成为管理员帐户、简单用户帐户或来宾帐户?