Java写贪吃蛇(AWT+SWING)

贪吃蛇

游戏主类,用于启动游戏

package Snake;

import javax.swing.*;

public class StartGame extends JFrame {
    public void init(){
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setBounds(10,10,900,720);
        setResizable(false);
        setTitle("贪吃蛇");

        add(new GamePanel());
    }

    public static void main(String[] args) {
        new StartGame().init();
    }
}

游戏的面板

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;

public class GamePanel extends JPanel implements KeyListener , ActionListener {
    //定义蛇的数据结构
    int length;       //小蛇的长度
    int snakex[]=new int[600];
    int snakey[]=new int[500];        //小蛇的坐标
    String fx;  //用来表示小蛇头部的方向
    boolean isStart;         //用来表示游戏当前的状态
    int foodx;
    int foody;
    Random random = new Random();
    boolean isFail;        //用来表示小蛇是否死亡
    int score;        //积分
    public GamePanel(){
        init();
        //获得键盘事件和焦点
        this.setFocusable(true);
        this.addKeyListener(this);
    }
    public void init(){
        length=3;
        snakex[0]=100;snakey[0]=100;
        snakex[1]=75;snakey[1]=100;
        snakex[2]=50;snakey[2]=100;
        fx="R";
        isStart=false;
        isFail=false;
        score=0;

        //把食物放在界面上的随机位置
        foodx=25+25*random.nextInt(34);
        foody=75+25*random.nextInt(24);

        timer.start();
    }
    Timer timer=new Timer(100,this);  //用计时器来监听游戏面板,每过100ms刷新一次

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        int keycode=e.getKeyCode();
        if(keycode==KeyEvent.VK_SPACE){
            if(isFail){
                isFail=false;
                init();
            }else {
                isStart = !isStart;
            }
            repaint();
        }
        if(keycode==KeyEvent.VK_W){
            fx="U";
        } else if (keycode==KeyEvent.VK_S) {
            fx="D";
        } else if (keycode==KeyEvent.VK_A) {
            fx="L";
        } else if (keycode==KeyEvent.VK_D) {
            fx="R";
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    //绘制面板,游戏的所有东西都用这个画笔来画
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.WHITE);

        Data.header.paintIcon(this,g,25,11);
        g.fillRect(25,75,850,600); //画出游戏面板

        //画出积分系统
        g.setColor(Color.black);
        g.setFont(new Font("微软雅黑",Font.BOLD,16));
        g.drawString("长度"+length,370,35);
        g.drawString("积分"+score,370,50);

        //用if-else来判断小蛇的头的方向
        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循环来画小蛇的身体,可以通过改变length来画长小蛇
        for (int i = 1; i <length; i++) {
            Data.body.paintIcon(this,g,snakex[i],snakey[i]);
        }
        //提示当前的游戏状态
        if(!isStart){
            g.setColor(Color.white);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("按下空格开始游戏",300,300);
        }
        if(isFail){
            g.setColor(Color.MAGENTA);
            g.setFont(new Font("微软雅黑",Font.BOLD,20));
            g.drawString("你的小蛇死亡,按下空格复活小蛇重新开始游戏",300,300);
        }
        Data.food.paintIcon(this,g,foodx,foody);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(isStart&&isFail==false){
            //小蛇的身体跟着头走
            for (int i = length-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]=650;
                }
            } else if (fx.equals("D")) {
                snakey[0]=snakey[0]+25;
                if(snakey[0]>650){
                    snakey[0]=75;
                }
            }
            //当小蛇的头跟食物重合时,认为小蛇吃到了食物
            if(snakex[0]==foodx&&snakey[0]==foody){
                length++;
                score+=10;
                foodx=25+25*random.nextInt(34);
                foody=75+25*random.nextInt(24);
            }
            //失败判定,当小蛇的头跟任意一个身体重合时,小蛇死亡
            for (int i = length-1; i >0 ; i--) {
                if(snakex[0]==snakex[i]&&snakey[0]==snakey[i]){
                    isFail=true;
                }
            }

            repaint();
        }
        timer.start();   //计时器开始运行
    }
}

游戏数据

package Snake;

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

public class Data {
    private static URL headerurl = Data.class.getResource("statics/header.png");
    private static URL topurl = Data.class.getResource("statics/top.png");
    private static URL downurl = Data.class.getResource("statics/down.png");
    private static URL lefturl = Data.class.getResource("statics/left.png");
    private static URL righturl = Data.class.getResource("statics/right.png");
    private static URL bodyurl = Data.class.getResource("statics/body.png");
    private static URL foodurl = Data.class.getResource("statics/food.png");
    public static ImageIcon header=new ImageIcon(headerurl);
    public static ImageIcon up=new ImageIcon(topurl);
    public static ImageIcon down=new ImageIcon(downurl);
    public static ImageIcon left=new ImageIcon(lefturl);
    public static ImageIcon right=new ImageIcon(righturl);
    public static ImageIcon body=new ImageIcon(bodyurl);
    public static ImageIcon food=new ImageIcon(foodurl);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值