请选择 进入手机版 | 继续访问电脑版

java实现贪吃蛇

[复制链接]
盛夏丨光年丶 发表于 2020-12-31 18:59:44 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
准备工作


  • 明白GUI图形化界面操纵
  • 明白面向对象
  • 明白数组使用
  • 明白随机数的使用
  • 明白定时器的使用
  • 明白将图片转化为流对象
代码实现



  • 图片工具类
  1. public class GetImage {        //静态属性获取蛇的上下左右,头,身体,食物的图片的BufferedImage对象    static BufferedImage right=GetImage.GetImg("/image/right.png");    static BufferedImage left=GetImage.GetImg("/image/left.png");    static BufferedImage down=GetImage.GetImg("/image/down.png");    static BufferedImage up=GetImage.GetImg("/image/up.png");    static BufferedImage header=GetImage.GetImg("/image/header.png");    static BufferedImage body=GetImage.GetImg("/image/body.png");    static BufferedImage food=GetImage.GetImg("/image/food.png");                //静态方法加载图片转化为BufferedImage对象    public static BufferedImage GetImg(String path){        BufferedImage img;        try {                        //加载图片路径            img=ImageIO.read(GetImage.class.getResource(path));                        //返回效果            return img;        } catch (IOException e) {            e.printStackTrace();        }                //如果路径错误,返回为null        return null;    }}
复制代码


  • 面板类
  1. public class GameJPanel extends JPanel {    //界说小蛇的初始长度    int length;    //界说小蛇的X轴坐标    int[] snakeX = new int[100];    //界说小蛇的Y轴坐标    int[] snakeY = new int[100];    //界说游戏开始    boolean isStart = false;    //界说头部配景图片    BufferedImage header;    //界说小蛇的头部图片    BufferedImage right;    BufferedImage left;    BufferedImage down;    BufferedImage up;    //界说小蛇的身体图片    BufferedImage body;    //界说小蛇的方向    String direction = "R";    //界说食物的X坐标    int foolX;    //界说食物的Y坐标    int foolY;    //界说一个记分板    int score;    //界说定时器    Timer timer;    //界说小蛇是否死亡    boolean isDie = false;    public GameJPanel() {                //初始化面板        init();        //将核心置为面板        setFocusable(true);        //设置监听器监听键盘按钮        addKeyListener(new KeyAdapter() {            @Override            public void keyPressed(KeyEvent e) {                super.keyPressed(e);                                //获取键盘的key值                char c = e.getKeyChar();                if (c == KeyEvent.VK_SPACE) {                        if (isDie) {                            //如果小蛇死了,初始化界面,小蛇状态改变                            init();                            score = 0;                            isDie = false;                        }else {                                                        //否则游戏开始                            isStart = !isStart;                        }                                                //重复重绘画面(动的效果)                        repaint();                }                if (isStart){                                        //如果游戏开始,监听键盘按钮是哪个方向移动小蛇                    if (c == 119) {                        direction = "U";                    }                    if (c == 115) {                        direction = "D";                    }                    if (c == 97) {                        direction = "L";                    }                    if (c == 100) {                        direction = "R";                    }                }            }        });        //每隔0.15秒做一次actionPerformed(定时器,小蛇移动)        timer = new Timer(150, new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                //当游戏开始                if (isStart && isDie == false) {                    //身体先动                    for (int i = length - 1; i > 0; i--) {                        snakeX[i] = snakeX[i - 1];                        snakeY[i] = snakeY[i - 1];                    }                    //头部动                    if (direction.equals("R")) {                        snakeX[0] += 25;                    }                    if (direction.equals("U")) {                        snakeY[0] -= 25;                    }                    if (direction.equals("L")) {                        snakeX[0] -= 25;                    }                    if (direction.equals("D")) {                        snakeY[0] += 25;                    }                    //防止小蛇跑出边界                    //右边界                    if (snakeX[0] > 750) {                        snakeX[0] = 25;                    }                    //下边界                    if (snakeY[0] > 725) {                        snakeY[0] = 100;                        //左边界                    }                    if (snakeX[0] < 25) {                        snakeX[0] = 750;                        //上边界                    }                    if (snakeY[0] < 100) {                        snakeY[0] = 725;                    }                    //如果小蛇遇到自己任何一节身体,则死亡                    for (int i = 1; i < length; i++) {                        if (snakeX[i] == snakeX[0] && snakeY[i] == snakeY[0]) {                            isDie = true;                        }                    }                    if (snakeX[0] == foolX && snakeY[0] == foolY) {                        //每吃一个食物蛇长度加一                        length++;                        //随机食物出现的位置                        int X = 25 + 25 * (new Random().nextInt(28));                        int Y = 100 + 25 * (new Random().nextInt(25));                        foolX = X;                        foolY = Y;                                                //通过判断长度判断当前分数                        score = (length - 3) * 10;                    }                    //重新绘制图像                    repaint();                }            }        });        //调用定时器启动        timer.start();    }    public void init() {        //初始化配景、蛇和食物的位置        length = 3;        snakeX[0] = 250;        snakeY[0] = 375;        snakeX[1] = 225;        snakeY[1] = 375;        snakeX[2] = 200;        snakeY[2] = 375;        //设置面板配景图片        setBackground(new Color(0x226C6F));        //设置食物初始坐标        foolX = 325;        foolY = 300;        //初始化游戏为暂停        isStart = false;        //初始化游戏向右方向        direction="R";    }        //画板方法    @Override    public void paint(Graphics g) {        //添加画板        super.paint(g);        g.drawImage(GetImage.food, foolX, foolY, null);        //将头部配景图片画入        g.drawImage(GetImage.header, 10, 10, null);        //将小蛇头部画入        if (direction.equals("R")) {            g.drawImage(GetImage.right, snakeX[0], snakeY[0], null);        }        if (direction.equals("L")) {            g.drawImage(GetImage.left, snakeX[0], snakeY[0], null);        }        if (direction.equals("U")) {            g.drawImage(GetImage.up, snakeX[0], snakeY[0], null);        }        if (direction.equals("D")) {            g.drawImage(GetImage.down, snakeX[0], snakeY[0], null);        }        //将小蛇身体画入        for (int i = 1; i < length; i++) {            g.drawImage(GetImage.body, snakeX[i], snakeY[i], null);        }        //设置当游戏开始大概暂停时出现画面        if (isStart == false) {            g.setColor(new Color(0x894D14));            g.setFont(new Font("微软雅黑", Font.BOLD, 40));            g.drawString("点击空格开始大概暂停", 200, 300);        }        //设置积分数        g.setColor(new Color(0xFFFFFF));        g.setFont(new Font("微软雅黑", Font.BOLD, 20));        g.drawString("积分:   " + score, 620, 40);        if (isDie) {            //如果小蛇死亡,则出现死亡画面            g.setColor(new Color(0xFF3DFD));            g.setFont(new Font("微软雅黑", Font.BOLD, 40));            g.drawString("游戏竣事,请重新按空格进行游戏", 100, 400);        }    }}
复制代码


  • 窗体和启动入口
  1. public class GameJFrame extends JFrame{                //构造方法中设置一些属性    public GameJFrame(){                //设置窗体标题        setTitle("贪吃蛇小游戏");                //设置窗体不能改变大小        setResizable(false);                //获取当前电脑的屏幕的宽度        int width=Toolkit.getDefaultToolkit().getScreenSize().width;                //获取当前电脑的屏幕的高度        int height=Toolkit.getDefaultToolkit().getScreenSize().height;                //设置窗体的大小(x轴,y轴,宽度,高度)        setBounds((width-800)/2,(height-800)/2,800,800);                //设置窗体关闭按钮竣事步伐        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);    }    //这是一个main方法,是步伐的入口:    public static void main(String[] args) {        //创建一个窗体:        GameJFrame frame=new GameJFrame();                //创建一个面板:        GameJPanel panel=new GameJPanel();                //将面板添加到窗体中        frame.add(panel);                //设置窗体可见        frame.setVisible(true);    }}
复制代码
图片素材









来源:https://blog.csdn.net/weixin_45608165/article/details/111887662
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )