JAVA实现贪吃蛇

JAVA实现贪吃蛇

第一步

#初始化窗体
代码:

public class MainFrame extends JFrame {
    //private  Snake snake;//蛇
    //private Timer timer;//定时器
    private JPanel jPanel;//游戏棋盘
    //private Node food;//食物
    public  MainFrame()throws HeadlessException{
        //初始化窗体
        initFrame();
        }
         //设置参数
    private void initFrame(){
        //设置窗体
        setSize(610,640);
        //设置窗体位置
        setLocation(300,80);
        //设置按钮作用(退出按钮)
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗体大小不变
        setResizable(false);
    }
    public static void main(String[] args){
        //创建窗体单元,并显示
        new MainFrame().setVisible(true);


    }

效果
在这里插入图片描述

第二步

#绘制棋盘
代码:

private void initGamePanel(){
       jPanel=new JPanel(){
           //绘制游戏棋盘中的内容
            @Override
            public void paint(Graphics g) {
                //Graphics g 中有好多方法,可以画直线、矩形
                //绘制40条横线
                g.clearRect(0,0,600,600);
                for (int i = 0; i <= 40; i++) {
                    g.drawLine(0,i*15,600,i*15);
                }
                //绘制40条竖线
                for (int i= 0; i<=40; i++) {
                    g.drawLine(i*15,0,i*15,600);
                }
                

第三步

#绘制蛇
代码:

 LinkedList<Node> body = snake.getBody();
                for (Node node : body) {
                    g.fillRect(node.getX()*15,node.getY()*15,15,15);
                }

第四步

#控制蛇在棋盘的移动
代码

 public void move() {
        if (isLiving) {
            //获取蛇头
            Node head = body.getFirst();
            switch (direction) {
                case UP:
                    body.addFirst(new Node(head.getX(), head.getY() - 1));
                    break;
                case DOWN:
                    body.addFirst(new Node(head.getX(), head.getY() + 1));
                    break;
                case LEFT:
                    body.addFirst(new Node(head.getX() - 1, head.getY()));
                    break;
                case RIGHT:
                    body.addFirst(new Node(head.getX() + 1, head.getY()));
                    break;
            }

第五步

#控制蛇的移动

 private void setKeyListener(){
        addKeyListener(new KeyAdapter() {
            @Override
            //键盘按下时会自动调用此方法
            public void keyPressed(KeyEvent e) {
              //键盘中每个键都有一个编号
                switch (e.getKeyCode()){
                    case KeyEvent.VK_UP:
                        if(snake.getDirection()!=Direction.DOWN){
                        snake.setDirection(Direction.UP);}
                        break;
                    case KeyEvent.VK_DOWN:
                        if(snake.getDirection()!=Direction.UP){
                            snake.setDirection(Direction.DOWN);}
                        break;
                    case KeyEvent.VK_LEFT:
                        if(snake.getDirection()!=Direction.RIGHT){
                            snake.setDirection(Direction.LEFT);}
                        break;
                    case KeyEvent.VK_RIGHT:
                        if(snake.getDirection()!=Direction.LEFT){
                            snake.setDirection(Direction.RIGHT);}
                        break;
                }

            }
        });
    }

第六步

#判断蛇是否撞墙和碰到自己
代码:

head = body.getFirst();
            if(head.getX()<0||head.getY()<0||head.getX()>=40||head.getY()>=40){
                isLiving=false;
            }
            //判断蛇是否碰到自己
            for (int i = 1; i < body.size(); i++) {
                Node node = body.get(i);
                if(head.getX()== node.getX()&&head.getY()==node.getY()){
                    isLiving=false;
                }

第七步

#绘制食物和吃食物
代码:
//绘制食物

     g.fillRect(food.getX()*15,food.getY()*15,15,15);

吃食物

//蛇吃食物,沿着蛇头的移动方向增加一个节点
    public void eat(Node food) {
        Node head = body.getFirst();
        switch (direction) {
            case UP:
                body.addFirst(new Node(head.getX(), head.getY() - 1));
                break;
            case DOWN:
                body.addFirst(new Node(head.getX(), head.getY() + 1));
                break;
            case LEFT:
                body.addFirst(new Node(head.getX() - 1, head.getY()));
                break;
            case RIGHT:
                body.addFirst(new Node(head.getX() + 1, head.getY()));
                break;
        }
    }

最终的效果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值