当前位置: 首页 > news >正文

express+vue 在线五子棋(一)

示例

在这里插入图片描述

在线体验地址五子棋,记得一定要再拉个人才能对战

本期难点

1、完成了五子棋的布局,判断游戏结束
2、基本的在线对战
3、游戏配套im(这个im的实现,请移步在线im)

下期安排

1、每步的倒计时设置
2、黑白棋分配由玩家自定义
3、新增旁观者
4、悔棋
5、自行创建一盘棋局

感兴趣的,还请点个免费的收藏与关注,后续会一直跟进这个系列

前端部分五子棋布局与游戏输赢判断

<template><div class="flex-wrap flex-justify-between"><div class="gobang-main"><!-- {{ userdata._id }}{{ gameBase }} -->步数: {{ currentStep }} 我方:{{ getQi }}<el-button v-if="isAdmin" @click="clearGame"> 清空游戏 </el-button><!-- 下棋区 --><game :list="gobangList" :config="config" @clickHandle="clickHandle"></game><!-- <el-button v-if="isGameOver && isAdmin" @click="reloadGame"> 重新开始 </el-button> --></div><!-- im区 --><Imref="imRef"v-if="game_im_id":style="{ width: '440px' }":isShowLeft="false":gobang_id="gobang_id":game_im_id="game_im_id"@room_baseinfo="room_baseinfo"@get_game_content="get_game_content"@get_gb_info="get_gb_info"@del_gobang="del_gobang"></Im></div>
</template><script>
import Im from '@/views/blog/im/index.vue'
import { baseURL } from '@/plugins/config.js'
import { get_gobang_list, post_gobang, get_gobang, del_gobang } from '@/api/data.js'
import game from './game.vue'
export default {components: {Im,game,},data() {return {isGameOver: false,page: 'list',gameBase: {_id:'',status: '',max: 10,max_move_time: 0,all_time: 0,hei_user_id: '',bai_user_id: '',im_romm_id:''},gobangMembers: [], // 五子棋游戏成员列表room_id: '',gobangList: [],config: {type: 1, // 1为白棋 2为黑棋line: 15, // 棋盘线条数width: 36,},first: true,}},computed: {...Vuex.mapState(['userdata']),...Vuex.mapGetters(['isAdmin']),gobang_id() {return this.gameBase._id},game_im_id() {return this.gameBase.im_romm_id},// 当前步数currentStep() {let result = 0this.gobangList.forEach((item) => {item.forEach((itey) => {if (itey.step_number > 0) {result += 1}})})return result},getQi() {// 自己是黑棋还是白棋let { _id } = this.userdataif (_id == this.gameBase.bai_user_id) {return '白棋'}if (_id == this.gameBase.hei_user_id) {return '黑棋'}return '观众'},step_content() {// 具体下的内容 1白字 2黑子const obj = {白棋: 1,黑棋: 2,}return obj[this.getQi] || 0},},created() {this.init()},methods: {del_gobang() {// 清空数据// this.gobangList = []// this.isGameOver = false// this.gameBase = {//     status: '',//     max: 10,//     max_move_time: 0,//     all_time: 0,//     hei_user_id: '',//     bai_user_id: '',// }location.reload()},clearGame() {this.$confirm('确定要清空游戏吗?').then((res) => {this.$refs.imRef.send_msg({room_id: this.room_id,specialType: 3,gobang_id: this.gobang_id,})}).catch(() => {})},// 黑棋先行,一人一只下isShould() {let { currentStep, gobangList, step_content } = this// 黑棋个数let heiNumber = 0// 白棋个数let baiNumber = 0// 遍历棋盘gobangList.forEach((aaa) => {aaa.forEach((item) => {if (item.step_content == 1) {baiNumber += 1}if (item.step_content == 2) {heiNumber += 1}})})// 判断现在下的步数的奇数还是偶数let isOdd = currentStep % 2if (step_content === 1) {// 白棋return isOdd === 1}if (step_content === 2) {// 黑棋return isOdd === 0}},clickHandle({ x, y }) {let {step_content,room_id,gobang_id,userdata: { _id: author_id },currentStep,isGameOver,} = thisif (isGameOver) {return this.$message.warning('游戏已结束')}// 只有棋手才能下棋if (![1, 2].includes(+step_content)) return// 判断是否该下子if (!this.isShould()) {return this.$message.warning('请等待对方落子')}let obj = {room_id,specialType: 2,gobang_id,gobang_member_id: author_id,step_number: currentStep + 1,step_content,x,y,author_id,}this.$refs.imRef.send_msg(obj, () => {})},room_baseinfo({ gobangMembers, room_id }) {this.gobangMembers = Array.isArray(gobangMembers) ? gobangMembers : []this.room_id = room_id || ''},initConfigList() {// 生成一个二维数组let { line } = this.configfor (let i = 0; i < line; i++) {this.gobangList.push([])for (let j = 0; j < line; j++) {this.gobangList[i].push({x: i,y: j,step_content: 0, // 0: 空 1: 白 2: 黑})}}},async init() {this.initConfigList()let res = nulltry {res = await get_gobang_list()} catch (err) {return}if (res.data || this.isArray(res.data.data)) {if (res.data.data.length === 0) {let res = await post_gobang({game_name: '五子棋',}).catch(() => {return {}})if (!res.data || !this.isObject(res.data.data)) returnObject.assign(this.gameBase,res.data.data)}if (res.data.data.length) {Object.assign(this.gameBase,res.data.data[0])}}// 获取现有的对局信息get_gobang({ gobang_id: this.gobang_id }).then((res) => {if (res.data && this.isArrayLength(res.data.data)) {let arr = res.data.datathis.gobangList = this.gobangList.map((aaa) => {aaa = aaa.map((item) => {let { x, y } = itemarr.find((itey) => {let { step_content, step_number, gobang_member_id } = iteyif (itey.x == x + 1 && itey.y == y + 1 && step_content) {Object.assign(item, {step_content,step_number,gobang_member_id,})return true}})return item})return aaa})console.log(this.gobangList)}}).catch(() => {})},get_game_content(row) {this.gobangList = this.gobangList.map((aaa) => {aaa = aaa.map((item) => {let { x, y } = itemlet { step_content, step_number, gobang_member_id } = rowif (row.x == x + 1 && row.y == y + 1 && step_content) {Object.assign(item, {step_content,step_number,gobang_member_id,})}return item})return aaa})this.checkWin()},get_gb_info(row) {this.gameBase = Object.assign(this.gameBase, row)console.log('get_gb_info',this.gameBase)},// 判断是否胜利 需要知道哪种棋子胜利checkWin() {// if(this.first) returnthis.first = false// 判断当前棋盘是否有五子连珠let { line } = this.configlet { gobangList: list } = thislet type = 0 // 0: 没有胜利 1: 白棋胜利 2: 黑棋胜利 3: 平局// 判断横向for (let i = 0; i < line; i++) {for (let j = 0; j < line - 4; j++) {if (list[i][j].step_content !== 0 &&list[i][j].step_content === list[i][j + 1].step_content &&list[i][j].step_content === list[i][j + 2].step_content &&list[i][j].step_content === list[i][j + 3].step_content &&list[i][j].step_content === list[i][j + 4].step_content) {type = list[i][j].step_contentbreak}}}// 判断纵向for (let i = 0; i < line; i++) {for (let j = 0; j < line - 4; j++) {if (list[j][i].step_content !== 0 &&list[j][i].step_content === list[j + 1][i].step_content &&list[j][i].step_content === list[j + 2][i].step_content &&list[j][i].step_content === list[j + 3][i].step_content &&list[j][i].step_content === list[j + 4][i].step_content) {type = list[j][i].step_contentbreak}}}// 判断左斜for (let i = 0; i < line - 4; i++) {for (let j = 0; j < line - 4; j++) {if (list[i][j].step_content !== 0 &&list[i][j].step_content === list[i + 1][j + 1].step_content &&list[i][j].step_content === list[i + 2][j + 2].step_content &&list[i][j].step_content === list[i + 3][j + 3].step_content &&list[i][j].step_content === list[i + 4][j + 4].step_content) {type = list[i][j].step_contentbreak}}}// 判断右斜for (let i = 0; i < line - 4; i++) {for (let j = 4; j < line; j++) {if (list[i][j].step_content !== 0 &&list[i][j].step_content === list[i + 1][j - 1].step_content &&list[i][j].step_content === list[i + 2][j - 2].step_content &&list[i][j].step_content === list[i + 3][j - 3].step_content &&list[i][j].step_content === list[i + 4][j - 4].step_content) {type = list[i][j].step_contentbreak}}}// 判断是否平局let flag = truefor (let i = 0; i < line; i++) {for (let j = 0; j < line; j++) {if (list[i][j].step_content == 0) {flag = falsebreak}}}// 如果是平局if (flag) {type = 3}const obj = {1: '白棋胜利',2: '黑棋胜利',3: '平局',}if (obj[type]) {this.$message.success(obj[type])this.isGameOver = true}},},
}
</script><style lang="scss" scoped></style>

express代码

Gobang 为五子棋基本设置表
GobangMember 五子棋对战与观战人表
GobangItem 每一步的对战信息表

const { io } = require("../../tool/socket.js");
const { AuthorInfo } = require("../../mod/author/author_info");
const { ImRoom } = require("../../mod/game/im_room.js");
const { ImRoomSys } = require("../../mod/game/im_room_sys.js");
const { ImRoomMember } = require("../../mod/game/im_room_member.js");
const { Game } = require("../../mod/game/game.js");
const { GameList } = require("../../mod/game/game_list.js");
const { Gobang } = require("../../mod/game/gobang.js");
const { GobangMember } = require("../../mod/game/gobang_member.js");
const { GobangItem } = require("../../mod/game/gobang_item.js");let allSocket = {};// 监听客户端的连接
io.on("connection", function (socket) {allSocket[socket.id] = socket;// 监听用户掉线socket.on("disconnect", async () => {// 更新用户状态let user = await ImRoomMember.findOneAndUpdate({ socket_id: socket.id },{ status: "2" });if (user) {delete allSocket[user.im_room_id];// 这是触发的方法数组,默认只有im的人员信息变化const funStatus = ["members_change"];// 对于五子棋游戏相关退出房间操作try {let res = await GobangMember.findOneAndUpdate({ socket_id: socket.id },{ status: "2" });// TODO: 这儿存在性能问题if (res.n == 1) {funStatus.push("gobang_members_change");}} catch (err) {console.log(err);}// 向房间的用户同步信息sendMsgToRoom(user.im_room_id, null, funStatus);}});// 监听加入房间socket.on("join_room", async (data) => {if (!global.isObject(data)) {resMsg("加入房间参数错误", 400);return;}// game_id 是游戏id,只有游戏才需要传入let { user_id, room_id, gobang_id } = data;if (!user_id) {resMsg("用户id不能为空", 400);return;}let user = await AuthorInfo.findOne({ _id: user_id });if (!user) {resMsg("用户不存在", 400);return;}if (!room_id) {resMsg("房间id不能为空", 400);return;}let room = await ImRoom.findOne({ _id: room_id, status: "1" });if (!room) {resMsg("房间不存在", 400);return;}let { max, status } = room;if (+status !== 1) {resMsg("房间未开放", 300);return;}// 查找所有加入该房间,并且状态为在线的用户let members = await ImRoomMember.find({im_room_id: room_id,status: 1,}).countDocuments();if (members >= max) {resMsg("房间已满", 300);return;}// 查找用户是否已经加入过该房间let oldUser = await ImRoomMember.findOne({im_room_id: room_id,author_id: user_id,});if (!oldUser) {let res = await new ImRoomMember({im_room_id: room_id,author_id: user_id,author_type: 2,created_time: getCurrentTimer(),updated_time: getCurrentTimer(),status: 1,socket_id: socket.id,}).save();if (!res) {resMsg("加入房间失败", 400);return;}} else {await ImRoomMember.updateOne({ im_room_id: room_id, author_id: user_id },{ socket_id: socket.id, status: 1 });}// 这是触发的方法数组,默认只有im的人员信息变化const funStatus = ["members_change"];// 对于五子棋游戏相关加入房间操作if (gobang_id) {let game = await Gobang.findOne({ _id: gobang_id });if (!game) {resMsg("游戏不存在", 400);return;}// 查找用户是否已经加入过该游戏let oldUser = await GobangMember.findOne({gobang_id,author_id: user_id,});if (!oldUser) {let res = await new GobangMember({gobang_id,author_id: user_id,created_time: getCurrentTimer(),updated_time: getCurrentTimer(),status: 1,socket_id: socket.id,user_type: "3",}).save();if (!res) {resMsg("加入游戏失败", 400);return;}} else {try {await GobangMember.updateOne({ gobang_id, author_id: user_id },{ socket_id: socket.id, status: 1 });} catch (error) {console.log("err", err);}}// 查看是否需要更新游戏基本信息-黑棋与白棋let gameInfo = await Gobang.findOne({ _id: gobang_id });if (gameInfo) {let { bai_user_id, hei_user_id } = gameInfo;// 查看用户是否在线let baiUser = await GobangMember.findOne({author_id: bai_user_id,gobang_id,});let heiUser = await GobangMember.findOne({author_id: hei_user_id,gobang_id,});console.log(111,heiUser,baiUser)if (!heiUser) {await Gobang.updateOne({ _id: gobang_id }, { hei_user_id: user_id });} else if (!baiUser) {await Gobang.updateOne({ _id: gobang_id }, { bai_user_id: user_id });}}funStatus.push("get_gb");funStatus.push("gobang_members_change");}// 房间信息改变,向房间内所有在线用户推送房间信息sendMsgToRoom(room_id, null, funStatus, gobang_id);});// 主动推出登录socket.on("live_room", async (data) => {let { room_id, user_id, gobang_id } = data;// 更新用户状态let user = await ImRoomMember.findOneAndUpdate({ im_room_id: room_id, author_id: user_id },{ status: "2" });if (user) {delete allSocket[user.socket_id];// 这是触发的方法数组,默认只有im的人员信息变化const funStatus = ["members_change"];if (gobang_id) {// 对于五子棋游戏相关退出房间操作try {await GobangMember.findOneAndUpdate({ gobang_id, author_id: user_id },{ status: "2" });} catch (err) {console.log(err);}funStatus.push("gobang_members_change");}// 向房间的用户同步信息sendMsgToRoom(room_id, null, funStatus, gobang_id);}});// 发送消息socket.on("send_msg", async (data) => {if (!global.isObject(data)) return;// time是时长// specialType 默认1 im的发送消息;2 五子棋的发送下棋消息 3 五子棋发送清空数据消息let {room_id,author_id,content,msg_type = "1",time = 0,poster = "",video_width = "",video_height = "",specialType = 1,gobang_id,gobang_member_id,step_number,step_content = 0,x,y,} = data;if (specialType == 3) {// 有关五子棋的消息if (!gobang_id || !room_id) {resMsg("清空数据消息有字段缺失", 400, "err", socket);return;}let gobang = await Gobang.findOneAndDelete({ _id: gobang_id });if (!gobang) {resMsg("删除失败", 400, "err", socket);return;}let { im_romm_id } = gobang;// 删除人员await ImRoomMember.deleteMany({ gobang_id: gobang_id });// 删除对局信息await GobangItem.deleteMany({ gobang_id: gobang_id });// 删除聊天室await ImRoom.deleteOne({ _id: im_romm_id });// 删除聊天记录await ImRoomSys.deleteMany({ im_romm_id });// 删除聊天成员信息await ImRoomMember.deleteMany({ im_romm_id });console.log(111)sendMsgToRoom(room_id, null, ["del_gobang"], gobang_id);return}if (specialType == 2) {// 有关五子棋的消息console.log(data);if (!room_id ||!gobang_id ||!gobang_member_id ||!gobang_member_id ||!step_number ||!x ||!y ||!author_id) {resMsg("下棋消息有字段缺失", 400, "err", socket);return;}if (![1, 2].includes(+step_content)) {resMsg("观众不能下棋", 400, "err", socket);return;}let oldGb = await GobangItem.findOne({gobang_id,step_number,});if (oldGb) {resMsg("您已经下过棋了", 400);return;}try {let newGb = await new GobangItem({gobang_id,gobang_member_id: author_id,step_number,created_time: getCurrentTimer(),updated_time: getCurrentTimer(),step_content,x,y,}).save();sendMsgToRoom(room_id, newGb, [], gobang_id);} catch (err) {console.log(err);resMsg("保存步数失败", 400);return;}return;}if (!content) {resMsg("请输入内容", 400);return;}// 判断用户是否存在if (!author_id) {resMsg("用户id不能为空", 400);return;}let user = await AuthorInfo.findOne({ _id: author_id });if (!user) {resMsg("用户id不能为空", 400);return;}// 判断房间是否存在if (!room_id) {resMsg("房间id不能为空", 400);return;}let room = await ImRoom({ _id: room_id, status: "1" });if (!room) {resMsg("房间未开放", 400);return;}if (!content) {resMsg("消息内容不能为空", 400);return;}// 保存消息let params = {im_room_id: room_id,author_id: author_id,content: content,msg_type,created_time: getCurrentTimer(),updated_time: getCurrentTimer(),};if (time) {params.time = time;}if (msg_type == 4) {if (poster) {params.poster = poster;}if (video_width) {params.video_width = video_width;}if (video_height) {params.video_height = video_height;}}let room_sys = await new ImRoomSys(params).save();if (!room_sys) {resMsg("保存消息失败", 400);return;}// 找出对应的成员信息let userinfo = await AuthorInfo.findOne({ _id: author_id },{username: 1,header_img: 1,});if (!userinfo) {resMsg("用户信息不存在", 400);return;}room_sys.author_id = userinfo;sendMsgToRoom(room_id, room_sys);});/*** 向一个房间内的所有在线用户推送房间的基本信息* row 本次聊天信息* name 触发事件的小别名* **/async function sendMsgToRoom(room_id, row = null, names = [], game_id = "") {if (!room_id) return;// 找出全部在线的成员let members = await ImRoomMember.find({im_room_id: room_id,status: 1,},{ socket_id: 1 });if (!members || members.length === 0) return;let sockets = members.map((item) => item.socket_id);// 找出房间信息let room = (await ImRoom.findOne({ _id: room_id, status: "1" })) || {};// 查找出当前房间的总消息数let roomSysCount = await ImRoomSys.find({im_room_id: room_id,}).countDocuments();let res = {data: room,roomSysCount,msg: "房间信息已更新",};if (names.length > 0) {// 去重names = [...new Set(names)];for (let i = 0; i < names.length; i++) {const item = names[i];switch (item) {case "members_change":// 人员状态有变化let roomMembers = await ImRoomMember.find({ im_room_id: room_id },{ author_id: 1, status: 1, room_username: 1 }).populate("author_id", "username header_img").exec();res.roomMembers = roomMembers;break;case "gobang_members_change":// 五子棋人员状态有变化let gobangMembers = await GobangMember.find({ gobang_id: game_id }).populate("author_id", "username header_img").exec();Object.assign(res, {gobangMembers,});break;case "get_gb":// 获取游戏的基本信息let gameInfo = await Gobang.findOne({ _id: game_id });if (gameInfo) {res.gb_info = gameInfo;}break;case "del_gobang":res.is_del_gobang = true;break;}}}if (global.isObject(row)) {if (game_id) {// 五子棋消息res.game_content = row;} else {// im有新消息res.content = row;}}sockets.forEach((item) => {let socket = allSocket[item];if (socket) {resMsg(res, 200, "room_baseinfo", socket);}});}// 获取当前时间戳function getCurrentTimer() {return Date.now();}// 统一返回消息function resMsg(msg, code = 400, name = "err", _socket) {let obj = {code,};if (code === 200) {obj.msg = "操作成功";obj.data = msg;} else {obj.msg = msg;}socket = _socket ? _socket : socket;socket.emit(name, obj);}
});

相关文章:

express+vue 在线五子棋(一)

示例 在线体验地址五子棋&#xff0c;记得一定要再拉个人才能对战 本期难点 1、完成了五子棋的布局&#xff0c;判断游戏结束 2、基本的在线对战 3、游戏配套im(这个im的实现&#xff0c;请移步在线im) 下期安排 1、每步的倒计时设置 2、黑白棋分配由玩家自定义 3、新增旁观…...

AI 大模型企业应用实战(06)-初识LangChain

LLM大模型与AI应用的粘合剂。 1 langchain是什么以及发展过程 LangChain是一个开源框架&#xff0c;旨在简化使用大型语言模型构建端到端应用程序的过程&#xff0c;也是ReAct(reasonact)论文的落地实现。 2022年10月25日开源 54K star 种子轮一周1000万美金&#xff0c;A轮2…...

JavaScript的学习之旅之初始JS

目录 一、认识三个常见的js代码 二、js写入的第二种方式 三、js里内外部文件 一、认识三个常见的js代码 <script>//写入js位置的第一个地方// 控制浏览器弹出一个警告框alert("这是一个警告");// 在计算机页面输入一个内容&#xff08;写入body中&#xff…...

DataStructure.时间和空间复杂度

时间和空间复杂度 【本节目标】1. 如何衡量一个算法的好坏2. 算法效率3. 时间复杂度3.1 时间复杂度的概念3.2 大O的渐进表示法3.3 推导大O阶方法3.4 常见时间复杂度计算举例3.4.1 示例13.4.2 示例23.4.3 示例33.4.4 示例43.4.5 示例53.4.6 示例63.4.7 示例7 4.空间复杂度4.1 示…...

[Spring Boot]Netty-UDP客户端

文章目录 简述Netty-UDP集成pom引入ClientHandler调用 消息发送与接收在线UDP服务系统调用 简述 最近在一些场景中需要使用UDP客户端进行&#xff0c;所以开始集成新的东西。本文集成了一个基于netty的SpringBoot的简单的应用场景。 Netty-UDP集成 pom引入 <!-- netty --…...

基础C语言知识串串香11☞宏定义与预处理、函数和函数库

​ 六、C语言宏定义与预处理、函数和函数库 6.1 编译工具链 源码.c ——> (预处理)——>预处理过的.i文件——>(编译)——>汇编文件.S——>(汇编)——>目标文件.o->(链接)——>elf可执行程序 预处理用预处理器&#xff0c;编译用编译器&#xff0c;…...

Python 3 函数

Python 3 函数 引言 Python 是一种高级编程语言,以其简洁明了的语法和强大的功能而闻名。在 Python 中,函数是一等公民,扮演着至关重要的角色。它们是组织代码、提高代码复用性和模块化编程的关键。本文将深入探讨 Python 3 中的函数,包括其定义、特性、类型以及最佳实践…...

【Linux详解】冯诺依曼架构 | 操作系统设计 | 斯坦福经典项目Pintos

目录 一. 冯诺依曼体系结构 (Von Neumann Architecture) 注意事项 存储器的意义&#xff1a;缓冲 数据流动示例 二. 操作系统 (Operating System) 操作系统的概念 操作系统的定位与目的 操作系统的管理 系统调用和库函数 操作系统的管理&#xff1a; sum 三. 系统调…...

html做一个画热图的软件

完整示例 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>热图生成器</title><script src"https://cdn.plot.ly/plotly-latest.min.js"></script><style>body …...

软考初级网络管理员__软件单选题

1.在Excel 中&#xff0c;设单元格F1的值为56.323&#xff0c;若在单元格F2中输入公式"TEXT(F1,"&#xffe5;0.00”)”&#xff0c;则单元格F2的值为()。 &#xffe5;56 &#xffe5;56.323 &#xffe5;56.32 &#xffe5;56.00 2.要使Word 能自动提醒英文单…...

数据库新技术【分布式数据库】

文章目录 第一章 概述1.1 基本概念1.1.1 分布式数据库1.1.2 数据管理的透明性1.1.3 可靠性1.1.4 分布式数据库与集中式数据库的区别 1.2 体系结构1.3 全局目录1.4 关系代数1.4.1 基操1.4.2 关系表达式1.4.3 查询树 第二章 分布式数据库的设计2.1 设计策略2.2 分布设计的目标2.3…...

关于运用人工智能帮助自己实现英语能力的有效提升?

# 实验报告 ## 实验目的 - 描述实验的目标&#xff1a;自己可以知道&#xff0c;自己的ai学习方法是否可以有效帮助自己实现自己的学习提升。 预期结果&#xff1a;在自己利用科技对于自己进行学习的过程中&#xff0c;自己的成长速度应该是一个幂指数的增长 ## 文献回顾 根据…...

IPv6知识点整理

IPv6&#xff1a;是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议&#xff0c;其地址数量号称可以为全世界的每一粒沙子编上一个地址 。 国…...

数据赋能(127)——体系:数据标准化——概述、关注焦点

概述 数据标准化是指将数据按照一定的规范和标准进行处理的过程。 数据标准化是属于数据整理过程。 数据标准化的目的在于提高数据的质量、促进数据的共享和交互、降低数据管理的成本&#xff0c;并增强数据的安全性。通过数据标准化&#xff0c;可以使得数据具有统一的格式…...

【 ARMv8/ARMv9 硬件加速系列 3.5.1 -- SVE 谓词寄存器有多少位?】

文章目录 SVE 谓词寄存器(predicate registers)简介SVE 谓词寄存器的位数SVE 谓词寄存器对向量寄存器的控制SVE 谓词寄存器位数计算SVE 谓词寄存器小结 SVE 谓词寄存器(predicate registers)简介 ARMv9的Scalable Vector Extension (SVE) 引入了谓词寄存器&#xff08;Predica…...

Python - 调用函数时检查参数的类型是否合规

前言 阅读本文大概需要3分钟 说明 在python中&#xff0c;即使加入了类型注解&#xff0c;使用注解之外的类型也是不报错的 def test(uid: int):print(uid)test("999")但是我就想要类型不对就直接报错确实可以另辟蹊径&#xff0c;实现报错&#xff0c;似乎有强…...

Python基础面试题解答

Python基础面试题解答 基础语法 1. Python中的变量是如何管理内存的&#xff1f; Python中的变量通过引用计数来管理内存。当一个变量被创建时&#xff0c;会分配一个内存地址&#xff0c;并记录引用次数。当引用次数变为0时&#xff0c;垃圾回收机制会自动释放该内存。 2.…...

MATLAB直方图中bin中心与bin边界之间的转换

要将 bin 中心转换为 bin 边界&#xff0c;请计算 centers 中各连续值之间的中点。 d diff(centers)/2; edges [centers(1)-d(1), centers(1:end-1)d, centers(end)d(end)];要将 bin 边界转换为bin 中心 bincenters binedges(1:end-1)diff(binedges)/2;...

Chromium 开发指南2024 Mac篇-开始编译Chromium(五)

1.引言 在之前的指南中&#xff0c;我们已经详细介绍了在 macOS 上编译和开发 Chromium 的准备工作。您学会了如何安装和配置 Xcode&#xff0c;如何下载和配置 depot_tools&#xff0c;以及如何获取 Chromium 的源代码。通过这些步骤&#xff0c;您的开发环境已经搭建完毕&am…...

2024.06.11校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 美团2025届北斗计划正式启动&#xff08;内推&#xff09; 校招 | 美团2025届北斗计划正式启动&#xff08;内推&#xff09; 2、实习 | 沃尔沃汽车 Open Day & 实习招聘 …...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...