2021-10-20(java-gui-贪吃蛇)

匿名内部类:

package six;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class six {
    public static void main(String[] args) {
        new MyFrame();
    }

}
class MyFrame extends Frame{
    public MyFrame(){
        setBackground(Color.blue);
        setBounds(300,300,300,300);
        setVisible(true);

        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("匿名内部类");
            }
        });
    }
}

内部类:

class MyFrame extends Frame{
    public MyFrame(){
        setBackground(Color.blue);
        setBounds(300,300,300,300);
        setVisible(true);
        
    }
    class MyWindowListener extends WindowAdapter{
        @Override
        public void windowClosing(WindowEvent e) {
            System.out.println("内部类");
        }
    }
}

目录

匿名内部类:

内部类:

1.图纸设计:

2.静态页面绘制

3.让🐍动起来

4.吃东西

5.积分展示

6.展望


1.图纸设计:

2.静态页面绘制:

        窗口

public class snake {
    public static void main(String[] args) {
//        绘制静态窗口
        JFrame frame = new JFrame("贪吃神");
//        设置界面大小
        frame.setBounds(10,10,920,720);
        frame.setResizable(false);   //窗口大小不可变
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

       创建画板

package cao;

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

public class GamePanle extends JPanel {
//    画板:画🐍
//Graphics 画笔
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);  //清屏
        this.setBackground(Color.black);
        Data.header.paintIcon(this,g,25,11);//        绘制头部栏
        g.fillRect(25,75,850,600);//        绘制游戏区域
    }
}

        创建data存放数据:

package cao;

import javax.swing.*;
import java.net.URL;

//存放数据
public class Data {
//    头部
    public static URL headerUrl=Data.class.getResource("/statics/header.png");
    public static ImageIcon header=new ImageIcon(headerUrl);
//    🐍的头部
    public static URL upUrl=Data.class.getResource("/statics/up.png");
    public static URL downUrl=Data.class.getResource("/statics/down.png");
    public static URL leftUrl=Data.class.getResource("/statics/left.png");
    public static URL rightUrl=Data.class.getResource("/statics/right.png");
    public static ImageIcon up=new ImageIcon(upUrl);
    public static ImageIcon down=new ImageIcon(downUrl);
    public static ImageIcon left=new ImageIcon(leftUrl);
    public static ImageIcon right=new ImageIcon(rightUrl);
//    身体
    public static URL bodyUrl=Data.class.getResource("/statics/body.png");
    public static ImageIcon body=new ImageIcon(bodyUrl);
//    食物
    public static URL foodUrl=Data.class.getResource("/statics/food.png");
    public static ImageIcon food=new ImageIcon(foodUrl);
}

3.让🐍动起来:

定义🐍的长度和坐标并初始化:

int length;                         //🐍的长度
    int[] snakeX=new int[1000];             //🐍的x坐标
    int[] snakeY=new int[1000];             //y坐标
//初始化
    public void init(){
        length=3;
        snakeX[0]=100;
        snakeY[0]=100;
        snakeX[1]=75;
        snakeY[1]=100;
        snakeX[2]=50;
        snakeY[2]=100;
    }

创建构造器:(调用init()初始化方法)

//    构造器调用初始化方法
    public GamePanle(){
        init();
    };

使用画笔

//        画一条静态🐍
        Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
        Data.body.paintIcon(this,g,snakeX[1],snakeY[1]);
        Data.body.paintIcon(this,g,snakeX[2],snakeY[2]);

改进:

//        画一条静态🐍
        if(fx.equals("R")){
            Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals(("L"))){
            Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);
        }else if(fx.equals(("D"))){
            Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals(("U"))){
            Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        for (int i=1;i<length;i++){
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]); //🐍的长度,使用for循环动态增加
        }

游戏开始提示界面:

    boolean isStart=false;          //游戏是否开始
 @Override
    protected void paintComponent(Graphics g) {
//        游戏提示:是否开始
        if(isStart==false){
            g.setColor(Color.white);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));    //设置字体
            g.drawString("按下空格开始游戏",300,300);
        }
}

在构造器中实现:

//    构造器调用初始化方法
    public GamePanle(){
        init();
//        获取键盘的监听事件
        this.setFocusable(true);
        this.addKeyListener(this);
    }
设置计时器
Timer timer=new Timer(100, this);    //this为当前窗口
//   定时器       执行定时操作
    @Override
    public void actionPerformed(ActionEvent e) {
        if(isStart){
//           右移
            for(int i=length-1;i>0;i--){   //除了头部都向前移动   头部是1,所以要i=length-1
                snakeX[i]=snakeX[i-1];
                snakeY[i]=snakeY[i-1];
            }
//            边界判断
            if(snakeX[0]>850){
                snakeX[0]=25;
            }
            snakeX[0]=snakeX[0]+25;    //头部移动
            repaint();              //重新绘制界面
        }

    }

timer.start();             //计时器开始

实现上下左右动:

//   接受键盘输入
    @Override
    public void keyPressed(KeyEvent e) {
//      键盘按下 未释放
        int keyCode = e.getKeyCode();
        if(keyCode==KeyEvent.VK_SPACE){
            isStart=!isStart;
            repaint();              //重新绘制界面
        }
        if(keyCode==KeyEvent.VK_LEFT){
            fx="L";
        }else if(keyCode==KeyEvent.VK_RIGHT){
            fx="R";
        }else if(keyCode==KeyEvent.VK_UP){
            fx="U";
        }else if(keyCode==KeyEvent.VK_DOWN){
            fx="D";
        }

    }

计时器:

//   定时器       执行定时操作
    @Override
    public void actionPerformed(ActionEvent e) {
        if(isStart){
//           右移
            for(int i=length-1;i>0;i--){   //除了头部都向前移动   头部是1,所以要i=length-1
                snakeX[i]=snakeX[i-1];
                snakeY[i]=snakeY[i-1];
            }
//           通过控制方向让头部移动
            if(fx.equals("R")){
                snakeX[0]=snakeX[0]+25;    //头部移动
                if(snakeX[0]>850){           //            边界判断
                    snakeX[0]=25;
                }
            }else if(fx.equals("L")){
                snakeX[0]=snakeX[0]-25;    //头部移动
                if(snakeX[0]<25){           //            边界判断
                    snakeX[0]=850;
                }
            }else if(fx.equals("U")){
                snakeY[0]=snakeY[0]-25;    //头部移动
                if(snakeY[0]<75){           //            边界判断
                    snakeY[0]=600;
                }
            }else if(fx.equals("D")){
                snakeY[0]=snakeY[0]+25;    //头部移动
                if(snakeY[0]>600){           //            边界判断
                    snakeY[0]=75;
                }
            }

4.吃东西

//   定义一个食物
    int foodX;
    int foodY;
    Random random=new Random();
//在初始化中生成食物   
         foodX=25+25*random.nextInt(34);
        foodY=75+25*random.nextInt(34);
//        画食物
        Data.food.paintIcon(this,g,foodX,foodY);
//定时器中
   
         //如果食物和🐍重合
            if(snakeX[0]==foodX && snakeY[0]==foodY){
                length++;
                foodX=25+25*random.nextInt(34);    //重新生成食物
                foodY=75+25*random.nextInt(34);
            }

5.死亡判断

//    死亡判断
    boolean isFail=false;
//       失败提醒
        if(isFail==true){
            g.setColor(Color.RED);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));    //设置字体
            g.drawString("失败",300,300);
        }
        if(keyCode==KeyEvent.VK_SPACE){
            if(isFail){
                isFail=false;       //如果失败重新绘制
                init();
            }else {
                isStart=!isStart;
            }
            repaint();              //重新绘制界面
        }
//            结束判断
            for(int i=1;i<length;i++){
                if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
                    isFail=true;
                }
            }

6.积分展示

1.创建int类型的分数

2.初始化为0

3.画分数和长度

4.于食物碰撞,分数+10

完整代码:

package cao;

import javax.swing.*;

public class snake {
    public static void main(String[] args) {
//        绘制静态窗口
        JFrame frame = new JFrame("贪吃神");
//        设置界面大小
        frame.setBounds(10,10,920,720);
        frame.setResizable(false);   //窗口大小不可变
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//        2.画板
        frame.add(new GamePanle());


        frame.setVisible(true);
    }
}
package cao;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GamePanle extends JPanel implements KeyListener, ActionListener {
    int length;                         //🐍的长度
    int[] snakeX=new int[1000];             //🐍的x坐标
    int[] snakeY=new int[1000];             //y坐标
    String fx;                          //右方向
    boolean isStart=false;          //游戏是否开始
    Timer timer=new Timer(100, this);    //this为当前窗口
//   定义一个食物
    int foodX;
    int foodY;
    Random random=new Random();
//    死亡判断
    boolean isFail=false;
//积分
    int score;


//    构造器调用初始化方法
    public GamePanle(){
        init();
//        获取键盘的监听事件
        this.setFocusable(true);
        this.addKeyListener(this);
        timer.start();   //时间动起来
    }
//初始化
    public void init(){
        length=3;
        snakeX[0]=100;
        snakeY[0]=100;
        snakeX[1]=75;
        snakeY[1]=100;
        snakeX[2]=50;
        snakeY[2]=100;
        fx="R";

        foodX=25+25*random.nextInt(34);
        foodY=75+25*random.nextInt(34);

        score=0;
    }
//    画板:画🐍
//Graphics 画笔
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);  //清屏
        this.setBackground(Color.black);
        Data.header.paintIcon(this,g,25,11);//        绘制头部栏
        g.fillRect(25,75,850,600);//        绘制游戏区域
//        画一条静态🐍
        if(fx.equals("R")){
            Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals(("L"))){
            Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);
        }else if(fx.equals(("D"))){
            Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals(("U"))){
            Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        for (int i=1;i<length;i++){
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);   //🐍的长度
        }
//        画食物
        Data.food.paintIcon(this,g,foodX,foodY);
//话积分
        g.setColor(Color.white);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));    //设置字体
        g.drawString("长度:"+length,750,35);
        g.drawString("分数:"+score,750,50);

//        游戏提示:是否开始
        if(isStart==false){
            g.setColor(Color.white);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));    //设置字体
            g.drawString("按下空格开始游戏",300,300);
        }
//       失败提醒
        if(isFail==true){
            g.setColor(Color.RED);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));    //设置字体
            g.drawString("失败",300,300);
        }
    }

//   接受键盘输入
    @Override
    public void keyPressed(KeyEvent e) {
//      键盘按下 未释放
        int keyCode = e.getKeyCode();
        if(keyCode==KeyEvent.VK_SPACE){
            if(isFail){
                isFail=false;       //如果失败重新绘制
                init();
            }else {
                isStart=!isStart;
            }
            repaint();              //重新绘制界面
        }
        if(keyCode==KeyEvent.VK_LEFT){
            fx="L";
        }else if(keyCode==KeyEvent.VK_RIGHT){
            fx="R";
        }else if(keyCode==KeyEvent.VK_UP){
            fx="U";
        }else if(keyCode==KeyEvent.VK_DOWN){
            fx="D";
        }

    }
//   定时器       执行定时操作
    @Override
    public void actionPerformed(ActionEvent e) {
        if(isStart && isFail==false){
//           右移
            for(int i=length-1;i>0;i--){   //除了头部都向前移动   头部是1,所以要i=length-1
                snakeX[i]=snakeX[i-1];
                snakeY[i]=snakeY[i-1];
            }
//           通过控制方向让头部移动
            if(fx.equals("R")){
                snakeX[0]=snakeX[0]+25;    //头部移动
                if(snakeX[0]>850){           //            边界判断
                    snakeX[0]=25;
                }
            }else if(fx.equals("L")){
                snakeX[0]=snakeX[0]-25;    //头部移动
                if(snakeX[0]<25){           //            边界判断
                    snakeX[0]=850;
                }
            }else if(fx.equals("U")){
                snakeY[0]=snakeY[0]-25;    //头部移动
                if(snakeY[0]<75){           //            边界判断
                    snakeY[0]=650;
                }
            }else if(fx.equals("D")){
                snakeY[0]=snakeY[0]+25;    //头部移动
                if(snakeY[0]>650){           //            边界判断
                    snakeY[0]=75;
                }

            }
            //如果食物和🐍重合
            if(snakeX[0]==foodX && snakeY[0]==foodY){
                length++;
                score+=10;
                foodX=25+25*random.nextInt(34);    //重新生成食物
                foodY=75+25*random.nextInt(34);
            }
//            结束判断
            for(int i=1;i<length;i++){
                if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
                    isFail=true;
                }
            }

            repaint();              //重新绘制界面
        }
        timer.start();   //时间动起来
    }








    @Override
    public void keyTyped(KeyEvent e) {
//       键盘按下 弹起
    }

    @Override
    public void keyReleased(KeyEvent e) {
//      释放某个建
    }

}
package cao;

import javax.swing.*;
import java.net.URL;

//存放数据
public class Data {
//    头部
    public static URL headerUrl=Data.class.getResource("/statics/header.png");
    public static ImageIcon header=new ImageIcon(headerUrl);
//    🐍的头部
    public static URL upUrl=Data.class.getResource("/statics/up.png");
    public static URL downUrl=Data.class.getResource("/statics/down.png");
    public static URL leftUrl=Data.class.getResource("/statics/left.png");
    public static URL rightUrl=Data.class.getResource("/statics/right.png");
    public static ImageIcon up=new ImageIcon(upUrl);
    public static ImageIcon down=new ImageIcon(downUrl);
    public static ImageIcon left=new ImageIcon(leftUrl);
    public static ImageIcon right=new ImageIcon(rightUrl);
//    身体
    public static URL bodyUrl=Data.class.getResource("/statics/body.png");
    public static ImageIcon body=new ImageIcon(bodyUrl);
//    食物
    public static URL foodUrl=Data.class.getResource("/statics/food.png");
    public static ImageIcon food=new ImageIcon(foodUrl);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值