刘舒阳_ 2019-10-15 20:56 采纳率: 0%
浏览 699

我的Java贪吃蛇代码,为什么蛇不显示?

图片如下:
(蓝色的是蛇,黄色的是食物)

图片1
图片2

代码如下:

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;


public class SnakeGame extends JFrame{
    String snake_dir="";
    int snake_x=0;
    int snake_y=0;
    int bonus_x=10;
    int bonus_y=10;
    int score=1;
    int index=0;
    int snake[][]=new int[1024][2];
    boolean started=false;
    boolean lose=false;
    boolean win=false;
    public void resetsnake(){
        snake_dir="";
        score=1;
        snake_x=0;
        snake_y=0;
        bonus_x=0;
        bonus_y=0;
        started=false;
        lose=false;
        index=0;
        snake=new int[1024][2];
    }
    public Color color(int r,int g,int b){
        Color col = new Color(r,g,b);
        return col;
    }
    public SnakeGame(String title){
        class DrawPanel extends JPanel{
            public void update_screen(Graphics g){
                super.paint(g);
                g.setColor(color(0,0,0));
                g.fillRect(0,0,900,600);
                g.setColor(color(255,255,0));
                g.fillRect(bonus_x*20, bonus_y*20, 20, 20);
                g.setColor(color(0,0,255));
                for(int i=0;i<=score;i++){
                    g.fillRect(snake[i][0]*20, snake[i][1]*20, 20, 20);
                }
            }
        }
        class MultiThread extends Thread{
            public void run(){
                while(started==true){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    switch(snake_dir){
                    case "up":
                        snake_y--;
                        break;
                    case "down":
                        snake_y++;
                        break;
                    case "left":
                        snake_x--;
                        break;
                    case "right":
                        snake_x++;
                        break;
                    }
                    if(snake_x<0){
                        snake_x=0;
                        snake_dir="";
                    }
                    if(snake_x>44){
                        snake_x=44;
                        snake_dir="";
                    }
                    if(snake_y<0){
                        snake_y=0;
                        snake_dir="";
                    }
                    if(snake_y>29){
                        snake_y=29;
                        snake_dir="";
                    }
                    for(int i=0;i<score-1;i++){
                        snake[i]=snake[i+1];
                    }
                    snake[score-1][0]=snake_x;
                    snake[score-1][1]=snake_y;
                    if(snake_x==bonus_x && snake_y==bonus_y){
                        bonus_x=(int)(Math.random()*45);
                        bonus_y=(int)(Math.random()*30);
                        score++;
                        if(score==1024){
                            started=false;
                            win=true;
                        }
                    }
                    new DrawPanel().update_screen(getGraphics());
                }
            }
        }
        addKeyListener(new KeyListener(){
            public void keyPressed(KeyEvent e){
                int keyCode=e.getKeyCode();
                if(started==true){
                    switch(keyCode){
                    case KeyEvent.VK_UP:
                        snake_dir="up";
                        break;
                    case KeyEvent.VK_DOWN:
                        snake_dir="down";
                        break;
                    case KeyEvent.VK_LEFT:
                        snake_dir="left";
                        break;
                    case KeyEvent.VK_RIGHT:
                        snake_dir="right";
                        break;
                    }
                }else if(started==false && lose==true){
                    lose=false;
                }else if(started==false && lose==false){
                    started=true;
                    new MultiThread().start();
                }
            }
            @Override
            public void keyReleased(KeyEvent e) {}
            @Override
            public void keyTyped(KeyEvent e) {}
        });
        setTitle(title);
        setSize(900,600);
        setResizable(false);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    public static void main(String[] args){
        new SnakeGame("Java贪吃蛇");
    }
}

  • 写回答

1条回答

  • lht80s 2023-06-29 17:04
    关注
          for(int i=0;i<score-1;i++){
              //以循环执行的最后一次为例:i=score-2
              //这里就是是snake[score-2]=snake[score-1];
              //意味着把对象snake[score-2]指向了snake[score-1]的内存空间
              snake[i]=snake[i+1];
           }
          //这里修改了snake[score-1]的成员变量
          //指向同一内存空间的snake[score-2]的内容与snake[score-1]一致,所以这两点是重合在一起的。
          snake[score-1][0]=snake_x;
          snake[score-1][1]=snake_y;
    
          要修改的话,试试把
          snake[i]=snake[i+1];
          改成
          snake[i][0]=snake[i+1][0];
          snake[i][1]=snake[i+1][1];
          这样每次只更新成员变量,对象不变。
    
                        另外,逻辑上也有bug需要处理:
                        //你通过下面修改了**当前**蛇头的位置到移动的位置
                        snake[score-1][0]=snake_x;
                        snake[score-1][1]=snake_y;
                        if(snake_x==bonus_x && snake_y==bonus_y){
                            bonus_x=(int)(Math.random()*45);
                            bonus_y=(int)(Math.random()*30);
                            //这里相当于修改了新的蛇头,注意,此时新蛇头对象snake[score-1]的内容为默认的{0,0}
                            //所以如果不修改的话再次移动时会出现位置错误
                            score++;
                            if(score==1024){
                                started=false;
                                win=true;
                            }
                        }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的