贪吃蛇的实现

snake类

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import java.io.*;
import java.net.URL;

public class Snake extends JFrame implements KeyListener, ActionListener, MouseListener {

    int slong = 3;//蛇当前长度
    //蛇坐标
    int[] Snakex = new int[100];
    int[] Snakey = new int[100];
    int fx = 1;//蛇的方向 0-左 1-右 2-上 3-下
    Timer timer = new Timer(100, this);//设置定时器,每100毫秒一次
    //食物位置
    int foodx;
    int foodx1;
    int foodx2;
    int foody;
    int foody1;
    int foody2;
    Random random = new Random();//随机数,随机位置生成食物
    int started = 0;//游戏信息 0-未开始 1-开始 2-结束
    private JTextArea ruleText = new JTextArea();

    //---------------------------------------------------------------------------------------------------------------------
    //窗体
    public void myJFrame() {

        this.setTitle("贪吃蛇"); //标题
        this.setSize(800, 600); //窗口大小
        this.setResizable(false); //窗口是否可以改变大小=否
        this.setDefaultCloseOperation(Snake.EXIT_ON_CLOSE); //窗口关闭方式为关闭窗口同时结束程序

        int width = Toolkit.getDefaultToolkit().getScreenSize().width; //获取屏幕宽度
        int height = Toolkit.getDefaultToolkit().getScreenSize().height; //获取屏幕高度

        this.setLocation((width - 800) / 2, (height - 600) / 2); //设置窗口默认位置以屏幕居中

        this.setFocusable(true);
        this.addKeyListener(this);
        this.setVisible(true);

//        蛇的初识位置
        Snakex[0] = 60;
        Snakey[0] = 100;
        Snakex[1] = 40;
        Snakey[1] = 100;
        Snakex[2] = 20;
        Snakey[2] = 100;


//        随机食物的初识位置
        foodx = random.nextInt(39);
        foody = random.nextInt(22);
        foodx = foodx * 20;
        foody = foody * 20 + 80;
        foodx1 = random.nextInt(39);
        foody1 = random.nextInt(22);
        foodx1 = foodx1 * 20;
        foody1 = foody1 * 20 + 80;
        foodx2 = random.nextInt(39);
        foody2 = random.nextInt(22);
        foodx2 = foodx;
        foody2 = foody + 220;
    }
    //覆写paint方法,绘制界面
    public void paint(Graphics g) {
        //绘制背景
        g.setColor(Color.gray);
        g.fillRect(0, 0, 800, 600);

        //绘制游戏区域
        g.setColor(Color.white);
        g.fillRect(0, 80, 800, 520);

        //绘制蛇
        for (int i = 0; i < slong; i++) {
            if (i == 0) {
                g.setColor(Color.red);
                g.fillRect(Snakex[i], Snakey[i], 20, 20);
            } else {
                g.setColor(Color.blue);
                g.fillRect(Snakex[i], Snakey[i], 20, 20);
            }

        }

        //        绘制食物
        g.setColor(Color.yellow);
        g.fillOval(foodx, foody, 20, 20);
        g.setColor(Color.RED);
        g.fillOval(foodx1, foody1, 20, 20);
        g.setColor(Color.black);
        g.fillOval(foodx2, foody2, 10, 10);


        if (started == 0) {
            g.setColor(Color.BLACK);//设置画笔颜色
            g.setFont(new Font("微软雅黑", 10, 15)); //设置字体
            g.drawString("吃到黄球加一分,吃到红球加两分,吃到黑球减三分,得分到达50分的时候获胜", 100, 50); //绘制字符
            g.drawString("按下“回车键”开始游戏", 300, 65); //绘制字符
        } else if (started == 1) {
            g.setColor(Color.BLACK);//设置画笔颜色
            g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
            g.drawString("当前分数为:", 300, 65); //绘制字符
            g.drawString(String.valueOf(slong - 3), 420, 65); //绘制字符
        } else if (started == 2) {
            g.setColor(Color.BLACK);//设置画笔颜色
            g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
            g.drawString("游戏结束-", 250, 65); //绘制字符
            g.drawString("最终分数为:", 350, 65); //绘制字符
            g.drawString(String.valueOf(slong - 3), 470, 65); //绘制字符
        } else if (started ==3) {
            g.setColor(Color.BLACK);//设置画笔颜色
            g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
            g.drawString("游戏结束-", 250, 65); //绘制字符
            g.drawString("恭喜您获得了胜利", 350, 65); //绘制字符
        }

    }


    //    操作监听——控制蛇的不断移动
    @Override
    public void actionPerformed(ActionEvent e) {
        //判断游戏是否开始
        if (started == 1) {
            //通过循环控制蛇移动
            for (int i = slong - 1; i > 0; i--) {
                Snakex[i] = Snakex[i - 1];
                Snakey[i] = Snakey[i - 1];
            }

            //判断蛇移动的方向
            if (fx == 0) {
                Snakex[0] = Snakex[0] - 20;
            } else if (fx == 1) {
                Snakex[0] = Snakex[0] + 20;
            } else if (fx == 2) {
                Snakey[0] = Snakey[0] - 20;
            } else if (fx == 3) {
                Snakey[0] = Snakey[0] + 20;
            }
            if (slong <= 0) {
                started = 2;
            }
            if(slong>=53){
                started = 3;
            }
            //判断蛇是否撞到墙外
            if (Snakex[0] < 0 || Snakex[0] > 780 || Snakey[0] < 80 || Snakey[0] > 580) {
                started = 2;
            }

            //判断蛇是否吃到了食物
            if (Snakex[0] == foodx && Snakey[0] == foody) {

                slong++;

                foodx = random.nextInt(39);
                foody = random.nextInt(22);
                foodx = foodx * 20;
                foody = foody * 20 + 80;

                //System.out.println(foodx + "," + foody);
            } else if (Snakex[0] == foodx1 && Snakey[0] == foody1) {
                slong += 2;
                foodx1 = random.nextInt(39);
                foody1 = random.nextInt(22);
                foodx1 = foodx1 * 20;
                foody1 = foody1 * 20 + 80;

            } else if (Snakex[0] == foodx2 && Snakey[0] == foody2) {
                slong -= 3;
                foodx2 = random.nextInt(39);
                foody2 = random.nextInt(22);
                foodx2 = foodx;
                foody2 = foody + 80;
            }

//            判断是否吃到了自己
            for (int i = 1; i < slong; i++) {
                if (Snakex[0] == Snakex[i] && Snakey[0] == Snakey[i]) {
                    started = 2;
                }
            }

//            判断食物是否随机在了蛇身上
            for (int i = 0; i < slong; i++) {
                if (foodx == Snakex[i] && foody == Snakey[i]) {

                    //        随机食物的初识位置
                    foodx = random.nextInt(39);
                    foody = random.nextInt(22);
                    foodx = foodx * 20;
                    foody = foody * 20 + 80;

                    //ystem.out.println(foodx + "," + foody);
                }
            }


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

    //    输入
    @Override
    public void keyTyped(KeyEvent e) {

    }

    //    键盘按下——控制游戏的开始以及蛇的移动方向
    @Override
    public void keyPressed(KeyEvent e) {
        //  获取从键盘输入的键
        int key = e.getKeyCode();
        //判断是否为回车键
        if (key == KeyEvent.VK_ENTER) {
            if (started == 0) {
                started = 1;
            } else if (started == 1) {
                started = 0;
            } else if (started == 2) {
                started = 0;

                slong = 3;//蛇当前长度

                //蛇的初识位置
                Snakex[0] = 60;
                Snakey[0] = 100;
                Snakex[1] = 40;
                Snakey[1] = 100;
                Snakex[2] = 20;
                Snakey[2] = 100;

                //随机食物的初识位置
                foodx = random.nextInt(39);
                foody = random.nextInt(22);
                foodx = foodx * 20;
                foody = foody * 20 + 80;
                foodx1 = random.nextInt(39);
                foody1 = random.nextInt(22);
                foodx1 = foodx1 * 20;
                foody1 = foody1 * 20 + 80;

                // 初始化方向
                fx = 1;
            }

            repaint();
            timer.start();

        //左
        } else if (key == KeyEvent.VK_LEFT || key == KeyEvent.VK_A) {
            if (fx != 1) {
                fx = 0;
            }
        // 右
        } else if (key == KeyEvent.VK_RIGHT || key == KeyEvent.VK_D) {
            if (fx != 0) {
                fx = 1;
            }
        // 上
        } else if (key == KeyEvent.VK_UP || key == KeyEvent.VK_W) {
            if (fx != 3) {
                fx = 2;
            }
        //下
        } else if (key == KeyEvent.VK_DOWN || key == KeyEvent.VK_S) {
            if (fx != 2) {
                fx = 3;
            }
        }

    }

    //    弹起
    @Override
    public void keyReleased(KeyEvent e) {

    }

    //    点击
    @Override
    public void mouseClicked(MouseEvent e) {

    }

    //    按下
    @Override
    public void mousePressed(MouseEvent e) {

    }

    //    抬起
    @Override
    public void mouseReleased(MouseEvent e) {

    }

    //    进入
    @Override
    public void mouseEntered(MouseEvent e) {

    }

    //    离开
    @Override
    public void mouseExited(MouseEvent e) {

    }
}

Test类

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class Test {
    public static void main(String[] args) {
        Snake snake = new Snake();
        snake.myJFrame();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值