[JavaScript游戏开发] Q版地图上让英雄、地图都动起来

news2024/11/25 6:31:40

系列文章目录

第一章 2D二维地图绘制、人物移动、障碍检测
第二章 跟随人物二维动态地图绘制、自动寻径、小地图显示(人物红点显示)
第三章 绘制冰宫宝藏地图、人物鼠标点击移动、障碍检测
第四章 绘制Q版地图、键盘上下左右地图场景切换
第五章 Q版地图上让英雄、地图都动起来


文章目录

  • 系列文章目录
  • 前言
  • 一、本章节效果图
  • 二、任务拆解
    • 2.1、准备【物料层】
      • 2.1.1、在可视窗口里加载地图
      • 2.1.2、加载英雄对象
      • 2.1.3、 加载物料
      • 2.1.4、 编辑地图数据
    • 2.2、设置物料层可视区域的行、列
    • 2.3、调整地图和英雄的步骤跨度一致
    • 2.4、在键盘上下左右事件里,增加英雄动作的逻辑,融合英雄、地图的移动逻辑,增加边界检测
    • 2.5、看看最终效果
      • 2.5.1、荷花池边打卡
      • 2.5.2、西梁女国打卡
      • 2.5.3、跑累了在后花园休息
      • 2.5.4、休息完去大礼堂门口转一转
      • 2.5.5、最后在后山瞅一眼
  • 总结


前言

本章内容在第一章【2D二维地图绘制、人物移动、障碍检测】、第四章【绘制Q版地图、键盘上下左右地图场景切换】的基础上进行了升级,因此带大家回顾下这两章的内容

  • 使用JavaScript绘制简单的二维地图(第一章实现)
    采用二维数组存储地图信息,使用表格绘制地图,每个td单元格存储数据
  • 键盘上下左右控制(第一章实现,本章节增加地图层控制)
    使用JavaScript keyPress键盘事件监听WASD键,按键触发时人物做出相应操作
  • 障碍物碰撞检测(采用格子碰撞检测,第一章实现)
    人物下一步碰撞到障碍时,提示遇到障碍,终止人物运动
  • 增加地图层(第四章实现)
    地图层与数据层(二维网格、人物)分离;主地图在初始化时加载,显示可视区域
  • 人物、地图跟随变动
    保持人物在地图中心,检测特殊情况( 进入边界内时保持地图不动、人物运动)

一、本章节效果图

请添加图片描述

二、任务拆解

在第四章基础上继续添加任务
1、准备【物料层】,设置为地图图片高、宽, 计算物料层2D网格的行、列
2、设置物料层可视区域的行、列;
3、调整地图和英雄的步骤跨度一致;
4、在键盘上下左右事件里,增加英雄动作的逻辑,融合英雄、地图的移动逻辑,增加边界检测
5、看看最终效果

2.1、准备【物料层】

2.1.1、在可视窗口里加载地图

<div style="width: 95%; height: 95%; position: absolute; background-color: red; overflow: hidden;  " id="parentDiv">
    <div style="z-index: 1; height: 2480px; width: 3280px"  id="mapDiv" >
        <table class="main bg" id="map1001"></table>
    </div>
</div>

<style>

    table.main  {
        border-collapse: collapse;
    }

    table.main td {
        /*border: 0.5px red solid;*/  //调试地图时可开启
        width: 79px;
        height: 79px;
    }
</style>

2.1.2、加载英雄对象

    <script>
    // 英雄对象
     var hero = {
         currentPoint : [4, 6],   //初始化英雄的位置是 4,6
     }
     </script>

2.1.3、 加载物料

导入物料js
<script src="../js/item.js"></script>

item.js

// 物品
var item = {};

item.initItem = function (){
    item.empty = 0;   //空地或草坪
    item.stone = 1;   //石头的标记是1
    item.factory = 2; //工厂
    item.girl = 3;  //女子
    item.girl_01 = 4; //女孩
    item.kt = 5; //空投大礼包
    item.lz = 6; //路障
    item.pz = 7; //喷子
    item.zz = 8; //沼泽
    item.hero = 9;   //英雄的标记是9
    item.heroHasPath = 10;   //自动寻径的英雄标记是10
    item.wdss = 11;  //僵尸的标记是11
    item.lzAndempty = 12;  //空白的路障
    item.datas = [];  // 物品的图片集合

    var itemPrefixPath = "../img/item/";
    item.datas[0] = "";  // 可行走的路径
    item.datas[1] = itemPrefixPath + "stone.png";
    item.datas[2] = itemPrefixPath + "gc.png";
    item.datas[3] = itemPrefixPath + "girl.png";
    item.datas[4] = itemPrefixPath + "girl.bmp";
    item.datas[5] = itemPrefixPath + "kt.png";
    item.datas[6] = itemPrefixPath + "lz.png";
    item.datas[7] = itemPrefixPath + "pz.png";
    item.datas[8] = itemPrefixPath + "zz.png";
    item.datas[9] = itemPrefixPath + "/spine/hero002.gif";
    item.datas[10] = itemPrefixPath + "/spine/tank.gif";
    item.datas[11] = itemPrefixPath + "wdss.gif";
    item.datas[12] = "";  //看不见的路障
}


2.1.4、 编辑地图数据

根据地图绘制可行走路径,

	/**
         * 加载地图数据
         * 0 可走的路径
         * 12 看不见的路障
         * @type {number[]}
         */
        var mapData = [
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0, 12, 12, 12, 12, 12 ],
            [12, 12, 12,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12, 12, 12, 12 ],
            [12, 12, 12,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12 ],
            [12, 12, 12,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12 ],
            [12, 12,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12,  0,  0, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0, 12, 12,  0,  0,  0,  0,  0, 12, 12,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0, 12,  0, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12,  0,  0, 12,  0,  0,  0, 12, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12,  0, 12,  0,  0,  0, 12, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 12, 12, 12, 12,  0, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0, 12, 12,  0,  0,  0,  0, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 12, 12, 12,  0, 12, 12,  0, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12,  0, 12, 12,  0, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12,  0,  0,  0,  0,  0,  0, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0, 12, 12,  0,  0,  0,  0,  0,  0,  0, 12, 12,  0,  0,  0,  0,  0,  0, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0, 12, 12,  0,  0,  0,  0,  0,  0, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12, 12, 12, 12,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0, 12, 12,  0,  0,  0,  0,  0,  0, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0, 12, 12,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12,  0, 12,  0,  0,  0,  0, 12,  0,  0,  0,  0, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0, 12,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 ],
            [12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 ]
        ]

2.2、设置物料层可视区域的行、列

1、加载物料到地图对象里
2、设置可视区域的行、列
3、增加英雄与上下边框的距离计算方法
4、增加英雄与左右边框的距离计算方法

	// 地图对象
    var mapObj = {
         data: mapData,  //地图上的物品数据
         // 设定地图最大的高度
         maxRow: 8,
         // 地图的行
         row: function (){
             return mapObj.data.length > this.maxRow ? this.maxRow : mapObj.data.length
         },

         // 设定地图最大的列
         maxCol: 12,
         //地图的列
         col: function (){
             return mapObj.data[0].length > this.maxCol ? this.maxCol : mapObj.data[0].length;
         },

         // 英雄与上下边框的距离
         heroMarginTop: function () {
           return  Math.floor( this.row() / 2)
         },
         // 英雄与左右边框的距离
         heroMarginLeft: function () {
             return  Math.floor( this.col() / 2)
         },

     }

2.3、调整地图和英雄的步骤跨度一致

	var stepDistance = 80;   // td的高、宽也设置成80或79px

2.4、在键盘上下左右事件里,增加英雄动作的逻辑,融合英雄、地图的移动逻辑,增加边界检测

在这里插入图片描述
1、在body标签上增加键盘事件
2、在文档准备好之后开始执行初始化方法
3、定义游戏窗口层、游戏地图层,并渲染页面
4、定义 键盘上下左右事件
5、在第四章基础上,上下左右事件里增加英雄动作的逻辑,融合英雄、地图的移动逻辑
6、增加双重地图检测,保持英雄在地图的中心位置(地图、英雄一起移动)
7、增加英雄边界检测(英雄在边界内时,只移动人物,不移动地图)
8、简单的碰撞检测,下一步到达的目标只有是空地的情况,英雄才能移动

		<body onkeydown="keydown(event)">
		</body>

   		//文档准备好之后开始执行
        window.onload = function () {
            init();
        }
		/**
         * 定义游戏窗口层、游戏地图层,并渲染页面
         */
        function init() {

            // 定义游戏窗口层
            parentDivEle = document.getElementById("parentDiv");
            // 定义游戏地图层
            mapDivEle = document.getElementById('mapDiv');
            // 获取 1001地图 Dom元素
            mapDiv = document.getElementById("map1001");

            parentDivEle.style.width =  (mapObj.col() + 1) * stepDistance  + "px";
            parentDivEle.style.height = (mapObj.row() + 1) * stepDistance + "px";

            item.initItem();

            //二维数组里,去初始化熊猫的位置
            mapObj.data[hero.currentPoint[0]][hero.currentPoint[1]] = item.hero;

            loadData();
        }

        /**
         * 人物移动方法
         * @param point
         */
        function operateHero(point) {
            mapObj.data[hero.currentPoint[0]][hero.currentPoint[1]] = item.hero
            mapObj.data[point[0]][point[1]] = item.empty
            loadData();
        }


        /**
         *  渲染地图
         * @param mapData
         */
        function loadData() {
            // 加载地图
            mapDivEle.style.background= 'url("../img/item/bg/os.jpg")';

            //渲染一行 row 列的数据
            var mapHTML = "";
            for (var i = 0; i < mapObj.data.length; i++) {
                mapHTML += "<tr>";
                for (var j = 0; j < mapObj.data[0].length ;j++) {
                    if (mapObj.data[i][j] == item.empty) {   //只有点击路,才能自动寻径
                        mapHTML += "<td οnclick='tdClick(" + i + "," + j + ")'></td>";
                    } else if(  mapObj.data[i][j] == item.lzAndempty ) {
                        mapHTML += "<td></td>";
                    } else {
                        mapHTML += '<td><img src="'+ item.datas[mapObj.data[i][j]] +'" style="width: 100%; height: 100%; border-radius: 0%;" ></td>';
                    }
                }
                mapHTML += "</tr>";
            }
            // 渲染大地图
            mapDiv.innerHTML = mapHTML;
        }


        /**
         * 定义 键盘上下左右事件
         * 并判断边界
         * @param e
         */
        var keydown = function (e) {
            if (e.keyCode == 37) {
                console.log("向左")
                if( Number(mapDivEle.style.marginLeft.replaceAll("px", "")) - stepDistance < 0 ) {

                    var point = hero.currentPoint;
                    var xPoint = hero.currentPoint[1] -1;
                    var yPoint = hero.currentPoint[0];
                    if (checkStone(yPoint, xPoint)) {
                        console.log("碰撞到障碍了,停止动作")
                        return
                    }
                    console.log("移动后的位置:x:" + xPoint + " , y:" + yPoint)
                    if( xPoint <= (mapObj.data[0].length - mapObj.heroMarginLeft()) && Number(mapDivEle.style.marginLeft.replaceAll("px", "")) ) {
                        mapDivEle.style.marginLeft = Number(mapDivEle.style.marginLeft.replaceAll("px", "")) + stepDistance + "px";
                    }
                    hero.currentPoint = [yPoint, xPoint]
                    operateHero(point);

                } else {
                    console.log("超出边界")
                }
            } else if (e.keyCode == 38) {
                console.log("向上")
                if( Number(mapDivEle.style.marginTop.replaceAll("px", "") ) - stepDistance < 0 ) {

                    var point = hero.currentPoint;
                    var xPoint = hero.currentPoint[1];
                    var yPoint = hero.currentPoint[0] - 1;
                    if (checkStone(yPoint, xPoint)) {
                        console.log("碰撞到障碍了,停止动作")
                        return
                    }
                    console.log("移动后的位置:x:" + xPoint + " , y:" + yPoint)
                    if( yPoint <= (mapObj.data.length - mapObj.heroMarginTop()) &&  Number(mapDivEle.style.marginTop.replaceAll("px", "")) < 0 ) {
                        mapDivEle.style.marginTop = Number(mapDivEle.style.marginTop.replaceAll("px", "")) + stepDistance + "px";
                    }
                    hero.currentPoint = [yPoint, xPoint]
                    operateHero(point);

                } else {
                    console.log("超出边界")
                }
            } else if (e.keyCode == 39) {
                console.log("向右")
                if ( (parentDivEle.clientWidth) - mapDivEle.clientWidth <= Number(mapDivEle.style.marginLeft.replaceAll("px", ""))) {

                    var point = hero.currentPoint;
                    var xPoint = hero.currentPoint[1] + 1;
                    var yPoint = hero.currentPoint[0];
                    if (checkStone(yPoint, xPoint)) {
                        console.log("碰撞到障碍了,停止动作")
                        return
                    }
                    // 超出边界,只移动英雄, 不移动地图
                    if (  xPoint > mapObj.heroMarginLeft()  && (parentDivEle.clientWidth) - mapDivEle.clientWidth + stepDistance <= Number(mapDivEle.style.marginLeft.replaceAll("px", ""))) {
                        mapDivEle.style.marginLeft = Number(mapDivEle.style.marginLeft.replaceAll("px", "")) - stepDistance + "px";
                    }

                    console.log( "移动后的x轴距离:" + xPoint * stepDistance);

                    console.log("移动后的位置:x:" + xPoint + " , y:" + yPoint)
                    hero.currentPoint = [yPoint, xPoint]
                    operateHero(point);

                } else {
                    console.log("超出边界")
                }
            } else if (e.keyCode == 40) {
                console.log("向下")
                if( (parentDivEle.clientHeight) - mapDivEle.clientHeight  <= Number(mapDivEle.style.marginTop.replaceAll("px", "")) ) {

                    var point = hero.currentPoint;
                    var xPoint = hero.currentPoint[1];
                    var yPoint = hero.currentPoint[0] + 1;
                    if (checkStone(yPoint, xPoint)) {
                        console.log("碰撞到障碍了,停止动作")
                        return
                    }
                    console.log("移动后的位置:x:" + xPoint + " , y:" + yPoint)

                    // 超出边界,只移动英雄, 不移动地图
                    if( yPoint > mapObj.heroMarginTop()  &&  (parentDivEle.clientHeight) - mapDivEle.clientHeight + stepDistance <= Number(mapDivEle.style.marginTop.replaceAll("px", "")) ) {
                        mapDivEle.style.marginTop = Number(mapDivEle.style.marginTop.replaceAll("px", "")) - stepDistance + "px";
                    }
                    hero.currentPoint = [yPoint, xPoint]
                    operateHero(point);

                } else {
                    console.log("超出边界")
                }
            }

            loadData();
        }

        /**
         * 障碍检测(可加多个障碍条件)
         * @param yPoint
         * @param xPoint
         * @returns {boolean}
         */
        function checkStone(yPoint, xPoint) {
            return mapObj.data[yPoint][xPoint] != item.empty;
        }

2.5、看看最终效果

2.5.1、荷花池边打卡

在这里插入图片描述

2.5.2、西梁女国打卡

在这里插入图片描述

2.5.3、跑累了在后花园休息

在这里插入图片描述

2.5.4、休息完去大礼堂门口转一转

在这里插入图片描述

2.5.5、最后在后山瞅一眼

在这里插入图片描述


总结

以上就是今天要讲的内容,本文简单介绍Q版地图的绘制,地图/英雄的移动、边界检测,喜欢的同学可以参考第二张把自动寻径加上。
原生JavaScript知识点就到这里结束了,以后前端知识点主要以Vue为主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/856861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构—图的遍历

6.3图的遍历 遍历定义&#xff1a; ​ 从已给的连通图中某一顶点出发&#xff0c;沿着一些边访问遍历图中所有的顶点&#xff0c;且使每个顶点仅被访问一次&#xff0c;就叫作图的遍历&#xff0c;它是图的基本运算。 遍历实质&#xff1a;找每个顶点的邻接点的过程。 图的…

数据结构笔记--链表经典高频题

前言 面经&#xff1a; 针对链表的题目&#xff0c;对于笔试可以不太在乎空间复杂度&#xff0c;以时间复杂度为主&#xff08;能过就行&#xff0c;对于任何题型都一样&#xff0c;笔试能过就行&#xff09;&#xff1b;对于面试&#xff0c;时间复杂度依然处在第一位&#xf…

量化交易可视化(9)-热力图

热力图的含义 热力图是一种用颜色编码数据密度的二维图表。它的含义是通过不同颜色的渐变来显示数据的相对密度或值的大小。 热力图通常用于可视化矩阵或二维表格数据&#xff0c;其中每个单元格的值被映射到一个颜色&#xff0c;从而形成一个色阶。较小的值通常用较浅的颜色表…

许多智能算法并不智能(续)

许多智能算法被认为并不智能&#xff0c;主要是因为它们在某些方面仍然存在一些限制。以下是一些常见的原因&#xff1a; 缺乏常识和理解能力&#xff1a;当前的智能算法主要依赖于大量的数据和模式识别来做出决策&#xff0c;但它们通常缺乏对世界的常识和深层理解。这意味着它…

视觉大模型的全面解析

前言 本文主要围绕Foundational Models&#xff0c;即基础模型&#xff08;通过自监督或半监督方式在大规模数据上训练的模型&#xff0c;可以适应其它多个下游任务。&#xff09;这个概念&#xff0c;向大家全面阐述一个崭新的视觉系统。例如&#xff0c;通过 SAM&#xff0c;…

nbcio-boot因升级mybatis-plus到3.5.3.1和JSQLParser 到4.6引起的online表单开发的数据库导入出错解决

更多功能看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 nbcio-boot因升级…

【雕爷学编程】Arduino动手做(01)---干簧管传感器模块2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

接龙序列(14届)

对于一个长度为 K 的整数数列&#xff1a;A1,A2,...,AK&#xff0c;我们称之为接龙数列当且仅当 Ai 的首位数字恰好等于 Ai−1的末位数字 (2≤i≤K2≤i≤K)。 例如 12,23,35,56,61,11 是接龙数列&#xff1b;12,23,34,56 不是接龙数列&#xff0c;因为 56 的首位数字不等于 34…

matplotlib 笔记:plot 折线图

1 基本用法 import numpy as np import matplotlib.pyplot as plt x np.linspace(0,10,50) y np.tan(x)**2 np.cos(x)plt.plot(x, y) plt.show() 2 linestyle 折线图类型 import numpy as np import matplotlib.pyplot as pltx np.linspace(0,10,50) y np.tan(x)**2 np…

node配置Web 服务器

1、什么是 Web 服务器 Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序&#xff0c;Web服务器的基本功能就是提供Web信息浏览服务。 它只需支持HTTP协议、HTML文档格式及URL&#xff0c;与客户端的网络浏览器配合。 大多数 web 服务器都支持服…

如何优化测试用例?

在我们日常测试工作中&#xff0c;编写测试用例往往花费较多时间&#xff0c;而且设计的测试用例冗杂和不完整&#xff0c;从而造成用例执行检查不完整&#xff0c;效率低下&#xff0c;不能及时发现项目缺陷。 因此提高测试用例编写和执行效率迫在眉睫&#xff0c;一般来说&am…

Dubbo3.0 Demo

将SpringBoot工程集成Dubbo 1.创建父工程 2.创建子工程consumer&#xff0c;provider 3.初始化工程 4.引入依赖 在provider和consumer中引入dubbo依赖 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</a…

文心一言 VS 讯飞星火 VS chatgpt (73)-- 算法导论7.1 4题

四、如何修改 QUICKSORT&#xff0c;使得它能够以非递增序进行排序? 文心一言&#xff1a; 快速排序&#xff08;Quicksort&#xff09;是一种常用的排序算法&#xff0c;基于分治策略进行设计。默认情况下&#xff0c;快速排序会以递增序进行排序。若想修改快速排序以实现非…

基于星火和Gradio的聊天机器人

星火大模型官网&#xff1a;https://xinghuo.xfyun.cn/ 1 创建虚拟环境&#xff08;windows&#xff09; conda create -n Gradio python3.8 pip install gradio 中间遇到os报错&#xff0c;解决方案&#xff1a; pip install aiofiles23.2.1 2 代码 SparkDesk.py&#xff1a…

Android Studio跳过Haxm打开模拟器

由于公司权限限制无法安装Haxm&#xff0c;这个时候我们可以试试Arm相关的镜像去跳过Haxm运行模拟器。解决方案&#xff1a;安装API27以下的Arm Image. #ifdef __x86_64__if (sarch "arm64" && apiLevel >28) {APANIC("Avds CPU Architecture %s i…

linux_常用命令

一、日常使用命令/常用快捷键命令 开关机命令 1、shutdown –h now&#xff1a;立刻进行关机 2、shutdown –r now&#xff1a;现在重新启动计算机 3、reboot&#xff1a;现在重新启动计算机 4、su -&#xff1a;切换用户&#xff1b;passwd&#xff1a;修改用户密码 5、logou…

使用IIS服务器部署Flask python Web项目

参考文章 ""D:\Program Files (x86)\Python310\python310.exe"|"D:\Program Files (x86)\Python310\lib\site-packages\wfastcgi.py"" can now be used as a FastCGI script processor参考文章 请求路径填写*&#xff0c;模块选择FastCgiModule&…

web-xss-dvwa

目录 xss&#xff08;reflected&#xff09; low medium high xss(store) low medium high xss(dom) low medium high xss&#xff08;reflected&#xff09; low 没有什么过滤&#xff0c;直接用最普通的标签就可以了 http://127.0.0.1/DVWA-master/vulnerabili…

【神经网络手写数字识别-最全源码(pytorch)】

Torch安装的方法 学习方法 1.边用边学&#xff0c;torch只是一个工具&#xff0c;真正用&#xff0c;查的过程才是学习的过程2.直接就上案例就行&#xff0c;先来跑&#xff0c;遇到什么来解决什么 Mnist分类任务&#xff1a; 网络基本构建与训练方法&#xff0c;常用函数解析…

【C语言】数据在内存中的存储详解

文章目录 一、什么是数据类型二、类型的基本归类三、 整型在内存中的存储1.原码、反码、补码2.大小端(1)什么是大小端(2)为什么会有大小端 四、浮点型在内存中的存储1. 浮点数存储规则 五、练习1.2.3.4.5.6.7. 一、什么是数据类型 我们可以把数据类型想象为一个矩形盒子&#x…