纵横填字map版(初始数据结构)

2024-02-12 03:59

本文主要是介绍纵横填字map版(初始数据结构),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

新数据结构设计:

定义一个map:

key是横纵坐标字符串,比如“0,4”

value是一个json,包含以下属性:字,横向的词(若 有的话,无的话,空串),纵向的词(若有的话,无的话,空串)。

另有一个map,key是答案词语,value是,提示描述。

 

map版

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<title>天天填字012</title>
<meta name="Keywords" content="天天填字网 填字游戏 填字制作 在线填字游戏" />
<meta http-equiv="Content-Type" content="text/html" charset="utf-8">
<style type="text/css"><!--

body, h1, h2, h3, h4, h5, h6
{
font-family: Segoe UI, Franklin Gothic Medium, Arial, sans-serif;
}

h1, h2, h3, h4, h5, h6
{
color: #5d6a86;
}

body
{
cursor: default;
font-size: small;
}

.ecw-answerbox
{
color: black;
background-color: #F0F0F0;
border-color: #808080;
border-style: solid;
border-width: 1px;
display: block;
padding: .75em;
width: 240pt;
}

.ecw-box
{
border-style: solid;
border-width: 1pt;
cursor: pointer;
font-size: .24in;
font-weight: bold;
height: .35in;
overflow: hidden;
text-align: center;
width: .35in;
}

.ecw-boxcheated_sel
{
background-color: #FFF1D7;
border-color: #C00000;
color: #2080D0;
}

.ecw-boxcheated_unsel
{
background-color: #ffffff;
border-color: #606060;
color: #2080D0;
}

.ecw-boxerror_sel
{
background-color: #FFF1D7;
border-color: #C00000;
color: #BF0000;
}

.ecw-boxerror_unsel
{
background-color: #FFF0F0;
border-color: #606060;
color: #BF0000;
}

.ecw-boxnormal_sel
{
background-color: #FFF1D7;
border-color: #C00000;
color: #000000;
}

.ecw-boxnormal_unsel
{
background-color: #ffffff;
border-color: #606060;
color: #000000;
}

.ecw-button
{
width: 64pt;
}

/*.ecw-cluebox*/
/*{*/
/*border-bottom-width: 1px;*/
/*border-color: #c0c0c0;*/
/*border-left-width: 0px;*/
/*border-right-width: 0px;*/
/*border-style: solid;*/
/*border-top-width: 1px;*/
/*margin-top: 1em;*/
/*padding-bottom: .5em;*/
/*padding-left: 0pt;*/
/*padding-right: 0pt;*/
/*padding-top: .5em;*/
/*}*/

.ecw-crosswordarea
{
background-color: #8E8E8E;
border-color: #808080;
border-style: solid;
border-width: 2px;
padding: .5em;
font-family: Segoe UI, Verdana, Arial, sans-serif;
font-size: small;
}

.ecw-copyright
{
margin-bottom: 1em;
font-size: x-small;
font-family: Segoe UI, Franklin Gothic Medium, Arial, sans-serif;
}

.ecw-input
{
font-family: Segoe UI, Franklin Gothic Medium, Arial, sans-serif;
}

.ecw-wordlabel
{
text-transform: uppercase;
margin: 0;
}

.ecw-wordinfo
{
font-size: 8pt;
color: #808080;
}

.ecw-worderror
{
color: #c00000;
font-weight: bold;
display: none;
margin-top: 1em;
}

--></style>

</head><body>

<h1>天天填字012</h1>
<h3 style="margin-top: -1em;"></h3>

<div id="waitmessage" class="ecw-answerbox">
本填字游戏,需要您的浏览器支持JavaScript。
</div>

<table cellpadding="0" cellspacing="0" border="0"><tr>

<td class="ecw-crosswordarea"><table id="crossword" cellpadding="0" cellspacing="0" style="display: none; border-collapse: collapse;">

<script type="text/javascript"><!--

var map = new Map();


CrosswordWidth = 10;
CrosswordHeight = 10;
Words = 24;
WordLength = new Array(2, 2, 2, 2, 4, 3, 4, 2, 4, 3, 7, 5, 3, 4, 5, 3, 3, 6, 7, 2, 3, 4, 4, 2);
Word = new Array("杜甫", "皇甫", "女红", "道家", "赵氏孤儿", "马晓旭", "堂吉诃德", "里昂", "得寸进尺", "丘吉尔", "汉皇重色思倾国", "斯坦福大学", "火山灰", "杜甫草堂", "皇家马德里", "女儿国", "赵旭日", "吉尔吉斯斯坦", "一寸相思一寸灰", "戒尺", "三重门", "汉武大帝", "国际米兰", "斯文");
Clue = new Array("最近很忙的一位诗人",
"《百家姓》中的一个复姓。",
"旧时指女子所作的纺织、缝纫等工作。",
"我国古代的一个学派,代表人物有老子、庄子等。",
"元朝的一部杂剧,作者纪君祥。",
"女足球星,中国女足核心人物",
"塞万提斯笔下的著名人物,他仿效骑士的生活,把风车看作巨人, 把羊群当做敌军。",
"法国一座大城市,世界高级丝织品的最大产地之一。",
"比喻贪心不足,有了小的,又要大的。",
"二战时期的英国首相,与斯大林、罗斯福并立的“三巨头”之一",
"白居易《长恨歌》的首句,下句为“御宇多年求不得”。",
"美国一所知名私立高等学府,位于加利福尼亚州。",
"粒径很小的火山固态喷发物。因细小,喷发时可送达数十千米的大气层中,并可长期悬浮在空中。",
"“横向1”的故居。",
"西班牙著名足球俱乐部",
"《西游记》中的一个国家,该国境内没有男子。",
"男足球星,效力于广州恒大俱乐部",
"中亚内陆国,东邻中国,首都比什凯克。",
"李商隐《无题》中“春心莫共花争发”的下句。",
"旧时教师对学生施行体罚时所用的木板",
"作家韩寒的一部代表作",
"陈宝国、归亚蕾、陶红等主演的大型历史连续剧。",
"意甲一支实力强劲的球队,被称为“蓝黑军团”。",
"指文化或文人。");
// AnswerHash = new Array(80753, 46429, 61909, -27257, -49836, -23432, 60273, -26545, 41003, 2908, 49027, 42254, 9723, 44672, -58002, 77969, -15470, 91592, 69787, 85653, -24917, 16765, 92043, 72435);
WordX = new Array(0, 3, 8, 2, 5, 3, 0, 3, 6, 0, 3, 0, 5, 0, 3, 8, 5, 1, 7, 9, 5, 3, 9, 0);
WordY = new Array(0, 0, 0, 1, 1, 2, 3, 4, 4, 5, 6, 8, 9, 0, 0, 0, 1, 3, 3, 3, 5, 6, 6, 8);
LastHorizontalWord = 12;//最后一个水平词

OnlyCheckOnce = false;
//-->
</script>

<script type="text/javascript"><!--


function strMapToObj(strMap){
let obj= Object.create(null);
for (let[k,v] of strMap) {
obj[k] = v;
}
return obj;
}
//x,y
function posInMap(pos)
{
var obj = {word:'',index:0};
var index = 0;
for (let[k,v] of map) {
if(v.posArray.includes(pos))
{
obj.word=k;
obj.index=index;
break;
}
index++;
}

return obj;
}
function getWordIndex(word) {
var index = 0;
for (let[k,v] of map) {
if(k==word)
{
break;
}
index++;
}
return index;
}
//x,y
function posInMapEx(pos)
{
var obj = mapPos2Words.get(pos);
var ret = obj.arr[obj.selectIndex];
var index = ret.indexOf(obj.char);
var retObj = new Object();
retObj.index = index;
retObj.word = ret;
retObj.char = obj.char;
if(obj.arr.length > 1)
{
obj.selectIndex++;
obj.selectIndex = obj.selectIndex%2;
}
return retObj;
}

var mapPos2Words = new Map();



function GenMapPos2Words(map) {
for (let[k,v] of map) {
for(var i = 0; i < v.posArray.length; i++)
{
if(mapPos2Words.has(v.posArray[i]))
{
mapPos2Words.get(v.posArray[i]).arr.push(k);
}
else{
var obj = new Object();

obj.arr = [];
obj.arr.push(k);

obj.selectIndex = 0;
obj.char=k.charAt(i);
mapPos2Words.set(v.posArray[i],obj);
}
}
}
}

for(var z = 0; z < Word.length; z++)
{
var obj = new Object();
obj.description = Clue[z];
obj.posArray = [];


for(var m = 0; m < Word[z].length; m++)
{
if(z <= LastHorizontalWord)
{
obj.posArray.push(WordY[z] + "," + (WordX[z]+m));
}
else
{
obj.posArray.push((WordY[z]+m) + "," + WordX[z]);
}

}
map.set(Word[z],obj);
}

GenMapPos2Words(map);
// var mapjson = JSON.stringify(strMapToObj(map));
var mapjson = JSON.stringify(strMapToObj(mapPos2Words));
// alert(mapjson);

// var selObj.CurrentWord;
var PrevWordHorizontal, x, y, i, j;
var CrosswordFinished, Initialized;

// Check the user's browser and then initialize the puzzle.
if (document.getElementById("waitmessage") != null)
{
document.getElementById("waitmessage").innerHTML = "填字游戏正在载入...";


// Now, insert the row HTML into the table.
for (var x = 0; x < CrosswordWidth; x++)
{
document.writeln("<tr>");
for (var y = 0; y< CrosswordHeight; y++)
{
var pos = x+","+y;
var obj = posInMap(pos);
if (obj.word !='')
document.write("<td id=\"c" + PadNumber(x) + PadNumber(y) + "\" class=\"ecw-box ecw-boxnormal_unsel\" οnclick=\"SelectThisWord(event);\">&nbsp;</td>");
else
document.write("<td></td>");
}
document.writeln("</tr>");
}

// Finally, show the crossword and hide the wait message.
Initialized = true;
document.getElementById("waitmessage").style.display = "none";
document.getElementById("crossword").style.display = "block";
}

// ----------
// Event handlers

// Raised when a key is pressed in the word entry box.
function WordEntryKeyPress(event)
{
if (CrosswordFinished) return;
// Treat an Enter keypress as an OK click.
if (selObj.CurrentWord >= 0 && event.keyCode == 13) OKClick();
}

// ----------
// Helper functions

// Called when we're ready to start the crossword.
function BeginCrossword()
{
if (Initialized)
{
document.getElementById("welcomemessage").style.display = "";
document.getElementById("checkbutton").style.display = "";
}
}


// Pads a number out to three characters.
function PadNumber(number)
{
if (number < 10)
return "00" + number;
else if (number < 100)
return "0" + number;
else
return "" + number;
}

// Returns the table cell at a particular pair of coordinates.
function CellAt(x, y)
{
return document.getElementById("c" + PadNumber(x) + PadNumber(y));
}


// Deselects the current word, if there's a word selected. DOES not change the value of selObj.CurrentWord.
function DeselectCurrentWord()
{


document.getElementById("answerbox").style.display = "none";
ChangeCurrentWordSelectedStyle(false);
// selObj.CurrentWord = -1;

}

// Changes the style of the cells in the current word.
function ChangeWordStyle(WordNumber, NewStyle)
{


if (WordNumber<= LastHorizontalWord)
for (i = 0; i < WordLength[WordNumber]; i++)
CellAt(selObj.x, selObj.y-selObj.index + i).className = NewStyle;
else
for (i = 0; i < WordLength[WordNumber]; i++)
CellAt(selObj.x-selObj.index+ i, selObj.y ).className = NewStyle;
}

// Changes the style of the cells in the current word between the selected/unselected form.
function ChangeCurrentWordSelectedStyle(IsSelected)
{


if (selObj.CurrentWord <= LastHorizontalWord)
for (i = 0; i < WordLength[selObj.CurrentWord]; i++)
CellAt(selObj.x, selObj.y-selObj.index+ i).className = CellAt(selObj.x , selObj.y-selObj.index+ i).className.replace(IsSelected ? "_unsel" : "_sel", IsSelected ? "_sel" : "_unsel");
else
for (i = 0; i < WordLength[selObj.CurrentWord]; i++)
CellAt(selObj.x -selObj.index+ i, selObj.y ).className = CellAt(selObj.x-selObj.index + i, selObj.y).className.replace(IsSelected ? "_unsel" : "_sel", IsSelected ? "_sel" : "_unsel");

if(IsSelected==false)
selObj.CurrentWord = -1;

}

// Selects the new word by parsing the name of the TD element referenced by the
// event object, and then applying styles as necessary.
var selObj = {};

function SelectThisWord(event)
{
if (CrosswordFinished) return;
var i, TheirWord, TableCell;

// Deselect the previous word if one was selected.
document.getElementById("welcomemessage").style.display = "none";
if (selObj.CurrentWord >= 0)
OKClick();


// Determine the coordinates of the cell they clicked, and then the word that
// they clicked.
var target = (event.srcElement ? event.srcElement: event.target);
console.info(target);
selObj.x = parseInt(target.id.substring(1, 4), 10);
selObj.y = parseInt(target.id.substring(4, 7), 10);
DeselectCurrentWord();

var wordObj = posInMapEx(selObj.x+','+selObj.y);
selObj.index = wordObj.index;
selObj.CurrentWord = getWordIndex(wordObj.word);

// Now, change the style of the cells in this word.
ChangeCurrentWordSelectedStyle(true);
// Then, prepare the answer box.


TheirWord = "";
var TheirWordLength = 0;
for (i = 0; i < WordLength[selObj.CurrentWord]; i++)
{
// Find the appropriate table cell.
if (selObj.CurrentWord <= LastHorizontalWord)
TableCell = CellAt(selObj.x, selObj.y-selObj.index + i);
else
TableCell = CellAt(selObj.x-selObj.index+ i, selObj.y);
// Add its contents to the word we're building.
if (TableCell.innerHTML != null && TableCell.innerHTML.length > 0 && TableCell.innerHTML != " " && TableCell.innerHTML.toLowerCase() != "&nbsp;")
{
TheirWord += TableCell.innerHTML.toUpperCase();
TheirWordLength++;
}
else
{
TheirWord += "&bull;";
}
}

document.getElementById("wordlabel").innerHTML = TheirWord;
document.getElementById("wordinfo").innerHTML = ((selObj.CurrentWord <= LastHorizontalWord) ? "横向, " : "纵向, ") + WordLength[selObj.CurrentWord] + " 个字.";
document.getElementById("wordclue").innerHTML = map.get(wordObj.word).description;
document.getElementById("worderror").style.display = "none";
document.getElementById("cheatbutton").style.display = (Word.length == 0) ? "none" : "";
if (TheirWordLength == WordLength[selObj.CurrentWord])
document.getElementById("wordentry").value = TheirWord;
else
document.getElementById("wordentry").value = "";

// Finally, show the answer box.
document.getElementById("answerbox").style.display = "block";
try
{
document.getElementById("wordentry").focus();
document.getElementById("wordentry").select();
}
catch (e)
{
}

}

// Called when the user clicks the OK link.
function OKClick()
{
var TheirWord, i, TableCell;
if (CrosswordFinished) return;
if (document.getElementById("okbutton").disabled) return;

// First, validate the entry.
TheirWord = document.getElementById("wordentry").value.toUpperCase();
if (TheirWord.length == 0)
{
DeselectCurrentWord();
return;
}

if (TheirWord.length < WordLength[selObj.CurrentWord])
{
document.getElementById("worderror").innerHTML = "您输入的字太少了,这个词应该有 " + WordLength[selObj.CurrentWord] + " 个字。";
document.getElementById("worderror").style.display = "block";
return;
}
if (TheirWord.length > WordLength[selObj.CurrentWord])
{
document.getElementById("worderror").innerHTML = "您输入的字太多了,这个词只有 " + WordLength[selObj.CurrentWord] + " 个字。";
document.getElementById("worderror").style.display = "block";
return;
}


for (i = 0; i < TheirWord.length; i++)
{
TableCell = CellAt(selObj.x + (selObj.CurrentWord <= LastHorizontalWord ?0 : i-selObj.index), selObj.y + (selObj.CurrentWord > LastHorizontalWord ? 0 : i-selObj.index));
TableCell.innerHTML = TheirWord.substring(i, i + 1);
}
DeselectCurrentWord();
}

// Called when the "check puzzle" link is clicked.
function CheckClick()
{
if (CrosswordFinished) return;
var CrosswordFinished=true;
for (var x = 0; x < CrosswordWidth; x++)
{

for (var y = 0; y< CrosswordHeight; y++)
{
var pos = x+","+y;

var TableCell = CellAt(x,y);
if(TableCell!=null)
{
var obj = posInMapEx(pos);
if(TableCell.innerHTML!=obj.char){
CrosswordFinished = false;
break;
}


}
}

}


if(CrosswordFinished==false)
{
document.getElementById("welcomemessage").innerHTML = "error";
document.getElementById("welcomemessage").style.display = "block";
return;
}
// They finished the puzzle!

document.getElementById("checkbutton").style.display = "none";
document.getElementById("congratulations").style.display = "block";
document.getElementById("welcomemessage").style.display = "none";
}

// Called when the "cheat" link is clicked.
function CheatClick()
{
if (CrosswordFinished) return;
var OldWord = selObj.CurrentWord;
document.getElementById("wordentry").value = Word[selObj.CurrentWord];
OKClick();
ChangeWordStyle(OldWord, "ecw-box ecw-boxcheated_unsel");
}



//-->
</script>

</table></td>

<td valign="top" style="padding-left: 1em;">
<form action="http://www.google.com/cse" id="cse-search-box" target="_blank">
<div>
<input type="hidden" name="cx" value="partner-pub-3335021892863532:fdww32yut17" />
<input type="hidden" name="ie" value="GB2312" />
<input type="text" name="q" size="40" />
<input type="submit" name="sa" value="&#x641c;&#x7d22;" />
</div>
</form>


<div id="welcomemessage" class="ecw-answerbox" style="display:none;">
<span>为确保最佳显示效果,请保持本页面最大化。</span><br>
<p style="color: #ff0000;padding: 12px 0px 2px 0px; margin: 0px; border-bottom: 1px solid #ccc;"><b>说明:</b></p>
<span><ol><li>点击一个白色格子开始填字。</li>
<li>根据提示,将答案填写在文本框中,然后按<b>回车键</b>或者点击<b>确定</b>按钮。</li>
<li>重复以上两步,完成填字游戏。</li>
<li>点击<b>答案</b>按钮可查看当前词条的答案。</li>
</ol><br></span>

</div>

<div id="answerbox" class="ecw-answerbox" style="display:none;">
<h3 id="wordlabel" class="ecw-wordlabel"> &nbsp;</h3>
<div id="wordinfo" class="ecw-wordinfo"> </div>
<div id="wordclue" class="ecw-cluebox"> </div>
<div style="margin-top: 1em;">
<input class="ecw-input" id="wordentry" type="text" size="24" style="font-weight: bold; text-transform:uppercase;" οnkeypress="WordEntryKeyPress(event)" οnchange="WordEntryKeyPress(event)" autocomplete="off" />
</div>
<div id="worderror" class="ecw-worderror"></div>

<table border="0" cellspacing="0" cellpadding="0" width="100%" style="margin-top:1em;"><tbody><tr><td>
<button id="cheatbutton" type="button" class="ecw-input ecw-button" οnclick="CheatClick();">答案</button>
<button id="checkbutton" type="button" class="ecw-input ecw-button" οnclick="CheckClick();">check</button>
</td><td align="right">
<button id="okbutton" type="button" class="ecw-input ecw-button" οnclick="OKClick();" style="font-weight: bold;">确定</button> &nbsp;
<button id="cancelbutton" type="button" class="ecw-input ecw-button" οnclick="DeselectselObj.CurrentWord();">取消</button>
</td></tr></tbody></table>

</div>

<div id="congratulations" class="ecw-answerbox" style="display:none;">
<h3>恭喜你!答对了!</h3>
<p>更多填字游戏,请访问<a href="http://www.tzgame.net" style="color: black; text-decoration:none;">天天填字网。</a></p>
</div>

</td></tr></table>
<div><p><b>版权所有,严禁转载!更多在线填字请访问<a href="http://www.tzgame.net/" target="_blank">天天填字网</a>!</b></p></div>

<script language="JavaScript" type="text/javascript"><!--
BeginCrossword();
//-->
</script>

<br>


</body></html>

 

转载于:https://www.cnblogs.com/xchsp/p/7625408.html

这篇关于纵横填字map版(初始数据结构)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/701614

相关文章

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

Python 内置的一些数据结构

文章目录 1. 列表 (List)2. 元组 (Tuple)3. 字典 (Dictionary)4. 集合 (Set)5. 字符串 (String) Python 提供了几种内置的数据结构来存储和操作数据,每种都有其独特的特点和用途。下面是一些常用的数据结构及其简要说明: 1. 列表 (List) 列表是一种可变的有序集合,可以存放任意类型的数据。列表中的元素可以通过索

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

【数据结构入门】排序算法之交换排序与归并排序

前言         在前一篇博客,我们学习了排序算法中的插入排序和选择排序,接下来我们将继续探索交换排序与归并排序,这两个排序都是重头戏,让我们接着往下看。  一、交换排序 1.1 冒泡排序 冒泡排序是一种简单的排序算法。 1.1.1 基本思想 它的基本思想是通过相邻元素的比较和交换,让较大的元素逐渐向右移动,从而将最大的元素移动到最右边。 动画演示: 1.1.2 具体步

数据结构:线性表的顺序存储

文章目录 🍊自我介绍🍊线性表的顺序存储介绍概述例子 🍊顺序表的存储类型设计设计思路类型设计 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾” 和“内容共创官” ,现在我来为大家介绍一下有关物联网-嵌入