Java实现贪吃蛇大作战游戏

简介: Java实现贪吃蛇大作战游戏

大家好,今天尝试用swing技术写一个贪吃蛇大作战小游戏,供大家参考。


效果展示


目录

效果展示

一、游戏界面

二、得分情况

项目介绍

项目背景

总体需求

实现过程

代码展示

主类 :Demo类

MyPanel类

①构造方法

②初始化方法

③绘制方法

④定时器执行方法

框架Ui类

项目结构

总结



效果展示

一、游戏界面

二、得分情况


项目介绍

项目背景

“贪吃蛇大作战”游戏是一个经典的游戏,它因操作简单、娱乐性强,自从计算机实现以来,深受广大电脑玩家的喜爱,本项目基于Java技术,开发了一个 操作简单、界面美观、功能较齐全 的“贪吃蛇”游戏。通过本游戏的开发,达到学习Java技术熟悉软件开发流程的目的。

总体需求

本系统主要是完成贪吃蛇游戏的基本操作,用户可自己练习和娱乐。需要满足以下几点要求:

(1)利用方向键来改变蛇的运行方向。

(2)空格键暂停或继续游戏,并在随机的地方产生食物。

(3)吃到食物就变成新的蛇体(蛇身长度变长,游戏继续)。

实现过程

(1)绘制窗体对象。

(2)静态UI设计(包括小蛇,食物,游戏区域和标题区域)。

(3)使用键盘监听事件和定时器实现小蛇的移动。

(4)小蛇与食物碰撞的实现。

(5)定义变量存放小蛇长度,遍历数组实现小蛇身体的增加功能。

(6)退出条件:当游戏积分到达指定分数,游戏退出。


代码展示

主类 :Demo类

package Demo;
/**
 * 1.画出窗体对象
 * 
 * 
 * @author 青00-Java
 *
 */
public class Demo0 {
}

MyPanel类

构造方法

package Demo;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
//画布类
public class MyPanel extends JPanel implements KeyListener,ActionListener{//继承
  private static final Component This = null;
//键盘监听交互接口
int length;
int score;
int[] snakeX=new int[500];//坐标
int[] snakeY=new int[500];
String fx;
boolean ifStart=false;
//定时器
Timer timer =new Timer(100,this);
int foodx;
int foody;
Random random =new Random();
public MyPanel(){
  init();
  //添加监听事件
  this.setFocusable(true);
  this.addKeyListener(this);
  score=0;
}

初始化方法

public void init(){
  length=3;
  fx="r";
  //初始化小蛇的位置
  snakeX[0]=100;
  snakeY[0]=150;
  snakeX[1]=75;
  snakeY[1]=150;
  snakeX[2]=50;
  snakeY[2]=150;
  foodx=25+25*random.nextInt(57);
  foody=125+25*random.nextInt(27);
  System.out.println(foodx);
  System.out.println(foody);
  timer.start();
}

绘制方法

@Override
   protected void paintComponent(Graphics g){//画笔对象
     super.paintComponent(g);
     //绘制顶部的标题
     new ImageIcon("C:/Users/Desktop/img/title2.png").paintIcon(this,g,25,11);//创建对象
     //绘制游戏区域
     g.fillRect(25, 125, 1450, 700);
     //绘制小蛇
     //蛇头
     new ImageIcon("C:/Users/Desktop/img/l.png").paintIcon(this, g, snakeX[0], snakeY[0]);
     //蛇身
     for(int i=1;i<length;i++){
       new ImageIcon("C:/Users/Desktop/img/body.png").paintIcon(This, g, snakeX[i], snakeY[i]);
     }
     //游戏的提示语
     if(ifStart==false){
       g.setColor(Color.white);
       g.setFont(new Font("微软雅黑",Font.BOLD,40));
       g.drawString("按压空格键继续游戏", 550,500);
       g.drawString("无尽模式", 650,400);
     }
     //画出食物的位置
     new ImageIcon("C:/Users/Desktop/img/body.png").paintIcon(this, g, foodx, foody);
  }
  @Override//按压
  public void keyPressed(KeyEvent e) {
    int keyCode=e.getKeyCode();
    if(keyCode==KeyEvent.VK_SPACE){
      ifStart=!ifStart;
    }
    if(ifStart==true){
      if(keyCode==KeyEvent.VK_LEFT&&fx!="r"){
        fx="l";
      }else if(keyCode==KeyEvent.VK_RIGHT&&fx!="l"){
        fx="r";
      }else if(keyCode==KeyEvent.VK_UP&&fx!="d"){
        fx="u";
      }else if(keyCode==KeyEvent.VK_DOWN&&fx!="u"){
        fx="d";
      }
  }
    repaint();
}

定时器执行方法

@Override
  public void actionPerformed(ActionEvent e) {
    //改变蛇的位置
    if(ifStart==true){
      for(int i=length-1;i>0;i--){
        snakeX[i]=snakeX[i-1];
        snakeY[i]=snakeY[i-1];
      }
      if(fx.equals("l")){
        snakeX[0]=snakeX[0]-25;
          if(snakeX[0]<25){
          snakeX[0]=1450;
        }
      }else if(fx.equals("r")){
        snakeX[0]=snakeX[0]+25;
        if(snakeX[0]>1450){
          snakeX[0]=25;
        }
      }else if(fx.equals("u")){
        snakeY[0]=snakeY[0]-25;
        if(snakeY[0]<120){
          snakeY[0]=800;
        }
      }else if(fx.equals("d")){
        snakeY[0]=snakeY[0]+25;
        if(snakeY[0]>800){
          snakeY[0]=120;
        }
      }
      //判断是否吃了食物
      if(snakeX[0]==foodx&&snakeY[0]==foody){
        length++;
        score++;
        if(score==100){
          ifStart=!ifStart;
        }
        foodx=25+25*random.nextInt(57);
        foody=125+25*random.nextInt(27);
        System.out.print("当前食物坐标("+foodx+",");
        System.out.print(foody+")");
        System.out.println("|||当前分数:"+score+" ");
      }
      repaint();
    }
    timer.start();
  }
  @Override
  public void keyReleased(KeyEvent arg0) {
    // TODO Auto-generated method stub
  }
  @Override
  public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub
  }
}

框架Ui类

package Demo;
import javax.swing.JFrame;
public class Ui {
  public static void main(String[] args){
    JFrame frame=new JFrame("无尽版贪吃蛇");
    frame.setSize(1500, 900);
    frame.setLocationRelativeTo(null);//居中显示
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(true);
    frame.add(new MyPanel());
    frame.setVisible(true);
  }
}

项目结构

本程序用于初学者学习,共封装三个类,分别是Demo类,MyPanel类,框架Ui类,结构简单,所有方法均在MyPanel类中实现。


总结

本游戏的设计思路类似于游戏“贪吃蛇大作战”,程序在一些功能的实现上还存在许多不足,但该项目的实现对Java新手的实战能力有很大的提升。

在使用Java编写该项目时遇到了很多问题,在解决问题时,可以对java的面向对象编程有更加深入的理解和认识。


本项目在一定程度上还有缺陷,仅用于初学者学习,欢迎各位指正。


相关文章
|
7月前
|
设计模式 人工智能 前端开发
现代 Java 实现数字华容道与石头迷阵游戏的项目实战及项目开发指南
本项目基于Java 17+,采用JavaFX与MVC架构,实战开发数字华容道/石头迷阵游戏。内容涵盖技术选型、核心逻辑、现代GUI设计、动画实现及项目打包发布,结合sealed class、record等新特性,打造简洁可维护的游戏代码结构。
282 0
|
8月前
|
机器学习/深度学习 存储 Java
Java 大视界 -- Java 大数据机器学习模型在游戏用户行为分析与游戏平衡优化中的应用(190)
本文探讨了Java大数据与机器学习模型在游戏用户行为分析及游戏平衡优化中的应用。通过数据采集、预处理与聚类分析,开发者可深入洞察玩家行为特征,构建个性化运营策略。同时,利用回归模型优化游戏数值与付费机制,提升游戏公平性与用户体验。
|
Java
Java实现贪吃蛇游戏
本文介绍了如何使用Java实现一个简单的贪吃蛇游戏。
699 4
|
IDE Java API
Java游戏开发基础:从零开始制作一个简单的2D游戏
本文介绍了使用Java开发一个简单的2D避障游戏的基础流程。
1277 10
|
开发框架 IDE Java
java制作游戏,如何使用libgdx,入门级别教学
本文是一篇入门级教程,介绍了如何使用libgdx游戏开发框架创建一个简单的游戏项目,包括访问libgdx官网、设置项目、下载项目生成工具,并在IDE中运行生成的项目。
824 1
java制作游戏,如何使用libgdx,入门级别教学
|
缓存 Java 调度
【Java 并发秘籍】线程池大作战:揭秘 JDK 中的线程池家族!
【8月更文挑战第24天】Java的并发库提供多种线程池以应对不同的多线程编程需求。本文通过实例介绍了四种主要线程池:固定大小线程池、可缓存线程池、单一线程线程池及定时任务线程池。固定大小线程池通过预设线程数管理任务队列;可缓存线程池能根据需要动态调整线程数量;单一线程线程池确保任务顺序执行;定时任务线程池支持周期性或延时任务调度。了解并正确选用这些线程池有助于提高程序效率和资源利用率。
275 2
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
226 1
|
Java 索引
Java实现扑克牌游戏 | 随机发牌 ( 过程拆分详解+完整代码 )
Java实现扑克牌游戏 | 随机发牌 ( 过程拆分详解+完整代码 )
579 3
使用java编写猜数字游戏
使用java编写猜数字游戏
140 0
|
前端开发 JavaScript Java
计算机Java项目|游戏美术外包管理信息系统
计算机Java项目|游戏美术外包管理信息系统
186 2