自我编写小贪吃蛇

贪吃蛇

  1. 定义数据
  2. 绘制界面
  3. 画静态图
  4. 创建定时器,使蛇动起来
  5. 监听键盘
    • 改变蛇的方向
    • 暂停开始游戏
  6. 增加判定
    • 判断蛇是否吃到豆,吃到豆刷新豆的出现,积分增加
    • 判断蛇头是否出界,如出界则从另一侧出现
    • 判断蛇头是否撞到自己
public class StartGame {
    //初始方向
    String fangxiang = "right";
    //初始蛇身长度
    int lenth = 3;
    //蛇身的坐标
    int[] snakeX = new int[100];
    int[] snakeY = new int[100];
    //豆的坐标
    int foodX;
    int foodY;
    //游戏是否开始
    boolean isStart = false;
    //游戏是否失败
    boolean isfalse = false;
    //游戏积分
    int num;

    Random random = new Random();
    MyFrame frame = null;
    MyTimer timer = null;

    StartGame(){
        frame = new MyFrame();
        frame.setVisible(true);
        frame.setResizable(false);//窗口大小不可变
        frame.setBounds(100,100,65+34*25,120+24*25);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        timer = new MyTimer(100);
    }

    //游戏面板
    class MyFrame extends JFrame{
        //游戏面板
        GamePanel gamePanel = null;
        //键盘监听
        KeyPass keypass = null;

        MyFrame(){
            gamePanel = new GamePanel();
            this.add(gamePanel);
            init();
            //获取焦点事件和键盘事件
            this.setFocusable(true);//获得焦点事件
            keypass = new KeyPass();
            this.addKeyListener(keypass);//获得键盘事件

            this.repaint();
        }

        //蛇以及豆的初始地方
        public void init(){
            for (int i = 0; i < 3; i++) {
                snakeX[i] = 100 - (25 * i);
                snakeY[i] = 100;
            }
            //把食物随机放置在游戏区域上
            foodX = 25 + 25*random.nextInt(34);
            foodY = 75 + 25*random.nextInt(24);
        }

        class GamePanel extends JPanel{

            //绘制面板,此游戏中的所有东西,都是使用这个画笔来画
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);//清屏
                //背景
                this.setBackground(Color.white);
                //游戏区域
                g.fillRect(25,75,34*25,24*25);
                //豆
                Image snakeFood = (new ImageIcon("static/food.png")).getImage();
                g.drawImage(snakeFood,foodX,foodY,null);
                //蛇身
                Image snakeBody = (new ImageIcon("static/body.png")).getImage();
                for (int i = 1; i < lenth; i++) {
                    g.drawImage(snakeBody,snakeX[i],snakeY[i],null);
                }
                //蛇头
                Image snaketou = (new ImageIcon("static/" + fangxiang + ".png")).getImage();
                g.drawImage(snaketou,snakeX[0],snakeY[0],null);

                if (isStart == false && isfalse == false){
                    g.setColor(Color.white);
                    g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
                    g.drawString("按下空格开始游戏!",280,300);
                }
                if (isfalse == true){
                    g.setColor(Color.red);
                    g.setFont(new Font("微软雅黑",Font.BOLD,40));
                    g.drawString("游戏失败,请按空格重新开始游戏!",155,300);
                }
                //游戏积分
                g.setFont(new Font("微软雅黑",Font.BOLD,40));
                g.setColor(Color.black);
                g.drawString("积分:" + num + "    长度:" + lenth,270,50);

            }
        }
        //键盘监听
        class KeyPass implements KeyListener{

            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_SPACE){
                    if (isfalse){//如果游戏失败,按下空格重新开始
                        isfalse = false;
                        isStart = false;
                        lenth = 3;
                        fangxiang = "right";
                        num = 0;
                        for (int i = 0; i < 3; i++) {
                            snakeX[i] = 100 - (25 * i);
                            snakeY[i] = 100;
                        }
                        foodX = 25 + 25*random.nextInt(34);
                        foodY = 75 + 25*random.nextInt(24);
                    }else if (isfalse == false){//如果游戏未失败,且正在运行中,按下空格停止游戏
                        isStart = !isStart;//取反,一下空格开始,再按空格停止
                    }
                }
                //监听键盘方向,改变蛇行走方向,且改变的方向不能为行走的反方向
                if (e.getKeyCode() == KeyEvent.VK_UP){
                    if (fangxiang.equals("down")){
                        return;
                    }else {
                        fangxiang = "up";
                    }
                }else if (e.getKeyCode() == KeyEvent.VK_DOWN){
                    if (fangxiang.equals("up")){
                        return;
                    }else {
                        fangxiang = "down";
                    }
                }else if (e.getKeyCode() == KeyEvent.VK_LEFT){
                    if (fangxiang.equals("right")){
                        return;
                    }else {
                        fangxiang = "left";
                    }
                }else if (e.getKeyCode() == KeyEvent.VK_RIGHT){
                    if (fangxiang.equals("left")){
                        return;
                    }else {
                        fangxiang = "right";
                    }
                }
                repaint();
            }

            @Override
            public void keyTyped(KeyEvent e) {}
            @Override
            public void keyReleased(KeyEvent e) {}
        }
    }

    //定时器
    class MyTimer implements Runnable {
        Thread t1 = null;//创建线程对象 t1
        long speed;

        MyTimer(long speed){
            this.speed = speed;
            t1 = new Thread(this);
            //启动线程 t1
            t1.start();
        }

        @Override
        public void run() {
            while (true){
                try {
                    t1.sleep(this.speed);
                    if (this == timer){
                        if (isStart){//如果游戏是开始状态,则动起来

                            //身体移动
                            for (int i = lenth; i > 0; i--) {
                                snakeX[i] = snakeX[i-1];
                                snakeY[i] = snakeY[i-1];
                            }

                            //蛇的走向
                            if (fangxiang.equals("up")){
                                snakeY[0] = snakeY[0] - 25;
                                if (snakeY[0] < 75){//边界判断
                                    snakeY[0] = 26*25;
                                }
                            }else if (fangxiang.equals("down")){
                                snakeY[0] = snakeY[0] + 25;
                                if (snakeY[0] > 26*25) {//边界判断
                                    snakeY[0] = 75;
                                }
                            }else if (fangxiang.equals("left")){
                                snakeX[0] = snakeX[0] - 25;
                                if (snakeX[0] < 25) {//边界判断
                                    snakeX[0] = 34*25;
                                }
                            }else if (fangxiang.equals("right")){
                                snakeX[0] = snakeX[0] + 25;
                                if (snakeX[0] > 34*25) {//边界判断
                                    snakeX[0] = 25;
                                }
                            }

                            //吃豆判定
                            if (snakeX[0] == foodX && snakeY[0] == foodY){
                                lenth++;//吃到食物长度 + 1
                                num+=20;
                                //再次随机生成食物
                                foodX = 25 + 25*random.nextInt(34);
                                foodY = 75 + 25*random.nextInt(24);
                            }

                            //失败判定
                            for (int i = 1; i < lenth; i++) {
                                if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]){
                                    snakeX[i+1] = snakeX[0];
                                    snakeY[i+1] = snakeY[0];
                                    isStart = false;
                                    isfalse = true;
                                }
                            }

                            frame.repaint();
                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    public static void main(String[] args) {
        new StartGame();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值