【project1】简易版贪吃蛇

Java实现简易版贪吃蛇

效果图

在这里插入图片描述
在这里插入图片描述

实现代码

SnakePanel.java

    public class SnakePanel extends JPanel implements KeyListener ,ActionListener{
    //加载图片
    ImageIcon up=new ImageIcon("up.png");
    ImageIcon down=new ImageIcon("down.png");
    ImageIcon left=new ImageIcon("left.png");
    ImageIcon right=new ImageIcon("right.png");
    ImageIcon title=new ImageIcon("title.jpg");
    ImageIcon food=new ImageIcon("food.png");
    ImageIcon body=new ImageIcon("body.png");

    //蛇的数据结构的设置
    int[] snakex=new int[750];
    int[] snakey=new  int[750];
    int len;
    String direction="R";//表示的是蛇头的方向

    //食物的数据
    Random r=new Random();
    int foodx=r.nextInt(34)*25+25;//闭前开后,随机的位置
    int foody=r.nextInt(24)*25+75 ;

    //游戏开始或者结束变量
    boolean isStarted=false;

    //游戏失败
    boolean isFaild=false;

    Timer timer=new Timer(150,this);

    //统计分数
    int score=0;


    public SnakePanel() {//构造方法
        this.setFocusable(true);
        initSnake();//初始化,防止静态蛇
        this.addKeyListener(this);
        timer.start();
    }

    //初始化蛇,将蛇放在界面上
    public void initSnake(){
        len=3;
        direction="R";
        snakex[0]=100;
        snakey[0]=100;
        snakex[1]=75;
        snakey[1]=100;
        snakex[2]=50;
        snakey[2]=100;
        isStarted=false;
        isFaild=false;
        score=0;
    }

    public void paint (Graphics g ){
        //设置画布的背景色
        this.setBackground(Color.BLACK);
       g.fillRect(25,75,850,600);
        //设置标题
        title.paintIcon(this,g,25,11);

        //蛇头
        if(direction.equals("R")){
            right.paintIcon(this,g,snakex[0],snakey[0]);
        }else if(direction.equals("L")){
            left.paintIcon(this,g,snakex[0],snakey[0]);
        }else if(direction.equals("U")){
            up.paintIcon(this,g,snakex[0],snakey[0]);
        }else if(direction.equals("D")){
            down.paintIcon(this,g,snakex[0],snakey[0]);
        }
        //蛇身
        for(int i=1;i<len;i++){
            body.paintIcon(this,g,snakex[i],snakey[i]);
        }
        //画开始提示语
        if(!isStarted){
            g.setColor(Color.WHITE);
            g.setFont(new Font("arial",Font.BOLD,30));
            g.drawString("Press Space to Start/Pause",280,300);
        }

        //失败提示语
        if(isFaild){
            g.setColor(Color.WHITE);
            g.setFont(new Font("arial",Font.BOLD,30));
            g.drawString("Game Over,Press Space to Restart",200 ,300);
        }

        //画食物
        food.paintIcon(this,g,foodx,foody );
        
        //分数和长度的统计
        g.setColor(Color.RED);
        g.setFont(new Font("arial",Font.PLAIN,15));
        g.drawString("Score:"+score,750,35);
        g.drawString("Length:"+len,750,55);
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
     int keyCode=e.getKeyCode();
        if(keyCode==KeyEvent.VK_SPACE){
            if(isFaild){
             initSnake();
            }else
            {
                isStarted=!isStarted;
            }

            repaint();
        }else if(keyCode==KeyEvent.VK_UP&&!direction.equals("D")){
            direction="U";
        }else if(keyCode==KeyEvent.VK_DOWN&&!direction.equals("U")){
            direction="D";
        }else if(keyCode==KeyEvent.VK_LEFT&&!direction.equals("R")){
            direction="L";
        }else if(keyCode==KeyEvent.VK_RIGHT&&!direction.equals("L")){
            direction="R";
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }
   /*
   * 1.重新定个闹钟
   * 2.蛇移动
   * 3.画布重新画*/
    @Override
    public void actionPerformed(ActionEvent e) {
     timer.start();
       if(isStarted &&! isFaild){
           //移动身体
           for (int i=len;i>0;i--){
               snakex[i]=snakex[i-1];
               snakey[i]=snakey[i-1];
           }
           //头移动
           if(direction.equals("R")){
              //横坐标+25
               snakex[0]=snakex[0]+25;
               //超边界
               if(snakex[0]>850){
                   isFaild=true;
               }
           }else if(direction.equals("L")){
               snakex[0]=snakex[0]-25;
               if(snakex[0]<25){
                  isFaild=true;
               }
           }else if(direction.equals("U")){
              snakey[0]=snakey[0]-25;
               if (snakey[0]<75){
                 isFaild=true;
               }
           }else if(direction.equals("D")){
              snakey[0]=snakey[0]+25;
               if(snakey[0]>650){
                  isFaild=true;
               }
           }
           //吃食物的逻辑
           if(snakex[0]==foodx&&snakey[0]==foody){
               len++;
               score++;
               boolean flag=true;
               while (flag){
                   foodx=r.nextInt(34)*25+25;
                   foody=r.nextInt(24)*25+75;
                   for(int i=0;i<len;i++){
                       if(foodx==snakex[i]&&foody==snakey[i])
                           break;
                       if( i==len-1)flag=false;
                   }
               }
           }

           //判断死亡
           for(int i=1;i<len;i++){
               if(snakex[0]==snakex[i]&&snakey[0]==snakey[i])
                   isFaild=true;
           }
    }
    repaint();}

}

Snake.java

public class Snake {
    public static void main(String[] args) {
        JFrame frame=new JFrame();
        frame.setBounds(400,200,900,720);
        frame.setResizable(false);//大小不可以拖动
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭是退出

        SnakePanel panle=new SnakePanel();
        frame.add(panle);
        frame.setVisible(true);
    }
}

注:图片都是放在根目录下
因为这是第一个练手的项目,是看着视频制作的,有很多的知识点不能完全的讲解,如果有什么错误和不便,请见谅,期待越来越好的自己。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值