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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java基础入门(一)[通俗易懂]

    前言:1.笔者的java没有经过真正系统的学习过,只是跟着书上自学的。所以有些地方难免会理解错误之类的,如果看到错误的地方,请指出来,或者有什么不理解的地方也可以提出来,大家一起进步。2.这篇教程是一个学习方向的引导,且只针对基础入门(更加进阶的知识笔者也还在学习)。3.java的基础入门知识网上有很多,很多大神的博客里也有总结,笔者不认为自己能比大神总结的好。所以在这篇教程里,…

    2022年4月6日
    36
  • SSRS报表连接超时的问题

    SSRS报表连接超时的问题

    2021年11月26日
    71
  • std::vector find_vectornator工具使用

    std::vector find_vectornator工具使用vector本身是没有find这一方法,其find是依靠algorithm来实现的。#include<iostream>#include<algorithm>#include<vector>intmain(){usingnamespacestd;vector<int>vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);v

    2022年8月31日
    1
  • C语言学习——函数(含递归)

    C语言学习——函数(含递归)一、函数的几点说明:(1) 一个源文件由一个或者多个函数组成。(2) 一个C程序由一个或者多个源文件组成。(3) C程序的执行从 main 函数开始。(4) 所有的子函数都是平行的。(5) 从用户的角度看,函数分库函数和自定义函数。(6) 函数形式:①无参函数:主调函数无数据传送给被调函数,可带或不带返回值。②有参函数:主调函数与被调函数间有参数传递,主调函数可将实参传送给被调函数…

    2022年8月18日
    3
  • rabbitmq实际使用案例_沉默的螺旋案例

    rabbitmq实际使用案例_沉默的螺旋案例一.简单模式(队列–>交换机)yml配置:server:port:8088spring:rabbitmq:host:127.0.0.1port:5672username:guestpassword:guestpublisher-confirm-type:correlated#消息确认方式,通过correlated来确认(将来的消息中才会带correlation_id,只有通过correlation_

    2022年10月3日
    0
  • Taglib自定义万能标签扩展 DownLoad

    Taglib自定义万能标签扩展 DownLoad

    2021年10月23日
    37

发表回复

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

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