前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java贪吃蛇全代码

Java贪吃蛇全代码

作者头像
全栈程序员站长
发布2022-09-13 15:55:24
1.1K0
发布2022-09-13 15:55:24
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

用Java编写精典小游戏——贪吃蛇!

前言

  我想贪吃蛇应该是不少90后和00后的童年(我本人是01年的),回想起从前偷偷拿着我爹的诺基亚在被窝里玩贪吃蛇,不禁感慨万分,时间飞逝,没想到10年后的我也可以自己做一个贪吃蛇了。

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

该程序主要实现了以下功能:   1.按空格开始游戏、暂停游戏或重新开始游戏。   2.方向键控制蛇移动的方向。   3.蛇吃掉食物可以增长,并增加游戏分数(不会加快游戏速度)。   4.蛇咬到自己会结束游戏。   5.蛇撞到游戏区域外会结束游戏。   接下来放出源码,为了让初学者也能够理解,我尽量将大部分代码写了注释:

测试类

代码语言:javascript
复制
public class Test { 
   
    public static void main(String[] args) { 
   
        Snake snake = new Snake();
        snake.myJFrame();
    }
}

Snake类

代码语言:javascript
复制
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class Snake extends JFrame implements KeyListener, ActionListener, MouseListener { 
   

    int slong = 2;//蛇当前长度
    //蛇坐标
    int[] Snakex = new int[100];
    int[] Snakey = new int[100];
    int fx = 1;//蛇的方向 0-左 1-右 2-上 3-下
    Timer timer = new Timer(100, this);//设置定时器,每100毫秒一次
    //食物位置
    int foodx;
    int foody;
    Random random = new Random();//随机数,随机位置生成食物
    int started = 0;//游戏信息 0-未开始 1-开始 2-结束


    //---------------------------------------------------------------------------------------------------------------------
    //窗体
    public void myJFrame() { 
   

        this.setTitle("贪吃蛇"); //标题
        this.setSize(800, 600); //窗口大小
        this.setResizable(false); //窗口是否可以改变大小=否
        this.setDefaultCloseOperation(Snake.EXIT_ON_CLOSE); //窗口关闭方式为关闭窗口同时结束程序

        int width = Toolkit.getDefaultToolkit().getScreenSize().width; //获取屏幕宽度
        int height = Toolkit.getDefaultToolkit().getScreenSize().height; //获取屏幕高度
// System.out.println("宽度:"+width);//测试
// System.out.println("高度:"+height);//测试

        this.setLocation((width - 800) / 2, (height - 600) / 2); //设置窗口默认位置以屏幕居中

        this.setFocusable(true);
        this.addKeyListener(this);


        this.setVisible(true); //窗口是否显示=是

// 蛇的初识位置
        Snakex[0] = 60;
        Snakey[0] = 100;
        Snakex[1] = 40;
        Snakey[1] = 100;

// 随机食物的初识位置
        foodx = random.nextInt(39);
        foody = random.nextInt(22);
        foodx = foodx * 20;
        foody = foody * 20 + 80;

        System.out.println(foodx + "," + foody);
    }


    //---------------------------------------------------------------------------------------------------------------------
    //覆写paint方法,绘制界面
    public void paint(Graphics g) { 
   
// 绘制背景
        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(0, 0, 800, 600);

        //绘制游戏区域
        g.setColor(Color.black);
        g.fillRect(0, 80, 800, 520);

        //绘制蛇
        for (int i = 0; i < slong; i++) { 
   
            g.setColor(Color.CYAN);
            g.fillRect(Snakex[i], Snakey[i], 20, 20);
        }


        // 绘制食物
        g.setColor(Color.yellow);
        g.fillOval(foodx, foody, 20, 20);


        if (started == 0) { 
   
            g.setColor(Color.BLACK);//设置画笔颜色
            g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
            g.drawString("按下“空格键”开始游戏", 300, 65); //绘制字符
        } else if (started == 1) { 
   
            g.setColor(Color.BLACK);//设置画笔颜色
            g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
            g.drawString("当前分数为:", 300, 65); //绘制字符
            g.drawString(String.valueOf(slong - 2), 420, 65); //绘制字符
        } else if (started == 2) { 
   
            g.setColor(Color.BLACK);//设置画笔颜色
            g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
            g.drawString("游戏结束-", 250, 65); //绘制字符
            g.drawString("最终分数为:", 350, 65); //绘制字符
            g.drawString(String.valueOf(slong - 2), 470, 65); //绘制字符
        }

    }


    // 操作监听——控制蛇的不断移动
    @Override
    public void actionPerformed(ActionEvent e) { 
   
// 判断游戏是否开始
        if (started == 1) { 
   
// 通过循环控制蛇移动
            for (int i = slong - 1; i > 0; i--) { 
   
                Snakex[i] = Snakex[i - 1];
                Snakey[i] = Snakey[i - 1];
            }

// 判断蛇移动的方向
            if (fx == 0) { 
   
                Snakex[0] = Snakex[0] - 20;
            } else if (fx == 1) { 
   
                Snakex[0] = Snakex[0] + 20;
            } else if (fx == 2) { 
   
                Snakey[0] = Snakey[0] - 20;
            } else if (fx == 3) { 
   
                Snakey[0] = Snakey[0] + 20;
            }

// 判断蛇是否撞到墙外
            if (Snakex[0] < 0 || Snakex[0] > 780 || Snakey[0] < 80 || Snakey[0] > 580) { 
   
                started = 2;
            }

// 判断蛇是否吃到了食物
            if (Snakex[0] == foodx && Snakey[0] == foody) { 
   

                slong++;

                foodx = random.nextInt(39);
                foody = random.nextInt(22);
                foodx = foodx * 20;
                foody = foody * 20 + 80;

                System.out.println(foodx + "," + foody);
            }

// 判断是否吃到了自己
            for (int i = 1; i < slong; i++) { 
   
                if (Snakex[0] == Snakex[i] && Snakey[0] == Snakey[i]) { 
   
                    started = 2;
                }
            }

// 判断食物是否随机在了蛇身上
            for (int i = 0; i < slong; i++) { 
   
                if (foodx == Snakex[i] && foody == Snakey[i]) { 
   

                    // 随机食物的初识位置
                    foodx = random.nextInt(39);
                    foody = random.nextInt(22);
                    foodx = foodx * 20;
                    foody = foody * 20 + 80;

                    System.out.println(foodx + "," + foody);
                }
            }


            repaint();
        }
        timer.start();
    }

    // 输入
    @Override
    public void keyTyped(KeyEvent e) { 
   

    }

    // 键盘按下——控制游戏的开始以及蛇的移动方向
    @Override
    public void keyPressed(KeyEvent e) { 
   
// 获取从键盘输入的键
        int key = e.getKeyCode();
// 判断是否为空格
        if (key == KeyEvent.VK_SPACE) { 
   
            if (started == 0) { 
   
                started = 1;
            } else if (started == 1) { 
   
                started = 0;
            } else if (started == 2) { 
   
                started = 0;

                slong = 2;//蛇当前长度

                // 蛇的初识位置
                Snakex[0] = 60;
                Snakey[0] = 100;
                Snakex[1] = 40;
                Snakey[1] = 100;

                // 随机食物的初识位置
                foodx = random.nextInt(39);
                foody = random.nextInt(22);
                foodx = foodx * 20;
                foody = foody * 20 + 80;

                // 初始化方向
                fx = 1;
            }

            repaint();
            timer.start();

// 左
        } else if (key == KeyEvent.VK_LEFT) { 
   
            if (fx != 1) { 
   
                fx = 0;
            }
// 右
        } else if (key == KeyEvent.VK_RIGHT) { 
   
            if (fx != 0) { 
   
                fx = 1;
            }
// 上
        } else if (key == KeyEvent.VK_UP) { 
   
            if (fx != 3) { 
   
                fx = 2;
            }
//下
        } else if (key == KeyEvent.VK_DOWN) { 
   
            if (fx != 2) { 
   
                fx = 3;
            }
        }

    }

    // 弹起
    @Override
    public void keyReleased(KeyEvent e) { 
   

    }

    // 点击
    @Override
    public void mouseClicked(MouseEvent e) { 
   

    }

    // 按下
    @Override
    public void mousePressed(MouseEvent e) { 
   

    }

    // 抬起
    @Override
    public void mouseReleased(MouseEvent e) { 
   

    }

    // 进入
    @Override
    public void mouseEntered(MouseEvent e) { 
   

    }

    // 离开
    @Override
    public void mouseExited(MouseEvent e) { 
   

    }
}

结束语

  测试的次数不多,不知道还有多少隐藏BUG,但我平常玩的时候是没有问题的,如果你在玩的时候发现了BUG欢迎来私聊我,如果能带着解决方法来的话那就更好了。   我一直坚持“分享知识”的原则,免费透明的将代码公开展示,如果帮到了你,请顺手点个赞吧(#^.^#)。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148854.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用Java编写精典小游戏——贪吃蛇!
    • 前言
      • 测试类
        • Snake类
          • 结束语
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档