基于java实现贪吃蛇小游戏,主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。

开发工具:eclipse

java工具包:jdk1.8

一、创建新项目

创建一个新的项目,并命名。创建一个名为images的文件夹用来存放游戏相关图片。然后再在项目的src文件下创建一个com.xxx.view的包用来存放所有的图形界面类,创建一个com.xxx.controller的包用来存放启动的入口类(控制类)。如下所示;

二、主要的游戏界面

1.代码

package com.snake.view;import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;public class SnakeJPanel extends JPanel implements ActionListener{private boolean start;//当前游戏状态private int speed;//速度private boolean exist;//当前是否存在食物private int foodType;//食物种类private int x;//豆子的横坐标private int y;//豆子的纵坐标private ArrayList<int[]> localList;//蛇public String direction;//方向private String direction2;//引导方向public boolean flag;Random rand = new Random();private ImageIcon up;private ImageIcon down;private ImageIcon right;private ImageIcon left;private ImageIcon body;private ImageIcon food;private ImageIcon title;Timer time;private int score;//当前得分情况private int num;//吃到的食物个数//    private Image offScreenImage;  //图形缓存//图片绘制@Overridepublic void paint(Graphics g) {direction = direction2;g.setColor(Color.WHITE);g.fillRect(0, 0, 900, 700);//绘制游戏框//标题框
//      g.drawRect(25, 30, 800, 75);title.paintIcon(this, g, 25, 10);//内容框g.setColor(Color.black);g.fillRect(25, 75, 850, 600);//绘制食物的坐标位置if(!exist) {//如果当前不存在豆子,随机绘制一个豆子  if(num % 5 == 0) {foodType = 1;}else {foodType = 0;}boolean isProduce = true;while(isProduce) {isProduce = false;x = rand.nextInt(33) * 25 + 25;        y = rand.nextInt(23) * 25 + 75;           for (int[] arr:localList) {if(x == arr[0] && y == arr[1]) { isProduce = true;break;    }}}         System.out.println(x + "---" + y);}if(eat()) {exist = false;}else {exist = true;}if(foodType == 0) {//绘制食物g.setColor(Color.blue);
//          g.fillRect(x, y, 25, 25);g.drawImage(food.getImage(),x, y, 25, 25,null);}else {//绘制食物g.setColor(Color.WHITE);g.fillRect(x, y, 25, 25);
//          g.drawImage(food.getImage(),x, y, 25, 25,null);}//绘制头g.setColor(Color.red);
//      g.fillRect(localList.get(0)[0], localList.get(0)[1], 25, 25);   ImageIcon head = null;//判断当前方向if(direction.equals("R")) {head = right;}else if(direction.equals("L")) {head = left;}else if(direction.equals("U")) {head = up;}else if(direction.equals("D")) {head = down;}
//      g.drawImage(head.getImage(), localList.get(0)[0], localList.get(0)[1], 25, 25,null);head.paintIcon(this, g,localList.get(0)[0], localList.get(0)[1]);//绘制身体g.setColor(Color.white);for (int i = 1; i < localList.size(); i++) {
//          g.fillRect(localList.get(i)[0], localList.get(i)[1], 25, 25);
//          g.drawImage(body.getImage(), localList.get(i)[0], localList.get(i)[1], 25, 25,null);body.paintIcon(this, g, localList.get(i)[0], localList.get(i)[1]);}
//      g.fillRect(localList.get(1)[0], localList.get(1)[1], 25, 25);
//      g.fillRect(localList.get(2)[0], localList.get(2)[1], 25, 25);//绘制分数和长度//长度g.setColor(Color.GREEN);g.setFont(new Font("宋体", Font.BOLD, 18));g.drawString("长度:" + (localList.size() - 1), 25, 30);//分数g.drawString("分数:" + score, 25, 48);if(!start) {//如果游戏未启动,结束移动和重绘g.setColor(Color.white);g.setFont(new Font("宋体", Font.BOLD, 30));g.drawString("暂停/开始(请按任意键开始,空格键暂停)", 150, 300);time.stop();}else {time.start();}//      speed();//移动后进行下一次绘制
//      move();//移动
//      repaint();//重新绘制        }// //解决闪烁问题
//  //如果为JFrame 为重量级  程序不会调用update()方法
//  //如果为Frame 为轻量级  重写update()方法 做双缓冲
//  //如果为JPanel 不会闪烁
//    @Override
//      public void update(Graphics g)
//      {
//          System.out.println("update");
//             if(offScreenImage == null)
//                offScreenImage = this.createImage(900, 700);  //新建一个图像缓存空间,这里图像大小为800*600
//                Graphics gImage = offScreenImage.getGraphics();  //把它的画笔拿过来,给gImage保存着
//                paint(gImage);                                   //将要画的东西画到图像缓存空间去
//                g.drawImage(offScreenImage, 0, 0, null);         //然后一次性显示出来
//      }@Overridepublic void actionPerformed(ActionEvent e) {     //移动后进行下一次绘制        move();//移动repaint();//重新绘制     }/*** 绘制速度*/
//  private void speed() {
//      try {//按一定速度进行移动
//          Thread.sleep(speed);//控制移动速度
//      } catch (InterruptedException e) {
//          // TODO 自动生成的 catch 块
//          e.printStackTrace();
//      }
//  }/*** 初始化图片*/private void drawImage() {up = new ImageIcon("images/up.png");down = new ImageIcon("images/down.png");right = new ImageIcon("images/right.png");left = new ImageIcon("images/left.png");body = new ImageIcon("images/body.png");food = new ImageIcon("images/food.png");title = new ImageIcon("images/title.jpg");}private boolean eat() {if(localList.get(0)[0] == x && localList.get(0)[1] == y) {//如果当前蛇头吃到了豆子System.out.println("eat");num++;if(foodType == 0) {score += 10;}else {score += (rand.nextInt(5) * 10 + 10);}int last = localList.size() - 1;//蛇尾         //在蛇尾后面添加一节身体localList.add(new int[] {localList.get(last)[0],localList.get(last)[1]});return true;}return false;}//移动方法public void move() {//判断是否游戏结束if(isbody()) {System.out.println("game over");start = false;//结束游戏移动JOptionPane.showMessageDialog(null,"游戏已结束!");time.stop();init();       }if(flag && localList != null) {//如果长度不为空且游戏未结束                int last = localList.size() - 1;//记录蛇尾for (int i = last; i > 0; i--) {//从蛇尾开始,每节身体移动到前一节身体的位置上localList.set(i,new int[] {localList.get(i - 1)[0],localList.get(i - 1)[1]});}//记录头位置int[] local = localList.get(0);//判断当前方向,并进行模拟移动,判断是否与边界重合if(direction.equals("R")) {if(local[0] >= 850) {local[0] = 25;}else {local[0] += 25;}}else if(direction.equals("L")) {if(local[0] <= 25) {local[0] = 850;}else {local[0] -= 25;}}else if(direction.equals("U")) {if(local[1] <= 75) {local[1] = 650;}else {local[1] -= 25;}}else if(direction.equals("D")) {if(local[1] >= 650) {local[1] = 75;}else {local[1] += 25;}}           //更改头的位置localList.set(0, local);        }   }//判断下一步是否为蛇身private boolean isbody() {// TODO 自动生成的方法存根//记录头位置int x = localList.get(0)[0];int y = localList.get(0)[1];//判断当前方向,并进行模拟移动,判断是否与边界重合if(direction.equals("R")) {x += 25;}else if(direction.equals("L")) {x -= 25;}else if(direction.equals("U")) {y -= 25;}else if(direction.equals("D")) {y += 25;}         for (int i = 1; i < localList.size(); i++) {if(localList.get(i)[0] == x && localList.get(i)[1] == y) {return true;}}return false;}//  //判断下一步是否为边界
//  private boolean isborder() {
//      // TODO 自动生成的方法存根
//      //记录头位置
//      // TODO 自动生成的方法存根
//      //记录头位置
//      int x = localList.get(0)[0];
//      int y = localList.get(0)[1];
//
//      //判断当前方向,并进行模拟移动,判断是否与边界重合
//      if(direction.equals("R")) {
//          x += 25;
//      }else if(direction.equals("L")) {
//          x -= 25;
//      }else if(direction.equals("U")) {
//          y -= 25;
//      }else if(direction.equals("D")) {
//          y += 25;
//      }
//
//      if(x < 25 || x > (33 * 25 + 25)) {
//          return true;//当x坐标超出边界,则返回true
//      }
//      if(y < 105 || y > (23 * 25 + 105)) {
//          return true;//当y坐标超出边界,则返回true
//      }
//      return false;//蛇头移动后未超出边界,返回false
//
//  }/*** Create the frame.*/public SnakeJPanel(int speed) {this.speed = speed; //初始化速度//初始化游戏面板的基本信息this.setSize(900, 700);this.setLocation(0, 30);this.setFocusable(true);init();//初始化界面drawImage();//绘制图片moveByKey();//给界面添加一个键盘监听}/** 键盘监听* 通过键盘输入上下左右来控制当前蛇头移动的方向* 先判断当前蛇头方向,再来改变引导方向* 当进行绘制时再修改蛇的方向* 保证不会因为在短时间内快速变换方向导致蛇头逆向转向*/private void moveByKey() {addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {int key = e.getKeyCode();//边界值判断switch(key) {case 65:case 37:{//向左走if(!direction.equals("R")) {direction2 = "L";}break;}               case 87:case 38:{//向上走if(!direction.equals("D")) {direction2 = "U";}               break;}             case 68:case 39:{//向右走if(!direction.equals("L")) {direction2 = "R";}break;}case 83:case 40:{//向下走if(!direction.equals("U")) {direction2 = "D";}                   break;}case KeyEvent.VK_SPACE:{//如果当前键盘输入为空格start = !start;//调整游戏状态System.out.println("暂停/开始");repaint();//重绘}}//任意键开始if(!start && key != KeyEvent.VK_SPACE) {//如果当前状态为暂停状态,且键盘输入不是空格start = true;repaint();//重绘}               }});}/*** 初始化游戏基本信息*/private void init() {start = false;exist = true;direction2 = "U";flag = true;localList = new ArrayList<int[]>();localList.add(0,new int[] {75,125});//蛇头localList.add(1,new int[] {75,150});//蛇身1localList.add(2,new int[] {75,175});//蛇身2//创建第一个食物的位置//通过循环保证当前生成的食物不在身体所在的坐标上boolean isProduce = true;while(isProduce) {//循环生成食物坐标isProduce = false;//结束本次循环x = rand.nextInt(33) * 25 + 25;     y = rand.nextInt(23) * 25 + 75;           for (int[] arr:localList) {//循环遍历蛇头及蛇身的坐标if(x == arr[0] && y == arr[1]) {//如果食物坐标和蛇的某一节坐标重合isProduce = true;//跳转循环状态,继续下一次食物生成break;    }}//蛇身遍历完成,没有重合坐标,结束食物坐标生成}time = new Timer(speed, this);setLayout(null);score = 0;num = 0;foodType = 0;//        repaint();}}

三、构造启动类

package com.snake.controller;import javax.swing.JFrame;
import javax.swing.JOptionPane;import com.snake.view.SnakeJPanel;public class SnakeStart {public static void main(String[] args) {int speed = 0;String showInputDialog = null;//初始化时间//得到速度while(true) {showInputDialog = JOptionPane.showInputDialog("蛇移动速度(1 - 5)","3");if(showInputDialog == null) {showInputDialog = "3";//默认速度break;}if(showInputDialog.length() > 1) {continue;}char[] a = showInputDialog.toCharArray();if(a[0] >= '1' && a[0] <= '5') {break;}}speed = Integer.parseInt(showInputDialog) * 50;SnakeJPanel snakeJPanel = new SnakeJPanel(speed);//创建一个JFrame窗口,将游戏面板添加进行窗口中JFrame jFrame = new JFrame();//设置窗口的某些属性jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame.setSize(920, 750);jFrame.add(snakeJPanel);jFrame.setLocationRelativeTo(null);jFrame.setVisible(true);}}

四、游戏测试

设置贪吃蛇运行速度

游戏界面

使用Java实现一个简单的贪吃蛇小游戏相关推荐

  1. 基于面向对象 来写一个简单的贪吃蛇小游戏(代码可直接用)

    分析一下用到的对象(这个案例的地图过于简单,可以不用创建为对象)     食物对象(food)     蛇对象(snake)     游戏对象(game) 1.food对象     属性 :x, y, ...

  2. STM32+LCD实现简单的贪吃蛇小游戏

    寒假放假回家,只能宅在家里,无聊之余,幸好带了一块开发板回来,以前做项目都是在网上找相似或者有关联的项目,把别人的代码拿过来,修改修改,拼拼凑凑出自己项目,既然无聊就自己动脑筋思考,自己动手写贪吃蛇的 ...

  3. Python 简单实现贪吃蛇小游戏

    文章目录 1. pygame库的简介2. pygame库的安装3. python代码实现贪吃蛇小游戏4. pyinstaller打包成exe 很多人学习python,不知道从何学起. 很多人学习pyt ...

  4. c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码

    /* *程序名称:贪吃蛇v2.1 *程序描述:一个简易的贪吃蛇小游戏 *版本信息:v2.1 *v1.1版本更新:1:加入菜单选择项 *v1.2版本更新:1:修复菜单选择bug *v1.3班本更新:1: ...

  5. 无聊的时候怎么办?教你用java写一个简单挂机打金币小游戏吧!

    无聊的时候怎么办?教你用java写一个超简单挂机打金币小游戏吧! Java写一个挂机打金币程序 1.Java的面向对象 2.基础打金的分析 3. Robot介绍以及Demo演示 4.挂机打金程序如何去 ...

  6. android 简单的贪吃蛇小游戏

    贪吃蛇是一款经典的小游戏,游戏比较简单,实现也比较简单. 本篇博客将详细介绍我自己写的贪吃蛇的思路以及实现方式. 首先我们需要在游戏界面将游戏区域划分成无数个小方格,类似下图 画布(游戏区域)的宽为 ...

  7. QT实现简单的贪吃蛇小游戏

    一.新建一个Qt项目 新建Qt Widgets Application,项目名称为HappySnake,基类选择QWidget,类名默认 二.添加要用到的头文件 #include <QKeyEv ...

  8. 如何利用JAVA编写一个简单的石头剪刀布的小游戏

    楼主为了完成作业,花了一小会时间自己琢磨了一下,写出了这个石头剪刀布的小游戏. 思路很简单,就是令石头=2,剪刀=1,布=0,那么电脑随机生成一个数,分别去对应,游戏者同时也输入一个数字,也是对应着前 ...

  9. python简易贪吃蛇小游戏任务书含代码

    目  录 第一章 绪论 1.1 开发的背景 1.2 开发的目的 1.3 开发的意义 1.4 开发工具简介 第二章 需求分析 (1) 利用方向键来改变蛇的运行方向. (2) 在随机的地方产生食物. (3 ...

  10. 100行代码,使用 Pygame 制作一个贪吃蛇小游戏!

    作者 | 周萝卜 来源 | 萝卜大杂烩 相信我们大家都玩过贪吃蛇游戏,今天我们就从头一起来写一个贪吃蛇小游戏,只需要100多行的代码就完成了. 用到的 Pygame 函数 贪吃蛇小游戏用到的函数 功能 ...

最新文章

  1. ftp 工具_ftp,ftp工具多大
  2. android ble status,Android BLE peripheral disconnects with status code BLE_HCI_INSTANT_PASSED(0x28)
  3. VSCode自定义代码片段7——CSS动画
  4. 评测百万分之一时的精度指标
  5. html读取json换行无效,前端Json换行显示
  6. c++ vector向量
  7. java集成微信扫码登录
  8. 微信读书vscode插件_想用 VSCode 写书?这款插件必须备上!
  9. css 平移到某个位置_CSS3 对象平移translate()translatex()translatey()应用实例,包括水平垂直居中...
  10. 计算机基础知识教程 pdf,《计算机基础知识教程》.pdf
  11. wamp mysql服务无法启动_wamp中mysql无法启动怎么办
  12. 为什么计算机要更新,为什么要关闭windows 10更新理由详解
  13. 写一个程序,判断能否形成三角形,若能,判断是等腰三角形、等边三角形、直角三角形、锐角三角形还是钝角三角形。
  14. 嘉立创电路板制作过程全流程详解(二):沉铜、线路
  15. 华为无线设备配置WIDS和WIPS
  16. FFMpeg 否决问题
  17. Jmeter(110)——阶梯式加压线程组Stepping Thread Group
  18. 国产LINUX服务器操作系统openEuler下的轻量开源虚拟化工具stratovirt
  19. 超酷3D粒子分散PS动作_使用教程
  20. 爱普生LQ-610K针式打印机不通电维修

热门文章

  1. [免费配音软件]配音助手1.0 阿里云配音软件
  2. walking机器人入门教程-应用-全景图
  3. Reactor(反应器)模式
  4. linux0.11 阅读笔记
  5. 第十八章 Radix树路由表
  6. 最新注册谷歌账号详细步骤,解决“此电话号码无法验证”问题
  7. 单片机学习笔记5--STM32时钟系统(基于百问网STM32F103系列教程)
  8. ubuntu安装nvidia显卡驱动注意事项以及关闭ubuntu内核自动更新
  9. ie10服务器运行失败,win7系统下无法安装ie10浏览器如何解决?win7系统下无法安装ie10浏览器三种解决方法...
  10. win7 64位安装 ie10/11失败