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欢迎来私聊我,如果能带着解决方法来的话那就更好了。
  
  我一直坚持“分享知识”的原则,免费透明的将代码公开展示,如果帮到了你,请顺手点个赞吧(#^.^#)。
  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 一文搞懂SpringBoot自动配置原理「建议收藏」

    一文搞懂SpringBoot自动配置原理「建议收藏」阅读收获????????理解SpringBoot自动配置原理一、SpringBoot是什么SpringBoot的诞生就是为了简化Spring中繁琐的XML配置,其本质依然还是Spring框架,使用SpringBoot之后可以不使用任何XML配置来启动一个服务,使得我们在使用微服务架构时可以更加快速的建立一个应用。简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式。二、SpringBoot的特点提供了固定的配置来简化配置,即约定大于配置 尽可能地

  • MySQL数据类型

    MySQL数据类型

  • 卡尔曼滤波算法详细推导「建议收藏」

    卡尔曼滤波算法详细推导「建议收藏」一、预备知识1、协方差矩阵是一个维列向量,是的期望,协方差矩阵为可以看出协方差矩阵都是对称矩阵且是半正定的协方差矩阵的迹是的均方误差2、用到的两个矩阵微分公式公式一:公式二:若是对称矩阵,则下式成立…

  • java.nio.Buffer 中的 flip()方法

    java.nio.Buffer 中的 flip()方法

  • ODrive 通讯协议「建议收藏」

    ODrive通讯协议与ODrive进行通讯需要对通讯端点进行一系列操作。理论上,端点上的数据可以是以任何方式序列化的任何类型的数据。数据包采用默认的序列化方式,对于您自定义的数据包,您必须自己去进行反序列化。未来我们可能会提供序列化功能。可以通过从端点0读取JSON来枚举可用的端点,从理论上讲,每个接口都可以不同(实际上并没有这么做)。每个端点都可以被用来发送和接收字节数据,有效字节数据的含义在…

  • 建立数据库连接费时吗_数据库连接错误是什么原因

    建立数据库连接费时吗_数据库连接错误是什么原因相信很多朋友都遇到过WordPress提示“建立数据库连接时出错”这个问题,英文为“Errorestablishingadatabaseconnection”。[原创文章:www.777y.com]“建立数据库错误时出错”意味着由于某种原因,您的站点PHP代码无法与MySQL数据库连接以获取显示该页面所需的数据。[本文来自:www.777y.com]数据库连接出错的原因和处理方案数据库连接…

发表回复

您的电子邮箱地址不会被公开。

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