贪吃蛇小游戏

实验要求:实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点,得分增加,“蛇”碰到边界或,蛇头与蛇身相撞,蛇死亡,游戏结束。为游戏设计初始欢迎界面,游戏界面,游戏结束界面。

贪吃蛇的设计分为四个板块:游戏界面设计、游戏过程、游戏结束和功能扩展。

游戏界面设计包括界面构造、蛇的构造、食物构造;游戏过程包括蛇的移动、蛇吃食物、碰撞检测;游戏结束包括结束界面;扩展功能包括功能食物、移动速度、得分记录。

首先对蛇的长度以及位置进行设置并设置食物随机出现、定时器:

int snakelong=2;//蛇当前长度
int[] Snakex=new int[100];
int[] Snakey=new int[100];
Random random=new Random();
int foodx;
int foody;
Timer timer=new Timer(100, this);//定时器
int started=0;//游戏信息 0-未开始 1-开始 2-结束
int fx=1;//蛇的方向 0-左 1-右 2-上 3-下

然后进行贪吃蛇界面的设计:

  public void myJFrame() {
        this.setTitle("贪吃蛇大作战");
        this.setSize(800, 600);
        this.setDefaultCloseOperation(Snake.EXIT_ON_CLOSE);//界面可退出
        this.setResizable(false);//界面不能改变
        this.addKeyListener(this);
        this.setVisible(true);
//        蛇的初识位置
        Snakex[0]=60;
        Snakey[0]=100;
        Snakex[1]=40;
        Snakey[1]=100;
//        随机食物的初识位置
        foodx=random.nextInt(39);
        foody=random.nextInt(22);
        foodx=foodx*20;
        foody=foody*20+80;
    }

界面构造、蛇的构造、食物构造:

public void paint(Graphics g) {
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 800, 600);
        g.setColor(Color.black);
        g.fillRect(0, 80, 800, 520);
        for (int i=0;i<snakelong;i++) {
            g.setColor(Color.yellow);
            g.fillRect(Snakex[i],Snakey[i],25,25);
        }
        g.setColor(Color.red);
        g.fillOval(foodx,foody,25,25);
        if (started==0) {
            g.setColor(Color.BLACK);//设置画笔颜色
            g.setFont(new Font("微软雅黑",10,20)); //设置字体
            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(snakelong - 2),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(snakelong - 2),470,65);
        }
    }

键盘上上下左右以及游戏的开始以及结束:

@Override
    public void keyPressed(KeyEvent e) {
        int key=e.getKeyCode();
        if (key==KeyEvent.VK_SPACE) {
            if (started==0) {
                started=1;
            } else if(started==1) {
                started=0;
            } else if (started==2) {
                started=0;
                snakelong=2;//蛇当前长度
                //蛇的初识位置
                Snakex[0]=60;
                Snakey[0]=100;
                Snakex[1]=40;
                Snakey[1]= 100;
                // 随机食物的初识位置
                foodx=random.nextInt(39);
                foody=random.nextInt(22);
                foodx=foodx*20;
                foody=foody*20+80;
                //                初始化方向
                fx=1;
            }
            repaint();
            timer.start();
        } else if(key==KeyEvent.VK_LEFT) {
            if (fx!= 1) {
                fx=0;
            }
        } else if(key==KeyEvent.VK_RIGHT) {
            if (fx!=0) {
                fx=1;
            }
        } else if(key==KeyEvent.VK_UP) {
            if (fx!=3) {
                fx=2;
            }
        } else if (key == KeyEvent.VK_DOWN) {
            if (fx!=2) {
                fx=3;
            }
        }
    }

事件监听:

@Override
    public void actionPerformed(ActionEvent e) {
//        判断游戏是否开始
        if (started==1) {
//            通过循环控制蛇移动
            for (int i=snakelong-1;i>0;i--) {
                Snakex[i]=Snakex[i-1];
                Snakey[i]=Snakey[i-1];
            }
//            判断蛇移动的方向
            if (fx==0) {//蛇的方向 0-左 1-右 2-上 3-下
                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 (Snakex[0]<0||Snakex[0]>780||Snakey[0]<80||Snakey[0]>580) {
                started=2;
            }

//            判断蛇是否吃到了食物
            if (Snakex[0]==foodx&&Snakey[0]==foody) {
                snakelong++;
                foodx=random.nextInt(39);
                foody=random.nextInt(22);
                foodx=foodx*20;
                foody=foody*20+80;
                System.out.println(foodx +","+foody);
            }
//            判断是否吃到了自己
            for (int i=1;i<snakelong; i++) {
                if (Snakex[0]==Snakex[i]&&Snakey[0]==Snakey[i]) {
                    started=2;
                }
            }
            repaint();
        }
        timer.start();
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值