Java贪吃蛇全代码

Java贪吃蛇全代码用Java编写精典小游戏——贪吃蛇!前言  我想贪吃蛇应该是不少90后和00后的童年(我本人是01年的),回想起从前偷偷拿着我爹的诺基亚在被窝里玩贪吃蛇,不禁感慨万分,时间飞逝,没想到10年后的我也可以自己做一个贪吃蛇了。    该程序主要实现了以下功能:  1.按空格开始游戏、暂停游戏或重新开始游戏。  2.方向键控制蛇移动的方向。  3.蛇吃掉食物可以增长,并增加游戏分数(不会加快游戏速度)。  4.蛇咬到自己会结束游戏。  5.蛇撞到游戏区域外会结束游戏。    接下来放

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

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

前言

  我想贪吃蛇应该是不少90后和00后的童年(我本人是01年的),回想起从前偷偷拿着我爹的诺基亚在被窝里玩贪吃蛇,不禁感慨万分,时间飞逝,没想到10年后的我也可以自己做一个贪吃蛇了。
  
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  
该程序主要实现了以下功能:
  1.按空格开始游戏、暂停游戏或重新开始游戏。
  2.方向键控制蛇移动的方向。
  3.蛇吃掉食物可以增长,并增加游戏分数(不会加快游戏速度)。
  4.蛇咬到自己会结束游戏。
  5.蛇撞到游戏区域外会结束游戏。
  
  接下来放出源码,为了让初学者也能够理解,我尽量将大部分代码写了注释:
  

测试类

public class Test { 
   
    public static void main(String[] args) { 
   
        Snake snake = new Snake();
        snake.myJFrame();
    }
}

  

Snake类

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.net/148854.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Oracle如何创建数据库[通俗易懂]

    Oracle如何创建数据库[通俗易懂]C:\Users\爸爸>sqlplus–执行OracleSQL*Plus:Release11.2.0.1.0Productionon星期四3月1014:14:052022Copyright(c)1982,2010,Oracle.Allrightsreserved.请输入用户名:system–用户名输入口令:–密码连接到:OracleDatabase11gEnterpriseEditionRelease11.2.0.1….

    2022年9月22日
    3
  • 图片和Base64编码相互转换[通俗易懂]

    图片和Base64编码相互转换[通俗易懂]https://www.cnblogs.com/hzhl/articles/14919747.html

    2022年6月5日
    26
  • JRTPLib的编译步骤「建议收藏」

    JRTPLib的编译步骤「建议收藏」JRTPLib的编译步骤JRTPLib是RTP协议的开源版库,下面讲述在VS2008上面的编译步骤JRTPLIB开源库包括两个jthread.lib和jrtplib.lib下载链接:jthread:http://research.edm.uhasselt.be/%7Ejori/page/index.php?n=CS.Jrtplibjrtplib:http://rese

    2022年7月28日
    19
  • jmeter常见面试题_hr面试问题大全及答案

    jmeter常见面试题_hr面试问题大全及答案问题列表在项目中如何用jmeter进行http接口测试?Jmeter常用元件有哪些?jmeter如何管理cookie和session信息?jmeter中如何实现关联?jmeter中断言方式?jmeter参数化的方式有哪几种可以实现?Jmeter怎么录制,怎么过滤?JMeter结果树响应数据中文乱码如何解决?用户定义的变量和用户参数的区别?Jmeter怎么实现持续集成测试?在项目中如何用jmeter进行http接口测试?(重点)在Jmeter安装目录bin中,找到jmet

    2022年9月30日
    2
  • 免费个人网页制作指南Dreamweaver教程

    免费个人网页制作指南Dreamweaver教程1.网页是什么1.1.什么是网页网页的称作HTML文件,是一种可以在www网上传输,并被浏览器识别和翻译成文本页面显示出来的文件。WWW的全名是“WorldWideWeb”;HTML的全称是“HypertextMarkupLanguage”,中文翻译为“超文本标记语言”。“超文本”就是指页面内可以包含图片、链接、甚至音乐,程序等非文字的元素。网页就是由H

    2022年6月5日
    49
  • LLDP简介

    LLDP简介1.1.1LLDP产生背景目前,网络设备的种类日益繁多且各自的配置错综复杂,为了使不同厂商的设备能够在网络中相互发现并交互各自的系统及配置信息,需要有一个标准的信息交流平台。LLDP(LinkLayerDiscoveryProtocol,链路层发现协议)就是在这样的背景下产生的,它提供了一种标准的链路层发现方式,可以将本端设备的信息(包括主要能力、管理地址、设备标识、接口标识等)组织成不同的TLV(Type/Length/Value,类型/长度/值),并封装在LLDPDU(Lin…

    2022年5月28日
    91

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号