Flutter+golang实现的简单的你画我猜小游戏

Python016

Flutter+golang实现的简单的你画我猜小游戏,第1张

如项目展示,一个简单的画图界面 客户端使用flutter完成,目前仅做了Android客户端,flutterWeb实在是问题太多,随便加个依赖就各种报错,展示先不做吧,毕竟心很痛。

服务器是使用golang搭建,一个很简单的WebSocket后台 地址在这里

宝宝语言发展,牵涉多感官的学习,是脑部极为复杂的机制,需要从婴儿时期开始就必须打好基础。 爸妈若能把握在0〜3岁的黄金关键期,从生活中提供丰富的声音语言 *** ,善用游戏中的多感官学习 ,自然能引导宝宝听得懂更说得好。

我们如何陪伴牙牙学语的0〜3岁宝宝,练习聆听与表达呢?亲爱的爸妈,我们从「语言」来启动学习力吧!

《9个月〜1岁打地基》宝宝发展打好基础期

即使宝宝还不会正式的语言,却透过听和理解一步步累积大脑中的语汇量,是往后语言发展打基础的重要时期。

这年龄的宝宝听到自己的名字会有反应,开始跟着大人咿咿ㄚㄚ牙牙学语。一岁时你可能会听到宝宝第一次叫爸妈或家人,也听懂熟悉的日常生活名词(如奶奶、布布、掰掰、点头要..等),宝宝会和人有眼神、肢体或声音互动。

推荐阅读:我的宝宝是迟语儿吗?(附语言发展图、评估表)

陪1岁宝贝玩语言游戏〜GO!

小脸、身体在哪里?初级玩法:

宝宝特别喜欢爱注视爸妈的脸部表情,请大人与宝宝面对面坐着,大人用食指转转圈引导孩子视觉,一边说「鼻子鼻子在哪里?」,说完立即压压宝宝的小鼻子「哇!鼻子鼻子在这里!」,再依序练习其他脸部五官。

透过游戏中爸妈「碰触的部位」与「口语」结合互动,借此让孩子认识脸部五官的位置,同时练习命名身体部位的语言能力。

进阶聪明玩法:

当大人的食指转圈一边说「鼻子鼻子在哪里?」时,这次要请宝宝找出「自己」的脸部五官来,再找出妈妈的五官部位来触摸压拍,大人同时搭配语言说「宝宝的鼻子在这里啊!妈妈的鼻子在这里!」

除了脸部五官,进一步请宝宝认识更多的身体部位,如「手在哪里?」、「 *** 在哪里?」,借由触摸、压拍每个部位,把语言结合动作学习方式,语言将会变得丰富又好玩喔!

《1〜2岁探险趣》陪宝宝探索好奇时期

孩童除了动作的探索,这年龄喜欢是声音语言上尝试模仿的探索时期。 孩童能听懂爸妈说的简单生活指令与指出物品,如去拿宝宝的水水(车车、鞋鞋)或坐下吃饭、出去玩..等,更尝试仿说生活常听词汇,如爸妈、阿嬷、喵喵、汪汪、手脚..不要、掰掰等。

陪2岁宝贝玩语言游戏〜GO!

超级变变变!初级玩法:

此阶段是重要的语言探索期,不用急着要求孩子直接说出口语,可以从模仿常听到的声音开始,只要让孩子「喜欢且主动发出声音」。

大人先示范各种物品的声音,如「小狗〜汪汪汪!」、「小猫〜喵喵喵」、「小孩〜哇哇哇」、「车车〜轰轰轰」,引导孩子去模仿各种声音,透过「玩声音」的方式来练习口腔动作与语音模仿,对于孩童口语有直接帮助。

进阶聪明玩法:

将不同主题的图卡、玩偶或玩具放进篮子中,接着展开演技大战了。

大人可以像唱歌谣方式唱「变变变!我要变成一只…」,让孩童抽出篮子中的主题,引导孩子看图说出「名称」、发出各种「声音」、还有「动作模仿」,如「小狗狗〜汪〜汪〜汪」、「小猫咪〜喵〜喵〜」、「大老虎〜吼〜吼〜吼!」、「打电话〜喂〜喂〜喂」等,从动作中来学语言,让命名变成扮演游戏。

《2〜3岁发展趣》全方位发展潜能发挥期

孩童正式进入语言爆发期,口语会多于肢体表达,语汇量迅速增加。孩童能说出自己名字、会组合2〜3个词汇的句子,如爸爸车车、妈妈我要喝牛奶,慢慢的能说8〜10个字的长句子、也爱哼唱简单熟悉的儿歌。孩童能听懂生活中复杂的句子,也能理解故事哦,这年龄的孩童特别享受爸妈说故事的亲子阅读时光。

陪3岁宝贝玩语言游戏〜GO!

绘本探索家 初级玩法:

透过亲子阅读的过程,能非常有效地提升孩童的语汇能力,请爸妈多善用睡前时光阅读,带着宝宝认识世界。

选择贴近孩童生活或有兴趣的绘本,如宝宝洗澡睡觉、动物等主题。刚开始大人可以一边指图一边口语解说,增加孩童视听结合的理解与仿说。

推荐阅读:孩子语言迟缓?帮助发展四阶段

但是爸妈不能只是念书,要善用「提问」来增加孩童口语互动,如一边指图一边问「咦〜这是什么?」来玩命名小游戏,鼓励孩子「主动想出名称」!

进阶聪明玩法:

当孩子能「命名」物品后,要进一步强化「句子」理解与表达。我们可以问「熊在做什么?」、「他为什么在哭呢?」等问题,让孩童去思考并表达出「短句」或了解「简单因果概念」,如「熊在吃饭〜」「妈妈不见了哭!」,让孩童更进一步的提升语言表达与理解力!

在 Golang 游戏leaf系列(一) 概述与示例 (下文简称系列一)中,提到过Go模块用于创建能够被 Leaf 管理的 goroutine。Go模块是对golang中go提供一些额外功能。Go提供回调功能,LinearContext提供顺序调用功能。善用 goroutine 能够充分利用多核资源,Leaf 提供的 Go 机制解决了原生 goroutine 存在的一些问题:

我们来看一个例子(可以在 LeafServer 的模块的 OnInit 方法中测试):

这里的 Go 方法接收 2 个函数作为参数,第一个函数会被放置在一个新创建的 goroutine 中执行,在其执行完成之后,第二个函数会在当前 goroutine 中被执行。由此,我们可以看到变量 res 同一时刻总是只被一个 goroutine 访问,这就避免了同步机制的使用。Go 的设计使得 CPU 得到充分利用,避免操作阻塞当前 goroutine,同时又无需为共享资源同步而忧心。

这里主动调用了 d.Cb(<-d.ChanCb) ,把这个回调取出来了。实际上,在skeleton.Run里会自己取这个通道

看一下源码:

New方法,会生成指定缓冲长度的ChanCb。然后调用Go方法就是先执行第一个func,然后把第二个放到Cb里。现在手动造一个例子:

这里解释一下,d.Go根据源码来看,实际也是调用了一个协程。然后上面两次d.Go并不能保证先后顺序。目前的输出结果是1+2那个先执行了,把3写入d.ChanCb,然后把3读出来,继续读时,d.ChanCb里没有东西,阻塞了。然后1+1那个协程启动了,最后又读到了2。

现在把time.Sleep(time.Second)的注释解开,会是啥结果呢

这里执行到time.Sleep睡着了,上面两个d.Go仍然是不确定顺序的,但是会各自的function先执行掉,然后陆续把cb写入d.ChanCb。看这次输出,1+2先写进去的。所以最后执行d.Cb时,就把3先读出来了。然后d.ChanCb的长度为1,说明还有一个,就是输出2了。

另外,就是close时会判断g.pendingGo

这个例子的意思很明显,NewLinearContext这种方式,即使先调用的慢了半秒,它还是会先执行完。

这里先是用了一个list,加入的时候用mutexLinearGo锁了,都加到最后。然后新开协程去处理,读的时候从最前面开始读,也要用mutexLinearGo锁。执行的时候,也要上锁mutexExecution,确保f()执行完并且写入g.ChanCb回调,这个mutexExecution锁才会解除。现在可以改造一个带回调的例子:

结果说明,确实是2先被写入了d.ChanCb。