初晨89 2021-06-29 14:38 采纳率: 66.7%
浏览 72
已采纳

有木有会做Java小游戏的,用MyEclipse做

就是做一个小程序,小的,简单一点,代码不难懂的。

  • 写回答

3条回答 默认 最新

  • 王大师王文峰 企业官方账号 2021-06-30 14:28
    关注

    贪吃蛇给你 望采纳,谢谢

    package com.company;
    
    import javax.imageio.ImageIO;
    import javax.sound.sampled.*;
    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.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Random;
    
    //基本套路,继承JPanel,实现KeyListener, ActionListener接口
    public class Mpanel extends JPanel implements KeyListener, ActionListener {
        //定义所需要的图片元素
        //标题
        ImageIcon title;
        //蛇的身体部位
        ImageIcon body;
        //蛇向上方向的头
        ImageIcon up;
        //蛇向下方向的头
        ImageIcon down;
        //蛇向左方向的头
        ImageIcon left;
        //蛇向右方向的头
        ImageIcon right;
        //食物元素
        ImageIcon food;
    
        //定义初始长度
        int len = 3;
        //定义初始分数
        int score = 0;
        //存放蛇位置坐标的数组
        int[] snakex = new int[750];
        int[] snakey = new int[750];
        //定义方向
        String fx = "R";
        //定义游戏是否开始
        Boolean isStart = false;
        //定义游戏是否失败
        Boolean isFailed = false;
        //定义游戏时钟,在此可以设置蛇移动速度,默认100ms
        Timer timer = new Timer(100,this);
        //定义食物的坐标
        int foodx;
        int foody;
        //引入随机数,用于生成食物的随机位置
        Random random = new Random();
        //定义背景音乐
        Clip bgm;
    
        //构造方法
        public Mpanel(){
            //加载图片元素
            loadImages();
            //初始化数据
            initSnake();
            //设置聚焦
            this.setFocusable(true);
            //设置键盘监听
            this.addKeyListener(this);
            //开始计时
            timer.start();
            //加载背景音乐
            loadBGM();
        }
    
        //设置绘图元素
        public void paintComponent(Graphics g){
            //调用父类方法
            super.paintComponent(g);
            //设置背景颜色为白色
            this.setBackground(Color.white);
            //设置标题元素位置
            title.paintIcon(this,g,25,11);
            //设置白色背景填充位置
            g.fillRect(25,75,850,600);
            //设置画笔颜色为白色
            g.setColor(Color.white);
            //设置长度显示
            g.drawString("Len: " + len,750,35);
            //设置分数显示
            g.drawString("Score: " + score,750,50);
    
            //根据方向调用相应的蛇头元素
            if(fx == "R"){
                right.paintIcon(this,g,snakex[0],snakey[0]);
            }
            else if(fx == "L"){
                left.paintIcon(this,g,snakex[0],snakey[0]);
            }
            else if(fx == "U"){
                up.paintIcon(this,g,snakex[0],snakey[0]);
            }
            else if(fx == "D"){
                down.paintIcon(this,g,snakex[0],snakey[0]);
            }
            for(int i=1;i<len;i++){
                body.paintIcon(this,g,snakex[i],snakey[i]);
            }
    
            //调用食物元素
            food.paintIcon(this,g,foodx,foody);
    
            //游戏开始的处理
            if(isStart == false){
                //设置画笔颜色
                g.setColor(Color.white);
                //设置字体
                g.setFont(new Font("arial",Font.BOLD,40));
                //设置具体文字
                g.drawString("Press Space To Start",250,300);
            }
    
            //游戏失败的处理
            if(isFailed){
                //设置画笔颜色
                g.setColor(Color.red);
                //设置字体
                g.setFont(new Font("arial",Font.BOLD,40));
                //设置具体文字
                g.drawString("Failed: Press Space To Start",250,300);
            }
        }
    
        //初始化数据
        public void initSnake(){
            len = 3;
            snakex[0] = 100;
            snakey[0] = 100;
            snakex[1] = 75;
            snakey[1] = 100;
            snakex[2] = 50;
            snakey[2] = 100;
            //设置食物的初始随机生成位置
            foodx = 25 + 25 * random.nextInt(34);
            foody = 75 + 25 * random.nextInt(24);
            //设置初始值
            fx = "R";
            score = 0;
        }
    
        //接口要求的实现方法
        @Override
        public void keyTyped(KeyEvent e) {
    
        }
    
        @Override
        public void keyPressed(KeyEvent e) {
            //获取键盘监听
            int keyCode = e.getKeyCode();
            //空格
            if(keyCode == KeyEvent.VK_SPACE){
                //如果失败则重置信息
                if(isFailed){
                    isFailed = !isFailed;
                    //重新开始
                    initSnake();
                }
                //设置开始
                else {
                    isStart = !isStart;
                }
    
                //判断开始后循环播放背景音乐
                if(isStart){
                    bgm.loop(Clip.LOOP_CONTINUOUSLY);
                }
                //未开始和暂停则不播放背景音乐
                else {
                    bgm.stop();
                }
                //重新绘图
                repaint();
            }
            //右键处理并设置不能回头
            else if(keyCode == KeyEvent.VK_LEFT && fx != "R"){
                fx = "L";
            }
            //左键
            else if(keyCode == KeyEvent.VK_RIGHT && fx != "L"){
                fx = "R";
            }
            //上键
            else if(keyCode == KeyEvent.VK_UP && fx != "D"){
                fx = "U";
            }
            //下键
            else if(keyCode == KeyEvent.VK_DOWN && fx != "U"){
                fx = "D";
            }
    
        }
    
        //接口要求的实现方法
        @Override
        public void keyReleased(KeyEvent e) {
    
        }
    
        //事件监听
        @Override
        public void actionPerformed(ActionEvent e) {
            //开始且没有失败的情况
            if(isStart && !isFailed){
                //循环移动蛇身
                for(int i=len-1;i>0;i--){
                    snakex[i]=snakex[i-1];
                    snakey[i]=snakey[i-1];
                }
                //向右移动并判断是否撞墙,撞墙则失败
                if(fx == "R"){
                    snakex[0]=snakex[0]+25;
                    if(snakex[0]>825)isFailed=true;
                }
                //向左移动并判断是否撞墙,撞墙则失败
                else if(fx == "L"){
                    snakex[0]=snakex[0]-25;
                    if(snakex[0]<50)isFailed=true;
                }
                //向上移动并判断是否撞墙,撞墙则失败
                else if(fx == "U"){
                    snakey[0]=snakey[0]-25;
                    if(snakey[0]<100)isFailed=true;
                }
                //向下移动并判断是否撞墙,撞墙则失败
                else if(fx == "D"){
                    snakey[0]=snakey[0]+25;
                    if(snakey[0]>625)isFailed=true;
                }
    
                //吃到食物的判断
                if(snakex[0]==foodx&&snakey[0]==foody){
                    //身体加长,分加多,并且随机生成新食物
                    len++;
                    score += 10;
                    foodx = 25 + 25 * random.nextInt(34);
                    foody = 75 + 25 * random.nextInt(24);
                }
    
                //撞到自身的处理
                for(int i=1;i<len;i++){
                    if(snakex[i]==snakex[0] && snakey[i]==snakey[0]){
                        isFailed = true;
                    }
                }
    
                //重新绘图
                repaint();
            }
            //事件刷新
            timer.start();
        }
    
        //加载背景音乐
        public void loadBGM(){
            try {
                //从类所在文件引入
                bgm = AudioSystem.getClip();
                InputStream is = this.getClass().getClassLoader().getResourceAsStream("com/company/sound/bgm.wav");
                AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(is));
                bgm.open(ais);
                //bgm.loop(Clip.LOOP_CONTINUOUSLY);
            }
            //相应的异常处理
            catch (LineUnavailableException e) {
                e.printStackTrace();
            }
            catch (UnsupportedAudioFileException e) {
                e.printStackTrace();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //加载图片
        public void loadImages(){
            InputStream is;
            try {
                //依次添加响应元素
                is = getClass().getClassLoader().getResourceAsStream("com/company/img/title.jpg");
                title = new ImageIcon(ImageIO.read(is));
                is = getClass().getClassLoader().getResourceAsStream("com/company/img/body.png");
                body = new ImageIcon(ImageIO.read(is));
                is = getClass().getClassLoader().getResourceAsStream("com/company/img/up.png");
                up = new ImageIcon(ImageIO.read(is));
                is = getClass().getClassLoader().getResourceAsStream("com/company/img/down.png");
                down = new ImageIcon(ImageIO.read(is));
                is = getClass().getClassLoader().getResourceAsStream("com/company/img/left.png");
                left = new ImageIcon(ImageIO.read(is));
                is = getClass().getClassLoader().getResourceAsStream("com/company/img/right.png");
                right = new ImageIcon(ImageIO.read(is));
                is = getClass().getClassLoader().getResourceAsStream("com/company/img/food.png");
                food = new ImageIcon(ImageIO.read(is));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    

    package com.company;

    import javax.swing.*;

    public class Main {

    public static void main(String[] args) {
        //创建窗体对象
        JFrame frame = new JFrame();
        //创建窗体参数()
        frame.setBounds(10,10,900,720);
        //设置不允许更改大小
        //frame.setResizable(false);
        //设置关闭方式
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //添加主题逻辑框架
        frame.add(new Mpanel());
        //设置窗体可见
        frame.setVisible(true);
    }
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境