- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我在这里的第一个查询。我正在构建一个运行完美的蛇游戏,但 body 只移动三步并暂停。以下是游戏玩法的代码,我有主要方法,但它绝对没问题。 Image : before pressing right arrow. ………… Image : after pressing right arrow
主要方法:
public class Snake {
public static void main(String[] args){
Gameplay gplay = new Gameplay();
JFrame obj = new JFrame();
obj.setTitle("Super SNake");
obj.setBounds(10, 10, 905, 700);
obj.setBackground(Color.getHSBColor(192, 68, 66));
obj.setResizable(false);
obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
obj.add(gplay);
obj.setVisible(true);
}
}
游戏代码:
public class Gameplay extends JPanel implements KeyListener, ActionListener{
private int[] snakeXlength = new int[750];
private int[] snakeYlength = new int[750];
private int lengthsnake = 3;
private int moves = 0;
private boolean left = false;
private boolean right = false;
private boolean up = false;
private boolean down = false;
private ImageIcon umouth;
private ImageIcon lmouth;
private ImageIcon rmouth;
private ImageIcon dmouth;
private ImageIcon body;
private ImageIcon imagetitle;
private Timer t;
private int delay = 100;
public Gameplay(){
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
t = new Timer(delay,this);
t.start();
}
public void paint(Graphics g){
if(moves==0){
snakeXlength[2] = 50;
snakeXlength[1] = 75;
snakeXlength[0] = 100;
snakeYlength[2] = 100;
snakeYlength[1] = 100;
snakeYlength[0] = 100;
}
//title border
g.setColor(Color.black);
g.drawRect(24, 10, 851, 55);
//title
imagetitle = new ImageIcon( getClass().getResource("title.jpg"));
imagetitle.paintIcon(this, g, 25, 11);
//play area
g.setColor(Color.black);
g.drawRect(24, 74, 851, 577);
//bg for play area
g.setColor(Color.black);
g.fillRect(25, 75, 850, 575);
rmouth = new ImageIcon( getClass().getResource("rmouth.png") );
//rmouth = new ImageIcon("game/rmouth.png");
rmouth.paintIcon(this, g, snakeXlength[0], snakeYlength[0]);
for(int a=0; a<lengthsnake; a++){
if(a==0 && right){
rmouth = new ImageIcon( getClass().getResource("rmouth.png") );
//rmouth = new ImageIcon("rmouth.png");
rmouth.paintIcon(this, g, snakeXlength[a], snakeYlength[a]);
}
if(a==0 && left){
lmouth = new ImageIcon( getClass().getResource("lmouth.png") );
//lmouth = new ImageIcon("lmouth.png");
lmouth.paintIcon(this, g, snakeXlength[a], snakeYlength[a]);
}
if(a==0 && up){
umouth = new ImageIcon( getClass().getResource("umouth.png") );
//umouth = new ImageIcon("umouth.png");
umouth.paintIcon(this, g, snakeXlength[a], snakeYlength[a]);
}
if(a==0 && down){
dmouth = new ImageIcon( getClass().getResource("dmouth.png") );
//dmouth = new ImageIcon("dmouth.png");
dmouth.paintIcon(this, g, snakeXlength[a], snakeYlength[a]);
}
if(a!=0){
body = new ImageIcon( getClass().getResource("body.png") );
//body = new ImageIcon("body.png");
body.paintIcon(this, g, snakeXlength[a], snakeYlength[a]);
}
}
g.dispose();
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()== KeyEvent.VK_RIGHT){
moves++;
right= true;
if(!left){
right=true;
}
else{
right= false;
left= true;
}
}
if(e.getKeyCode()== KeyEvent.VK_LEFT){
moves++;
left= true;
if(!right){
left=true;
}
else{
left= false;
right= true;
}
up=false;
down=false;
}
if(e.getKeyCode()== KeyEvent.VK_UP){
moves++;
up= true;
if(!down){
up=true;
}
else{
up= false;
down= true;
}
left=false;
right=false;
}
if(e.getKeyCode()== KeyEvent.VK_DOWN){
moves++;
down= true;
if(!up){
down=true;
}
else{
down= false;
up= true;
}
left=false;
right=false;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void actionPerformed(ActionEvent e) {
t.start();
if(right){
for(int r= lengthsnake-1; r>=0; r--){
snakeYlength[r+1]= snakeYlength[r];
}
for(int r=lengthsnake; r>0; r--){
if(r==0){
snakeXlength[r]= snakeXlength[r]+25;
}
else{
snakeXlength[r]= snakeXlength[r-1];
}
if(snakeXlength[r]> 850){
snakeXlength[r]= 25;
}
}
repaint();
}
if(left){
for(int r= lengthsnake-1; r>=0; r--){
snakeYlength[r+1]= snakeYlength[r];
}
for(int r=lengthsnake; r>0; r--){
if(r==0){
snakeXlength[r]= snakeXlength[r] -25;
}
else{
snakeXlength[r]= snakeXlength[r-1];
}
if(snakeXlength[r]< 25){
snakeXlength[r]= 850;
}
}
repaint();
}
if(up){
for(int r= lengthsnake-1; r>=0; r--){
snakeXlength[r+1]= snakeXlength[r];
}
for(int r=lengthsnake; r>0; r--){
if(r==0){
snakeYlength[r]= snakeYlength[r]+25;
}
else{
snakeYlength[r]= snakeYlength[r-1];
}
if(snakeYlength[r]< 625){
snakeYlength[r]= 75;
}
}
repaint();
}
if(down){
for(int r= lengthsnake-1; r>=0; r--){
snakeXlength[r+1]= snakeXlength[r];
}
for(int r=lengthsnake; r>0; r--){
if(r==0){
snakeYlength[r]= snakeYlength[r] +25;
}
else{
snakeYlength[r]= snakeYlength[r-1];
}
if(snakeYlength[r] > 625){
snakeYlength[r]= 75;
}
}
repaint();
}
}
}
希望您能帮助我解决我的问题。我不知道我错在哪里。蛇移动,但在 3 步后停了下来,它仍在改变头部的方向,但仅在那个位置。这是我在堆栈溢出中的第一个查询。希望以上数据能够帮助大家理解这个问题。请帮助我找到解决方案。
最佳答案
所以,有很多事情“错误”,但我将从最明显的问题开始。
仅查看右
方向处理程序...
for (int r = lengthsnake; r > 0; r--) {
if (r == 0) {
snakeXlength[r] = snakeXlength[r] + 25;
} else {
snakeXlength[r] = snakeXlength[r - 1];
}
if (snakeXlength[r] > 850) {
snakeXlength[r] = 25;
}
}
在此循环中,r
不可能等于 0
,这意味着 0
元素永远不会改变。
它应该更像......
for (int r = lengthsnake; r > 0; r--) {
snakeXlength[r] = snakeXlength[r - 1];
if (snakeXlength[r] > 850) {
snakeXlength[r] = 25;
}
}
snakeXlength[0] = snakeXlength[0] + 25;
if (snakeXlength[0] > 850) {
snakeXlength[0] = 25;
}
我怀疑所有其他“方向”处理程序都有同样的问题。
下一步...
@Override
public void actionPerformed(ActionEvent e) {
t.start();
//...
在它自己的 ActionListener
中启动计时器可能不是最好的主意。 Swing Timer
会自动重复。
下一步...
public void paint(Graphics g) {
if (moves == 0) {
//...
g.dispose();
}
一堆坏主意。
首先,作为一般建议,您应该避免覆盖 paint
。相反,您应该专注于重写 paintComponent
。
您还应该调用 paint
方法的 super
,以维护绘制链。
您永远不应该处置不是您自己创建的Graphics
上下文,它可能会对需要在组件之后绘制的其他内容产生不利影响。
相反,更像是......
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (moves == 0) {
//...
}
下一步...
我什至放弃了讨论 KeyListener
- 相反,您应该使用 How to Use Key Bindings
下一步...
你永远不会释放任何关键状态,这将是一个很大的问题,头部的方向实际上应该与关键状态和绘画过程分开管理
使用不同的数据结构来管理你的蛇。如果您只需要线性访问,则可以找到类似 LinkedList
的东西(如果您需要随机访问,则可以找到 ArrayList
)。关键是,您可以轻松地在 List
的“头部”插入一个新元素,而不必将所有旧元素“复制”到一个位置。
我会再创建两个元素。一种用于管理元素的“类型”,另一种用于管理元素的位置。
public enum SnakePartType {
LEFT_HEAD, RIGHT_HEAD, DOWN_HEAD, UP_HEAD, BODY
}
public class SnakePart {
private SnakePartType type;
private Point location; // You could use separate x/y properties, but Point already does it
public SnakePart(SnakePartType type, Point location) {
this.type = type;
this.location = location;
}
// Getters for type and location
}
这样,您的 paint
进程就不需要了解关键状态,该状态会在绘制 channel 之间发生变化,并且可以依赖模型中的信息
关于JAVA 贪吃蛇游戏错误。蛇走了3步就停了下来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51220841/
我想递归地遍历一个目录,但我希望 python 在遇到包含超过 100 个文件的目录时从任何单个 listdir 中断。基本上,我正在搜索 (.TXT) 文件,但我想避免使用包含大型 DPX 图像序列
我正在尝试遍历列表(例如 sql 行)并为每一行触发例程。问题是传递给函数的值不会在运行时进行评估,因此根据函数执行所需的时间,它可能会使用下一行中的任何值而不是当前行。 我知道我可以在普通函数中提取
我需要以毫秒为单位的时间来处理大量事务,因此我想要正确且快速的东西。下面的工作会做得最好吗? : iMilli := int((time.Nanoseconds() % 1e6) / 1e3
我有以下目录/文件设置(已简化): Ce +---top.txt +---X0.0 | | | +---Y0.0 | | | | |
我遇到了类似的问题: Connecting to Redis To Go with PHP 基本上,我在 redis 中有这个 uri: redis://myusername:foopassword@
我阅读了下面的主题 Go: multiple value in single-value context 但我不明白这个解释在我的案例中。可能是因为我想使用 interface 在下面的情况下,我得到
我有一个模板,我想使用 text/template 评估各个字段包裹。我很难弄清楚评估应该如何工作,因为下面的代码似乎失败了。模板包是否足够强大以处理此类评估? type something stru
我编写了简单的服务器程序来从客户端接收数据。我有点不明白有时我从函数中得到错误 read tcp4 IP:PORT i/o timeoutint, err := conn.Read([]byte) 未
我只需要解码和更新 json 对象的特定值。问题是我不知道对象的完整结构。 encoding/json 包“忽略”/截断结构中未提供的字段,因此在编码时这些字段将丢失。 我想知道是否可以只解码我知道的
我正在尝试使用带有 C++ 目标的 ANTLR4 来实现 TSql 解析器。我抓取了语法文件 here .该jar用于制作相应的源文件(因冲突将TSqlParser.cpp中的NULL全部改为null
我在 win7 中使用 python 3.3.3 - 我只想列出网络目录中的所有文件。 import os for root, dirs, files in os.walk("X:\\network\
当我运行 go 脚本 ( go run example.go ) 时出现此错误 /home/travis/.gvm/gos/go1.1.2/src/pkg/github.com/user/exampl
我正在尝试通过 gmail API 发送电子邮件使用 Go但我发现文档非常有缺陷/令人困惑。这一次我看不到收据字段和电子邮件正文。 我不需要上传任何东西,所以我找到了 Simple upload ,
本人是一名专业的windows/.Net开发者,一直在慢慢学习rails/ruby/python/etc。在我有空的时候。在过去 8 年左右的时间里,我也一直在使用各种 Linux 发行版。然而,有一
我想知道是否可以使用 std http 来响应 http 请求打包并仍然保持 go 例程事件(例如运行任务密集型任务)。用例是我需要接收一个 http 请求,然后在几分钟后回调该服务 最佳答案 只需从
我想知道关于指针的最佳实践是什么。我应该在结构上还是在其字段上定义它们。我虽然定义一个指向结构本身的指针是有意义的,但这里有一个我觉得很有趣的例子。如果所有字段都是指针,为什么我不应该使用指向整个结构
我是一名优秀的程序员,十分优秀!