Screeps Arena 游戏基础教程

  • 一. 游戏内教程汉化
    • 1. 循环和导入(Loop and Import)
    • 2. 简单移动(Simple move)
    • 3. 首次攻击(First Attack)
    • 4. 爬虫的身体部分(Creeps Bodies)
    • 5. 存储和转移 (Store and Transfer)
    • 6. 地形 (Terrain)
    • 7. 生产爬虫(Spawn Creeps)
    • 8. 收割能源(Harvest Energy)
    • 9. 建设(Construction)
    • 10. 最终测试(Final Test)

Screeps Arena 是一款纯编程的RTS游戏(即时战略游戏),通过编写JavaScript(或其他语言)代码,控制从采集资源、生产单位、建造、移动、攻击的各种操作和应变逻辑,来让自己的战略运行起来,和其他的代码成果进行对局。

一. 游戏内教程汉化

1. 循环和导入(Loop and Import)

欢迎来到本教程,您将学习如何通过编码发挥爬虫竞技场 (Screeps Arena) 的基础知识。

你通过在本地文件夹中编写代码来玩游戏,游戏内的编辑器不好使,所有我们推荐你们使用一些其他的代码编辑器,例如vscode来编写代码。

循环:
当您点击PLAY按钮时,这些文件被提交给服务器。如果你的代码中没有语法错误,游戏就会开始,你就可以观看了。你不能在游戏期间更改提交的代码,比赛几秒钟后就结束了之后,你可以用任何速度观看。

每一个回合(或者我们称之为tick),游戏都会运行你的主函数 loop() 。该函数在main.mjs中被定义:

export function loop() {// Your code goes here
}

这个函数中的所有内容都将被反复执行,直到游戏结束。

导入:
有一个特殊的函数getTicks(),您可以调用它来确定当前的刻度是多少。为了调用它,你必须将它从/game/utils模块导入到你的代码中:

import { getTicks } from 'game/utils';export function loop() {console.log('Current tick:', getTicks());
}

有许多方法和对象可以通过这种方式导入。请参阅文档了解。console.log()输出游戏控制台面板中的任何值,以便您可以调试和检查正在运行的代码。你不需要导入这个函数,它是全局可用的。

让我们开始:
在教程的第一步,我们没有任何游戏对象,游戏地图完全是空的。完成这一步所要的就是打印循环的一些信息。只需要将上面的代码复制粘贴到你的main.mjs文件中,然后点击PLAY按钮运行。
在这里插入图片描述


2. 简单移动(Simple move)

每个爬虫可以做各种动作,显然它可以移动。

creep.moveTo(target);

这个命令会让你的爬虫向目标移动一步,如果你在每次循环迭代中都执行它,你的爬虫就会一直移动到目的地。(在调用此函数时立即执行,但只能在循环函数完成之后执行移动。)

从代码访问你的爬虫,有一个特殊的函数叫做getObjectsByPrototype( ) ,它返回一个数组,其中包含所有具有给定原型或类的游戏对象。你可以像下面这样选择游戏中的所有爬虫:

import { getObjectsByPrototype } from 'game/utils';
import { Creep } from 'game/prototypes';export function loop() {let creeps = getObjectsByPrototype(Creep);
}

在本教程的步骤中,我们有一个Flag对象,它也有它的原型名称。

最终目标:使用移动的方法让你的爬虫踩到旗子上。

代码如下:

import { getObjectsByPrototype } from 'game/utils';
import { Creep, Flag } from 'game/prototypes';export function loop() {let creeps = getObjectsByPrototype(Creep);let flags = getObjectsByPrototype(Flag);creeps[0].moveTo(flags[0]);
}

3. 首次攻击(First Attack)

Screeps Arena是一款多人PvP游戏,你的爬虫将会和对手的爬虫战斗,所有让我们来简单学习一下攻击。

如何判断哪些是你的爬虫,使用JavaScript标准的Array.filter( )Array.find( )方法返回给定条件的元素数组。

filter( ) 方法返回提供的数组中满足所提供测试函数的所有元素的数组。

const words = ['spray', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter((word) => word.length > 6);
console.log(result);
// Expected output: Array ["exuberant", "destruction", "present"]

find() 方法返回提供的数组中满足所提供测试函数的第一个元素。

const array1 = [5, 12, 8, 130, 44];
const found = array1.find((element) => element > 10);
console.log(found);
// Expected output: 12

在下面的例子中,可以基于爬虫的属性来查找指定爬虫。

import { getObjectsByPrototype } from 'game/utils';
import { Creep } from 'game/prototypes';export function loop() {var myCreep = getObjectsByPrototype(Creep).find(creep => creep.my);var enemyCreep = getObjectsByPrototype(Creep).find(creep => !creep.my);
}

现在我们可以使用attack方法攻击敌人了,当它无法到达目标时,他将返回ERR_NOT_IN_RANGE的错误信息,所以你需要先使用moveTo:

if(myCreep.attack(enemyCreep) == ERR_NOT_IN_RANGE) {myCreep.moveTo(enemyCreep);
}

本节最终目标:消灭敌方爬虫。

import { getObjectsByPrototype } from 'game/utils';
import { Creep } from 'game/prototypes';
import { ERR_NOT_IN_RANGE } from 'game/constants';export function loop() {let myCreep = getObjectsByPrototype(Creep).find(creep => creep.my);let enemyCreep = getObjectsByPrototype(Creep).find(creep => !creep.my);if(myCreep.attack(enemyCreep) === ERR_NOT_IN_RANGE) {myCreep.moveTo(enemyCreep);}
}

4. 爬虫的身体部分(Creeps Bodies)

你可以调用爬虫的很多函数来完成某个行为,但是并非所有函数都可以用于某个爬虫。爬虫可以调用什么函数取决于它的身体部位。你可以检查他的body属性,它是一个数组,其中数组每个元素代表某种类型的一个主体部分:

MOVE:使爬虫移动。
ATTACK:允许它近战范围内攻击。
RANGED_ATTACK:允许它攻击3格外的目标。
HEAL:允许治疗它自己或另一个爬虫。
WORK:可以建造建筑或收集能量。
CARRY:增加爬虫携带资源的能力,身上可以携带更多的资源。
TOUGH :没有任何效果。

if(creep.body.some(bodyPart => bodyPart.type == ATTACK)) {// this creep has ATTACK body parts
}

Array..some() 是 JavaScript 中用于数组的方法之一,它用于检查数组中是否至少有一个元素满足指定的条件。这个方法会遍历数组的每个元素,直到找到一个满足条件的元素,然后立即返回 true。如果没有找到满足条件的元素,则返回 false。

array.some(callback(element[, index[, array]])[, thisArg])

参数说明:
callback:一个用于测试每个元素的函数,它可以接受三个参数:
element:当前正在处理的数组元素。
index(可选):当前正在处理的元素的索引。
array(可选):调用 some 方法的数组本身。
thisArg(可选):可选参数,函数执行时的 this 值。

每一个身体部位都会使爬虫的攻击力提高100点。当爬虫受到伤害时,他的身体部分也会受到伤害,如果该部分的数值被攻击清零了,它就会失去该部分的功能。同一类型的身体部位越多,这种类型的效果就越强。

现在,本教程步骤中我们有3种不同的部位:ATTACKRANGED_ATTACKHEAL的爬虫。只有协调好对手的行动,你才能打败他们。

为了做到这一点,使用与前一个教程步骤相同的方法,但根据他们的身体部位区分他们的行动,伤害发送者应该使用不同的方法(attackrangedAttack)进行伤害,治疗者应该使用heal方法治疗你受伤的爬虫。

import { getObjectsByPrototype } from 'game/utils';
import { Creep } from 'game/prototypes';
import { ERR_NOT_IN_RANGE, ATTACK, RANGED_ATTACK, HEAL } from 'game/constants';export function loop() {let myCreeps = getObjectsByPrototype(Creep).filter(creep => creep.my);let enemyCreep = getObjectsByPrototype(Creep).find(creep => !creep.my);for(let creep of myCreeps) {if(creep.body.some(bodyPart => bodyPart.type == ATTACK)) {if(creep.attack(enemyCreep) == ERR_NOT_IN_RANGE) {creep.moveTo(enemyCreep);}}if(creep.body.some(bodyPart => bodyPart.type == RANGED_ATTACK)) {if(creep.rangedAttack(enemyCreep) == ERR_NOT_IN_RANGE) {creep.moveTo(enemyCreep);}}if(creep.body.some(bodyPart => bodyPart.type == HEAL)) {let myDamagedCreeps = myCreeps.filter(i => i.hits < i.hitsMax);if(myDamagedCreeps.length > 0) {if(creep.heal(myDamagedCreeps[0]) == ERR_NOT_IN_RANGE) {creep.moveTo(myDamagedCreeps[0]);}}}}
}

for...of 语句执行一个循环,该循环处理来自可迭代对象的值序列。可迭代对象包括内置对象的实例,例如 Array、String、TypedArray、Map、Set、NodeList(以及其他 DOM 集合),还包括 arguments 对象、由生成器函数生成的生成器,以及用户定义的可迭代对象。

const array1 = ['a', 'b', 'c'];
for (const element of array1) {console.log(element);
}
// Expected output: "a"
// Expected output: "b"
// Expected output: "c"

5. 存储和转移 (Store and Transfer)

在不同的区域,有不同的可用资源。但是有一种常见的资源类型RESOURCE_ENERGY,用来建造建筑、生产爬虫等各种活动。

塔(Tower)可以造成50点的范围攻击伤害,尽管它的效率随着距离的增加而降低。在本教程的步骤中,我们将使用能量来给塔充能,以击败敌人。

tower.attack(target);

塔每次射击消耗10个能量单位。为了给它装载能量,你需要使用一个将能量传递给它的爬虫。

creep.transfer(tower, RESOURCE_ENERGY);

从哪里获得能量?附近有一个容器(Container),它的store有一些能量。你可以移动爬虫去容器中回收能量:

creep.withdraw(container, RESOURCE_ENERGY);

当塔内有足够能量时,他会攻击并摧毁目标。

如果你使用我们的示例代码,请注意我们现在是如何以不同的方式导入内容的(不是特别定义他们,而是从/game模块导入整个命名空间。)用哪种导入的写法,根据自己的喜好来:

import { prototypes, utils, constants } from 'game';export function loop() {const tower = utils.getObjectsByPrototype(prototypes.StructureTower)[0];if(tower.store[constants.RESOURCE_ENERGY] < 10) {let myCreep = utils.getObjectsByPrototype(prototypes.Creep).find(creep => creep.my);if(myCreep.store[constants.RESOURCE_ENERGY] == 0) {let container = utils.getObjectsByPrototype(prototypes.StructureContainer)[0];myCreep.withdraw(container, constants.RESOURCE_ENERGY);} else {myCreep.transfer(tower, constants.RESOURCE_ENERGY);}} else {let target = utils.getObjectsByPrototype(prototypes.Creep).find(creep => !creep.my);tower.attack(target);}
}

6. 地形 (Terrain)

游戏中5种地形:平原地形、天然的坚不可摧的墙壁、建造的可摧毁的墙、沼泽、道路。

沼泽和道路上移动与爬虫的重量相关联。每个爬虫的身体部位,除了MOVE,都会增加了他的重量。(一个空的CARRY 身体部位不会增加重量),但如果爬虫体内有资源将会增加它的身体重量。每个MOVE部位能增加爬虫的移动速度。如果的MOVE身体部位和所有其他身体部位数量数量相同时,你的爬虫将勉勉强强能够在平原地形上移动。否则小于的话,他会感到疲劳,动弹不得。

但是有相同身体部位的爬虫在沼泽上,它会变得更加疲劳,并且每5 tick才只能移动一次。为了让你每次tick都能移动,你的爬虫将需要5倍以上的MOVE部件。

相反,道路减少了你的爬虫对MOVE部件的需求。例如,如果你的爬虫有10个负重的身体部位,你在道路上移动就只需要5个MOVE身体部件就可以使这个爬虫每次循环移动。

注意,当你需要使用寻路算法从一个数组中找到一个位置最近的对象时,可以使用findClosestByPath 函数。

let flags = getObjectsByPrototype(Flag);
let closestFlag = creep.findClosestByPath(flags);

在本节教程中,你只需要将每个爬虫移动到相应的旗子。代码如下:

import { getObjectsByPrototype } from 'game/utils';
import { Creep, Flag } from 'game/prototypes';export function loop() {let creeps = getObjectsByPrototype(Creep).filter(i => i.my);let flags = getObjectsByPrototype(Flag);for(let creep of creeps) {let flag = creep.findClosestByPath(flags);creep.moveTo(flag);}
}

7. 生产爬虫(Spawn Creeps)

当你在一个有Spawn结构的竞技场上玩游戏时,你可以使用spawnCreep方法创建新的爬虫。您需要将新爬虫的主体定义为包含其主体部分的数组。

你想要刷出的爬虫越大,它消耗的能量就越多,具体数值如下:
MOVE:50能量
ATTACK:80能量
RANGED_ATTACK:150能量
HEAL:250能量
WORK:100能量
CARRY:50能量
TOUGH :10能量

spawnCreep方法返回一个稍后使用的Creep实例。

let creep = mySpawn.spawnCreep([MOVE, ATTACK]).object;

你甚至可以在loop函数之外定义变量,以便在tick之间使用它们:

let creep;
export function loop() {if(!creep) {creep = mySpawn.spawnCreep([MOVE, ATTACK]).object;}
}

请注意,您可以为这个爬虫对象分配任何属性,如果你想要给爬虫分布一些目标、角色或其他数据,这可能会很有用:

creep.target = flag;

在本教程步骤中,你有一个刷出和两个旗帜。目标:刷出两个爬虫,并将每个爬虫移动到每个旗帜上。

import { getObjectsByPrototype } from 'game/utils';
import { Creep, Flag, StructureSpawn } from 'game/prototypes';
import { MOVE } from 'game/constants';let creep1, creep2;export function loop() {let mySpawn = getObjectsByPrototype(StructureSpawn)[0];let flags = getObjectsByPrototype(Flag);if(!creep1) {creep1 = mySpawn.spawnCreep([MOVE]).object;} else {creep1.moveTo(flags[0]);if(!creep2) {creep2 = mySpawn.spawnCreep([MOVE]).object;} else {creep2.moveTo(flags[1]);}}
}

8. 收割能源(Harvest Energy)

能源可以以不同的形式获得,它可以存储在容器中,但是也可以从Sources中收获,如果你的爬虫有work身体部位,那么它就可以使用使用harvest方法从Source提取一些能量。

creep.harvest(source);

你的爬虫必须靠近能源才能执行这个动作。它拥有的WORK身体部位越多,每一次从能源处提取的能量就越多。能源中的能量储备是无限的,一段时间后会重新刷满。

本节目标:收割和转移1000能量到Spawn

import { prototypes, utils, constants } from 'game';export function loop() {let creep = utils.getObjectsByPrototype(prototypes.Creep).find(i => i.my);let source = utils.getObjectsByPrototype(prototypes.Source)[0];let spawn = utils.getObjectsByPrototype(prototypes.StructureSpawn).find(i => i.my);if(creep.store.getFreeCapacity(constants.RESOURCE_ENERGY)) {if(creep.harvest(source) == constants.ERR_NOT_IN_RANGE) {creep.moveTo(source);}} else {if(creep.transfer(spawn, constants.RESOURCE_ENERGY) == constants.ERR_NOT_IN_RANGE) {creep.moveTo(spawn);}}
}

9. 建设(Construction)

你不仅可以生成爬虫,还可以建造建筑!只需要一点能量和一个工人就能完成工作。

首先,使用createConstructionSite函数放置一个名为StructureTower在某个地方,你需要指定建筑的坐标和原型。

import { createConstructionSite } from 'game/utils';
import { StructureTower } from 'game/prototypes';export function loop() {let constructionSite = createConstructionSite({x: 50, y: 55}, StructureTower).object;
}

你带着能量的爬虫必须接近建筑工地建造他:

creep.build(constructionSite);

每一次成功的建造行动都会消耗你的爬虫体内存储的一些能量,所以你的爬虫需要在你的能量供应处和建筑工地之间来回穿梭。

本节目标:建造一座塔。

import { prototypes, utils } from 'game';
import { RESOURCE_ENERGY, ERR_NOT_IN_RANGE } from 'game/constants';export function loop() {const creep = utils.getObjectsByPrototype(prototypes.Creep).find(i => i.my);if(!creep.store[RESOURCE_ENERGY]) {const container = utils.findClosestByPath(creep, utils.getObjectsByPrototype(prototypes.StructureContainer));if(creep.withdraw(container, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {creep.moveTo(container);}} else {const constructionSite = utils.getObjectsByPrototype(prototypes.ConstructionSite).find(i => i.my);if(!constructionSite) {utils.createConstructionSite(50,55, prototypes.StructureTower);} else {if(creep.build(constructionSite) == ERR_NOT_IN_RANGE) {creep.moveTo(constructionSite);}}}
}

10. 最终测试(Final Test)

现在你已经学会了如何控制爬虫,攻击敌人,使用能量,产生新的爬虫,建造新的结构。看起来你已经为最终测试做好了准备!

在本教程步骤中,你有一个Spawn和一个Source。有一群敌人的爬虫,你要产生更多的爬虫,并击败他们。这次我们甚至不会给你提供示例代码! 当你完成本教程,你可以移动到真正的PvP竞技场,并开始在多人模式下与其他人战斗。祝你好运!

目标:在攻击中幸存下来,杀死所有的敌人并完成教程。

本节就不写示例代码了,每个人都有每个人自己的写法,正好做一个小小测试。

游戏官方已经提供了比较全面的vscode代码补全功能了,你只要用vscode打开对应模式的文件夹(注意不要单打开文件,而应该打开文件夹!)就能使用代码补全来编写代码了。然后在第一行加上// @ts-nocheck就不会报错啦。

以后打算再汉化一下官方的API文档,敬请期待,希望能帮到大家!

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

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

相关文章

通过提交容器的方式修改ubuntu镜像的apt源

通过提交容器的方式修改ubuntu镜像的apt源 步骤总结 问题&#xff0c;每次创建容器之后&#xff0c;都要在容器内手动更改镜像源。 不如&#xff0c;干脆修改镜像的apt源&#xff0c;一次到位。 步骤 先创建一个容器&#xff0c;到容器内执行变更命令。 D:/sandbox> dock…

江苏开放大学2024年春《中外设计史 060709》第二次测试参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 单选题 1美国现代建筑家赖特&#xff0c;提倡“有机建筑”的设…

Yarn 的安装和使用

在前端开发中&#xff0c;包管理工具是必不可少的利器&#xff0c;而 Yarn 就是其中一个备受欢迎的选择。本文将介绍如何安装和使用 Yarn&#xff0c;并解决可能遇到的一些常见问题&#xff0c;让你更高效地管理项目依赖。 什么是 Yarn&#xff1f; Yarn 是由 Facebook、Goo…

算法学习——LeetCode力扣图论篇1(797. 所有可能的路径、200. 岛屿数量、695. 岛屿的最大面积)

算法学习——LeetCode力扣图论篇1 797. 所有可能的路径 797. 所有可能的路径 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特…

【单】Unity _RPG项目中的问题

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a; ⭐…

C++:多态、模板

一、多态 相同的代码、实现不同的功能 1.前提 1.类之间有继承关系 2.父类中有虚函数 3.父类的指针指向子类的对象 2.函数重写 1.发生在继承之间 2.父类中有虚函数 3.子类中对父类的虚函数重新实现 3.虚函数 1.在函数头前加上virtual 2.只要基类中的函数是虚函数&#xff0c;后…

MyBatis-Plus04(条件构造器)

条件构造器和常用接口 wrapper介绍 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 QueryWrapper &#xff1a; 查询条件封装 UpdateWrapper &#xff1a; Update 条件封装 A…

如何在Ubuntu系统使用Nextcloud+Cpolar搭建可公网访问私人专属网盘

文章目录 1. 安装Docker2. 使用Docker拉取Nextcloud镜像3. 创建并启动Nextcloud容器4. 本地连接测试5. 公网远程访问本地Nextcloud容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛…

[选型必备基础信息] 存储器

存储芯片根据断电后是否保留存储的信息可分为易失性存储芯片&#xff08;RAM&#xff09;和非易失性存储芯片&#xff08;ROM&#xff09;。 简单说&#xff0c;存储类IC分为 ROM和RAM ROM&#xff1a;EEPROM / Flash / eMMC RAM&#xff1a;SRAM/SDRAM/DDR2/DDR3/DDR4/DDR5…

穿什么有这么重要?--装饰模式

1.1 穿什么有这么重要&#xff1f; 约会穿什么&#xff1f; "那要看你想给人家什么印象&#xff1f;是比较年轻&#xff0c;还是比较干练&#xff1b;是比较颓废&#xff0c;还是要比较阳光&#xff1b;也有可能你想给人家一种极其难忘的印象&#xff0c;那穿法又大不一样…

10秒钟用python接入讯飞星火API(保姆级)

正文&#xff1a; 科大讯飞是中国领先的人工智能公众公司&#xff0c;其讯飞星火API为开发者提供了丰富的接口和服务&#xff0c;以支持各种语音和语言技术的应用。 步骤一&#xff1a;注册账号并创建应用 首先&#xff0c;您需要访问科大讯飞开放平台官网&#xff0c;注册一个…

谷歌google广告和必应Bing广告,是否二选一?

搜索引擎广告凭借其精准定向、高度可见性和高效转化能力&#xff0c;成为众多企业拓展海外市场、提升品牌影响力的重要手段。其中&#xff0c;谷歌Google与必应Bing作为全球两大主流搜索引擎&#xff0c;各自拥有庞大的用户群体与独特的市场优势。面对这两大广告平台&#xff0…

非关系型数据库(缓存数据库)redis的高可用(持久化)

目录 1.redis的高可用 2.Redis持久化 1.Redis 提供两种方式进行持久化 2.RDB持久化 2.1触发条件 2.1.1手动触发 2.1.2自动触发 2.1.3其他自动触发机制 2.2执行流程 ​编辑 2.3 启动时加载 3.AOF持久化 3.1开启AOF 3.2 执行流程 3.2.1append——命令追加 3.…

Crossmanager 2024 64 bit(CAD文件格式转换工具)安装包分享

新增功能 1、NavisWorks输入&#xff1a;首次发布&#xff0c;支持2016至2023版本 2、Fusion 360输入&#xff1a;首次发布&#xff0c;支持版本2.0 3、Catia V6/3D体验输入&#xff1a;支持R2023x版本 4、Solidworks输入&#xff1a;支持Solidworks 2023版本 5、Solid Ed…

《QT实用小工具·八》数据库通用翻页类

1、概述 源码放在文章末尾 该项目实现数据库通用翻页类&#xff0c;主要包含如下功能&#xff1a; 1:自动按照设定的每页多少行数据分页 2:只需要传入表名/字段集合/每页行数/翻页指示按钮/文字指示标签 3:提供公共静态方法绑定字段数据到下拉框 4:建议条件字段用数字类型的主…

论微服务架构及应用

2021年初&#xff0c;我所在的公司承担了某能源集团化工产业部的化工生产运营综合管控系统&#xff0c;简称运营管控系统。我有幸担任了该项目的系统架构师&#xff0c;主要负责系统的体系架构、架构评估和研发管理工作。 随着国内外化工行业日新月异的繁荣与发展&#xff…

机器学习 | 线性判别分析(Linear Discriminant Analysis)

1 机器学习中的建模 1.1 描述性建模 以方便的形式给出数据的主要特征&#xff0c;实质上是对数据的概括&#xff0c;以便在大量的或有噪声的数据中仍能观察到重要特征。重在认识数据的主要概貌&#xff0c;理解数据的重要特征。 Task&#xff1a;聚类分析&#xff0c;数据降…

C++类和对象第三讲总结

1.对象指针&#xff1a;指针->成员 // 指针存放了对象的地址 // 指针作为函数参数&#xff0c;可以真正改变对象成员的值 // 指针可以指向对象数组&#xff0c;它存放了数组首元素地址 // 指针偏移量可以访问数组的每个对象 2.一个练习案例 使用指针和对象数组打印…

【数学公式大全整理——1.0】

导数公式 积分表 万能公式 初等函数 重要极限 ### 诱导公式 和差角 和差化积 倍角公式 半角公式 正弦 余弦定理 反三角函数 高阶求导公式

Java-SpringMVC

一、SpringMVC简介 1、什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean&#xff1a…