0


Java实现贪吃蛇大作战小游戏(完整版)

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


效果展示



效果展示

一、游戏界面

二、得分情况


项目介绍

项目背景

“贪吃蛇大作战”游戏是一个经典的游戏,它因操作简单、娱乐性强,自从计算机实现以来,深受广大电脑玩家的喜爱,本项目基于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的面向对象编程有更加深入的理解和认识。


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


🥰以上就是本篇博客的全部内容,如果对你有用麻烦关注点赞收藏三连走一波!
👋如有问题欢迎留言,如有错误烦请指正,期待你的评论!
👨‍💻个人主页: 青00 (一起学Java)的博客_CSDN博客-一起学Java,Java领域博主

🤳我的《一起学Java》板块持续更新中,欢迎各位编程爱好者前来观看!

标签: java 开发语言

本文转载自: https://blog.csdn.net/m0_63947499/article/details/125339199
版权归原作者 青00 (一起学Java) 所有, 如有侵权,请联系我们删除。

“Java实现贪吃蛇大作战小游戏(完整版)”的评论:

还没有评论