用户国营 发表于 2022-6-25 02:49:13

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

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

https://img-blog.csdnimg.cn/51415721570c4600bd582b32f70aca14.png
目录

效果展示
一、游戏界面
二、得分情况
 项目介绍
项目背景
总体需求
实现过程
代码展示
主类 :Demo类
 MyPanel类
 ①构造方法
 ②初始化方法
 ③绘制方法
 ④定时器执行方法
框架Ui类
项目结构
总结

效果展示

一、游戏界面

https://img-blog.csdnimg.cn/a7e8dd4c5d244756bbaf4c2c36e28a2c.png
二、得分情况

https://img-blog.csdnimg.cn/f4351a8f1da549dba037ec8555dc02d1.png
 项目介绍

项目背景

   “贪吃蛇大作战”游戏是一个经典的游戏,它因操作简单、娱乐性强,自从计算机实现以来,深受广大电脑玩家的喜爱,本项目基于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;//坐标
int[] snakeY=new int;
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=100;
        snakeY=150;
        snakeX=75;
        snakeY=150;
        snakeX=50;
        snakeY=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, snakeY);
                       
               //蛇身
               for(int i=1;i<length;i++){
                       new ImageIcon("C:/Users/Desktop/img/body.png").paintIcon(This, g, snakeX, snakeY);
               }
               //游戏的提示语
               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();
} 框架Ui类

@Override
        public void actionPerformed(ActionEvent e) {
                //改变蛇的位置
                if(ifStart==true){
                        for(int i=length-1;i>0;i--){
                                snakeX=snakeX;
                                snakeY=snakeY;
                        }
                        if(fx.equals("l")){
                                snakeX=snakeX-25;
                          if(snakeX<25){
                                        snakeX=1450;
                                }
                        }else if(fx.equals("r")){
                                snakeX=snakeX+25;
                                if(snakeX>1450){
                                        snakeX=25;
                                }
                        }else if(fx.equals("u")){
                                snakeY=snakeY-25;
                                if(snakeY<120){
                                        snakeY=800;
                                }
                        }else if(fx.equals("d")){
                                snakeY=snakeY+25;
                                if(snakeY>800){
                                        snakeY=120;
                                }
                        }
                        //判断是否吃了食物
                        if(snakeX==foodx&&snakeY==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
               
        }
} 项目结构

https://img-blog.csdnimg.cn/247b90152bc74b66a4a371819bef483e.png
本程序用于初学者学习,共封装三个类,分别是Demo类,MyPanel类,框架Ui类,结构简单,所有方法均在MyPanel类中实现。 
总结

   本游戏的设计思路类似于游戏“贪吃蛇大作战”,程序在一些功能的实现上还存在许多不足,但该项目的实现对Java新手的实战能力有很大的提升。
在使用Java编写该项目时遇到了很多问题,在解决问题时,可以对java的面向对象编程有更加深入的理解和认识。
本项目在一定程度上还有缺陷,仅用于初学者学习,欢迎各位指正。


   
 
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Java实现贪吃蛇大作战小游戏(完整版)