java贪吃蛇游戏

Java贪吃蛇游戏

最近要考试了,但是还是抽出时间来做一个贪吃蛇玩玩,大概几天的时间吧,中途也遇到很多问题,但还是解决了,感谢狂神。

总结,开发需要一定的逻辑思维,分模块开发,把逻辑理清了,开发就不难了,希望多努力学习,

游戏的启动主类

package Snake;

import javax.swing.*;

//游戏的主启动类
public class Startgame {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame();
        //游戏界面大小
        jFrame.setBounds(10,10,900,720);
        //设置不可拉伸
        jFrame.setResizable(false);

        //设置默认关闭
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //窗口中加入面板
        jFrame.add(new GamePanel());

        //设置可见
        jFrame.setVisible(true);

    }
}

存放数据图片的类

package Snake;

import javax.swing.*;
import java.net.URL;


public class Data {
    //广告位
    public static URL ggURL = Data.class.getResource("SnakeData/gg.png");//注意 相对路径和绝对路径
    public static ImageIcon head = new ImageIcon(ggURL);
    //头部
    public static URL upURL = Data.class.getResource("SnakeData/up.png");
    public static URL downURL = Data.class.getResource("SnakeData/down.png");
    public static URL leftURL = Data.class.getResource("SnakeData/left.png");
    public static URL rightURL = Data.class.getResource("SnakeData/right.png");
    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);
    //身体
    public static URL bodyURL = Data.class.getResource("SnakeData/body.png");
    public static ImageIcon body = new ImageIcon(bodyURL);
    //食物
    public static URL foodURL = Data.class.getResource("SnakeData/food.png");
    public static ImageIcon food = new ImageIcon(foodURL);

}

面板类,包含游戏实现的细节

package 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;

/**
 * @author LiJian
 * @version 1.0
 *
 */

//绘制一个游戏,游戏中的所有东西,都是由画笔来画
public class GamePanel extends JPanel implements KeyListener,ActionListener{
    //初始化变量区
    int length;//蛇长
    int[] snakeX = new int[600];//蛇的X坐标,定义应大于游戏界面的宽度
    int[] snakeY = new int[500];
    //初始化方向
    String direction= "R";
    //刷新的间隔
    Timer timer = new Timer(100,this);
    //食物
    int foodx;
    int foody;
    Random random = new Random();
    //判断是否开始和是否失败
    boolean isFial = false;
    boolean isStart;
    //分数
    int score = 0;
    //初始构造器
    public GamePanel() {
        init();
        this.setFocusable(true);//获得焦点事件
        this.addKeyListener(this);//初始化监听事件
        timer.start();
    }

    //初始化方法,对蛇初始化位置和长度
    public void init() {
        length = 3;
        snakeX[0] = 100;snakeY[0] = 100; //蛇头的第一个坐标
        snakeX[1] = 75;snakeY[1] = 100;  //第一个身体的坐标
        snakeX[2] = 50; snakeY[2] = 100;
         isStart= false;
         foodx = 25+25*(random.nextInt(32)%32);
         foody = 75+25*(random.nextInt(22)%22);
    }

    //画组件的重写方法
    @Override
    protected void paintComponent(Graphics g) { //paintComponent画组件的方法
        super.paintComponent(g);
        //面板设置背景颜色
        this.setBackground(Color.WHITE);
        Data.head.paintIcon(this, g, 25, 11);
        //默认的游戏界面
        g.fillRect(25, 75, 850, 600);//游戏的界面
        if (direction == "R") {
            Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);//蛇头初始化向右
        } else if (direction == "L") {
            Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);
        } else if (direction == "U") {
            Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);
        } else if (direction == "D") {
            Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);
        }
        //画积分
        g.setColor(new Color(30, 229, 30));//设置画笔颜色
        g.setFont(new Font("微软雅黑", Font.BOLD, 18));//设置字体的样式,粗细,大小
        g.drawString("长度:"+length, 790, 35);
        g.drawString("积分:"+score, 790, 56);

        //画食物
        Data.food.paintIcon(this,g,foodx,foody);


        for (int i = 1; i < length; i++) {
            Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);
        }
        //开始的页面状态
        if (isStart==false) {
            g.setColor(new Color(248, 246, 246));//设置画笔颜色
            g.setFont(new Font("微软雅黑", Font.BOLD, 60));//设置字体的样式,粗细,大小
            g.drawString("按下空格键开始", 240, 350);
        }
        if (isFial){
            g.setColor(Color.RED);//设置画笔颜色
            g.setFont(new Font("微软雅黑", Font.BOLD, 60));//设置字体的样式,粗细,大小
            g.drawString("游戏失败,按下空格重新开始", 70, 350);
        }
    }//画进去的东西要变

    //监听事件
    @Override
    public void keyPressed(KeyEvent e) {
        int keycode = e.getKeyCode();//获得键盘按下的键值

        if (keycode == KeyEvent.VK_SPACE) {
            if (isFial==true){
                isFial = false;
                init();
            }else {
                isStart = !isStart;//取反,开始之后停止之后再开始
            }
                repaint();
        }
        //键盘控制走向
        if (keycode==KeyEvent.VK_UP){
            direction = "U";
        }else if (keycode==KeyEvent.VK_DOWN){
            direction = "D";
        }else if (keycode==KeyEvent.VK_LEFT){
            direction = "L";
        }else if (keycode==KeyEvent.VK_RIGHT){
          direction = "R";
       }
            //身体动起来
            for (int i = length-1; i >0 ; i--) {

                snakeX[i] = snakeX[i-1];//向前移一节
                snakeY[i] = snakeY[i-1];
            }
//        snakeX[0] = snakeX[0]+25;
            repaint();//重画
        }//按下未释放

     //动态刷新时间帧
    @Override
    public void actionPerformed(ActionEvent e) {
        if (isStart == true&&isFial==false){
            for (int i = length - 1; i > 0; i--) {
                snakeX[i] = snakeX[i - 1];
                snakeY[i] = snakeY[i - 1];
            }
            if (direction.equals("R")){
                snakeX[0] = snakeX[0] + 25;if (snakeX[0] > 850) {snakeX[0] = 25;}
            }else if(direction.equals("L")){
                snakeX[0] = snakeX[0] - 25;if (snakeX[0] <25) {snakeX[0] = 850;}
            }else if(direction.equals("U")){
                snakeY[0] = snakeY[0] - 25;if (snakeY[0] <75) {snakeY[0] = 650;}
            }else if(direction.equals("D")){
                snakeY[0] = snakeY[0] + 25;if (snakeY[0] > 650) {snakeY[0] = 75;}
            }
            if (snakeX[0]==foodx&&snakeY[0]==foody){
                length += 1;
                score+=10;
                foodx = 25 +25*random.nextInt(34);
                foody = 25 +25*random.nextInt(24);
            }
            for (int i = 1; i < length; i++) {
                if (snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
                    isFial = true;
                    score=0;
                }

            }

        repaint();
        timer.start();
    }
    }

    //多余的重写方法
    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void keyReleased(KeyEvent e) {}



}



代码中存在注释,有用拿走,嘿嘿!!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>