栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

用GUI编程实现简单的贪吃蛇游戏开发

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用GUI编程实现简单的贪吃蛇游戏开发

3.贪吃蛇 3.1 StartGame类

用于创建出一个静态的窗体,然后启动游戏

package com.Snake;

import javax.swing.*;

public class StartGame {
    public static void main(String[] args) {
        Jframe frame = new Jframe();
        frame.setLocation(0,0);
        frame.setSize(900,620);
        frame.setResizable(false);
        frame.add(new GamePanel());
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
3.2 Data类

用于存放调用的图片

package com.Snake;
import javax.swing.*;
import java.net.URL;
public class Data {
    public static URL headerURL=Data.class.getResource("/com/Snake/statics/header.jpg");
    public static URL bodyURL=Data.class.getResource("/com/Snake/statics/body.jpg");
    public static URL foodURL=Data.class.getResource("/com/Snake/statics/food.jpg");
    public static URL upURL=Data.class.getResource("/com/Snake/statics/up.jpg");
    public static URL downURL=Data.class.getResource("/com/Snake/statics/down.jpg");
    public static URL leftURL=Data.class.getResource("/com/Snake/statics/left.jpg");
    public static URL rightURL=Data.class.getResource("/com/Snake/statics/right.jpg");
    public static ImageIcon header=new ImageIcon(headerURL);
    public static ImageIcon body=new ImageIcon(bodyURL);
    public static ImageIcon food=new ImageIcon(foodURL);
    public static ImageIcon up=new ImageIcon(upURL);
    public static ImageIcon down=new ImageIcon(downURL);
    public static ImageIcon left=new ImageIcon(leftURL);
    public static ImageIcon right=new ImageIcon(rightURL);
}
3.3 GamePanel类

用于实现各种操作

package com.Snake;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GamePanel extends JPanel implements KeyListener, ActionListener {
    //定义蛇的数据结构
    private int lenght;//蛇的长度
    private int[] snakeX=new int[1000];//蛇的x坐标
    private int[] snakeY=new int[1000];//蛇的y坐标
    String fx;
    //食物坐标
    int foodx;
    int foody;
    Random random=new Random();
    int score;//分数

    boolean isStart=false;//游戏状态默认为没开始
    boolean isFail=false;//游戏失败状态
    Timer timer=new Timer(100,this);//定时器

    //构造器
    public GamePanel() {
        init();
        //获得焦点和键盘监听事件
        this.setFocusable(true);//获得焦点
        this.addKeyListener(this);
        timer.start();
    }
    //初始化方法
    public void init(){
        lenght=3;
        snakeX[0]=100;  snakeY[0]=100;//脑袋的坐标
        snakeX[1]=75;  snakeY[1]=100;//第一节身体坐标
        snakeX[2]=50;  snakeY[2]=100;//第二节身体坐标
        fx="R";//初始化方向向右
        //把食物随机分布在界面上
        foodx=25+25*random.nextInt(34);
        foody=75+25*random.nextInt(22);
        score = 0 ;
    }
    //画东西
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //绘制静态的画板
        this.setBackground(Color.WHITE);
        Data.header.paintIcon(this,g,25,11);//画头部广告栏
        g.fillRect(25,75,850,550);//绘制默认的游戏界面
        //画食物
        Data.food.paintIcon(this,g,foodx,foody);
        //画分数
        g.setColor(Color.BLACK);//设置颜色
        g.setFont(new Font("微软雅黑",Font.BOLD,18));//设置字体
        g.drawString("长度:"+lenght,750,35);
        g.drawString("分数:"+score,750,55);

        //把小蛇画上去
        if(fx.equals("R")){
            Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals("L")){
            Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals("U")){
            Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals("D")){
            Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        for (int i = 1; i < lenght; i++) {
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
        }
        //游戏提示,是否开始
        if(isStart==false){
            g.setColor(Color.WHITE);//设置颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
            g.drawString("按下空格开始游戏",300,300);
        }
        if(isFail){
            g.setColor(Color.RED);//设置颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
            g.drawString("失败,按下空格重新开始",300,300);
        }
    }
    //键盘监听事件
    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode=e.getKeyCode();
        if(keyCode==KeyEvent.VK_SPACE){//如果按下空格
             if(isFail){
                 //重新开始
                 isFail=false;
                 init();
             }else {
                 isStart = !isStart;

             }
            repaint();
        }
        switch (keyCode){
            case KeyEvent.VK_UP:
                if(fx!="D"){
                    fx="U";
                }
                break;
            case KeyEvent.VK_DOWN:
                if(fx!="U"){
                    fx="D";
                }
                break;
            case KeyEvent.VK_LEFT:
                if(fx!="R"){
                    fx="L";
                }
                break;
            case KeyEvent.VK_RIGHT:
                if(fx!="L"){
                    fx="R";
                }
                break;
        }
       
    }
    //定时器,执行定时操作
    @Override
    public void actionPerformed(ActionEvent e) {
        if(isStart && isFail==false){//如果游戏是开始状态,就让小蛇动起来
            //吃食物
            if(snakeX[0]==foodx && snakeY[0]==foody){
                lenght++;//长度+1
                score=score+10;
                //再次随机生成食物
                foodx=25+25*random.nextInt(34);
                foody=75+25*random.nextInt(22);
            }
            //移动
            for (int i = lenght-1; i > 0; i--) {
                snakeX[i]=snakeX[i-1];
                snakeY[i]=snakeY[i-1];
            }
            //走向
            if(fx.equals("R")){
                snakeX[0]=snakeX[0]+25;
//                if(snakeX[0]>850){//边界判断
//                    snakeX[0]=25;
//                }
            }else if(fx.equals("L")){
                snakeX[0]=snakeX[0]-25;
//                if(snakeX[0]<25){//边界判断
//                    snakeX[0]=850;
//                }
            }else if(fx.equals("U")){
                snakeY[0]=snakeY[0]-25;
//                if(snakeY[0]<75){//边界判断
//                    snakeY[0]=600;
//                }
            }else if(fx.equals("D")){
                snakeY[0]=snakeY[0]+25;
//                if(snakeY[0]>600){//边界判断
//                    snakeY[0]=75;
//                }
            }
            //失败判断,撞到自己和边就失败
            for (int i = 1; i < lenght; i++) {
                if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){//撞到自己
                    isFail=true;
                } else if(snakeX[0]>850 || snakeX[0]<25 || snakeY[0]>600 || snakeY[0]<75){//撞到边
                    isFail=true;
                }
            }
            repaint();
        }
        timer.start();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
    @Override
    public void keyTyped(KeyEvent e) {

    }
}

游戏界面:

游戏存在的问题:

  • 食物生成区域存在问题,食物会随机生成到游戏区域外,原因是设计游戏运行区域时存在问题。
  • 游戏过于简单
  • 界面太丑,所用图片全是PS做的

注意点:
调用图片资源时,注意调用的路径

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/318454.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号