页游开发中的 Python 组件与模式

勇浩 赖
勇浩 赖Game Developer at Yinhan Co., Ltd.
页游开发中的 Python 组件与模式
  赖勇浩( http://laiyonghao.com )
          2012-10-21
             上海
去年我来过……
回顾……
• 幻灯:
  http://www.slideshare.net/laiyonghao/py
  thon-webgame-10452102
• 录像(上海 45 分钟版):
  http://e.gensee.com/v_3df867_14
• 录像(广州 91 分钟版):
  http://v.youku.com/v_playlist/f16785412
  o1p4.html

         偏向于“最佳实践”的经验分享
今天不一样……
直奔主题!
class Player(object):
  def signin(self, usr, pwd):
     ...
     self._signin = True
  def do_sth(self):
     if not self._signin:
          self.client.need_signin()
          return
     ...
有什么问题?
def   do_sth_1(...
def   do_sth_2(...
def   do_sth_3(...
def   do_sth_4(...
…
一般这样解决掉……
@ensure_signin
def do_sth(self, *a, **kw):
    …

           Decorator !!!
还有什么问题?
def   do_sth_1(...   if not
def   do_sth_2(...     self._signin: ...
def   do_sth_3(...   if not
                       self._in_battle: ...
def   do_sth_4(...
…                    if not
                       self._is_dead: ...
                     ...
还是这样解决掉?
@ensure_signin
@ensure_in_battle
@ensuer_is_alive
def do_sth(self, *a, **kw):
    …

               ???
好像哪里不对……
• 戴太多“帽子”不好看
• method 的数量没有减少。




       需要一点新思路!
python-state
@stateful                 class Signin(State):
class Player(object):        @behavior
  class                      def move(self,
  NeedSignin(State):      dst): ...
     default = True          @behavior
     @behavior               def atk(self,
     def signin(self,     other): ...
  usr, pwd):                 @behavior
           ...               def …
           switch(self,
  Player.Signin)
python-state
@stateful                 class Signin(State):
class Player(object):        @behavior
  class                      def move(self,
  NeedSignin(State):      dst): ...
     default = True       @behavior
     @behavior               def atk(self,
                          other): ...
     def signin(self,
  usr, pwd):                 @behavior
           ...               def …
           switch(self,
  Player.Signin)
python-state
@stateful                 class Signin(State):
class Player(object):         @behavior
  class                       def move(self,
  NeedSignin(State):      dst): ...
     default = True           @behavior
     @behavior                def atk(self, x):
     def signin(self,     ...
  usr, pwd):                  @behavior
           ...                def …
           switch(self,
  Player.Signin)
python-state
@stateful                 class Signin(State):
class Player(object):        @behavior
  class                      def move(self,
  NeedSignin(State):      dst): ...
     default = True          @behavior
     @behavior               def atk(self,
     def signin(self,     other): ...
  usr, pwd):                 @behavior
           ...               def …
           switch(self,
  Player.Signin)
python-state
@stateful                 class Signin(State):
class Player(object):        @behavior
  class                      def move(self,
  NeedSignin(State):      dst): ...
     default = True          @behavior
     @behavior               def atk(self,
     def signin(self,     other): ...
  usr, pwd):                 @behavior
           ...               def …
           switch(self,
  Player.Signin)
适用场景
• 根据状态授权特定的 RPC API 访问权限
 – 例如未登陆不能调用攻击
• 编写网络协议、文本的 parser
• FSM-based Game AI ?
 – No ! 没有比协程更适合做这件事的机制了。
小结一下……
• 跟 decorator 一样去掉了 if 语句
 – 但是摘掉了许多帽子
 – 而且真正地没有写 if 语句噢!
小结一下……
• 跟 decorator 一样去掉了 if 语句
 – 但是摘掉了许多帽子
 – 而且真正地没有写 if 语句噢!


• 把很多 method 分到多个 State 类中
 – 重用
 – 划分功能
更大的好处是——
• 更容易修正错误……
 – 因为出错信息是 AttributeError !
更容易修正错误……
• 因为出错信息是 AttributeError !




           http://www.slideshare.net/wilhelmshen/py-art
           2010-5-30 shanghai
更容易修正错误……
• 因为出错信息是 AttributeError !
好,继续!

什么引起状态的切换(属性变化)?
有事情发生!

怎么知道有事情发生?
上网、读报、看电视、听收音机……




      大海捞针
好莱坞原则

Don’t call me, I’ll call you.
一个简单的状态切换场景
建个模吧!
建个模吧!
class Lamp(object):
  is_on = False
class
  Swith(object):
  def turn(self):
     ...
建个模吧!
class Lamp(object):     class Line(object):
  is_on = False           ...
class Swith(object):    line = Line()
  def turn(self):       lamp = Lamp(line)
                        swith = Swith(line)
 self.line.lamp.is_on   line.connect(lamp,
 = True                   swith)
                        swith.turn()
                        assert lamp.is_on
好像感觉哪里不对……
• 现实世界中需要真实的 Line ,编程中也
  是吗?
• 如果一个 Switch 对应着很多 Lamp ?
• 循环引用?

   隐形的 Line ?可扩展的 Line ?
python-message
class Switch(object):
  Turn =
  'state.examples.Switch.Trun'
  def turn(self):
     message.pub(Switch.Turn, self)
python-message
@stateful                     class Lamp(object):
class Lamp(object):             def bind(self, s):
  class Off(State):                  self._switch = s
       default = True
       @behavior                message.sub(Switch.Turn,
       def _on_turn(self, s):   self.on_turn)
                                def on_turn(self, s):
              switch(self,
  Lamp.On)                           self._on_turn(s)
  class On(State):
       @behavior
       def _on_turn(self, s):
              switch(self,
  Lamp.Off)
python-message
s = Switch()   <__main__.Lamp object at
l = Lamp()       0x7f6b4dd2f590> begin Off state.
l.bind(s)
s.turn()       <__main__.Lamp object at
                 0x7f6b4dd2f590> end Off state.
s.turn()
               <__main__.Lamp object at
                 0x7f6b4dd2f590> begin On state.

               <__main__.Lamp object at
                 0x7f6b4dd2f590> end On state.
               <__main__.Lamp object at
                 0x7f6b4dd2f590> begin Off state.
解耦
应用场景
• 任务
  – 获得道具时……
  – 怪物死亡时……
• 世界状态
  – 玩家(好友)上下线……
• 网络编程
  – 数据可读……
• ……
更多功能
取消与中止
import message                import message
def hello(name):              def hello(name):
  print 'hello, %s.'%name       print 'hello %s' % name
  message.unsub('greet',        ctx = message.Context()
  hello)                        ctx.discontinued = True
message.sub('greet', hello)     return ctx
message.pub('greet', 'lai')   def hi(name):
message.pub('greet', 'u         print 'u cann't c me.'
  cann't c me.')             message.sub('greet', hello)
                              message.sub('greet', hi)
                              message.pub('greet', 'lai')
进阶
• 改变调用次序
 – 在调用 sub 的时候加上 front = True
 – sub('greet', hello, front = True)
• 订阅过去的消息
 – declare/retract
 – declare(topic, *a, **kw) 用来向“公告栏”发布一
   个消息
 – 把“公告栏”的消息撤消用 retract(topic) 函数
 – get_declarations()/has_declaration(topic)
退化——观察者模式
from message import observable
def greet(people):
        print 'hello, %s.'%people.name
@observable
class Foo(object):
        def __init__(self, name):
                 self.name = name
                 self.sub('greet', greet)
foo = Foo('lai')
foo.pub('greet', foo)
现在
 玩家有了状态
也能知晓世事变幻

那玩家们如何交互?
网络通信


          需要有个 rpc
基于 google protobuf 实现一套就不错
如果有 greenlet 实现同步编程就更好了
abu.rpc
class EchoService(echo.EchoService):
    @abu.rpc.ret
    def Echo(self, controller, request):
        resp = echo.Packet(text = request.text)
        return resp

service = EchoService()
handler = abu.rpc.Handler(abu.rpc.Transport, service)
server = gevent.server.StreamServer(('', 10086), handler)
app = abu.rpc.Application(server)
print 'serving...'
app.run()
abu.rpc
conn =
  gevent.socket.create_connection(('127.0.0.1',
  10086))
channel =
  abu.rpc.Channel(abu.rpc.Transport(conn))
server =
  abu.rpc.Proxy(echo.EchoService_Stub(channel))

req = echo.Packet(text = 'hello'*30)
resp = server.Echo(req)
assert resp.text == req.text
放心,不是 abu.rpc 教程!

 讲 abu.rpc 在真实应用场景中遇
     到的问题及解决方法。
这世界太复杂了……
抽象传输层
@message.observable
class Transport(object):
    TRANSPORT_DATA =
  'abu.rpc.transport.TRANSPORT_DATA‘
 def _recv_func(self):
        while True:
            self.buff =
  self._ll_transport.recv(4096)
            if not self.buff:
                break
            self.pub(self.TRANSPORT_DATA)
很多的传输层
class TgwServerMixin(object):
    def recv(self):
        data = Transport.recv(self)
        if self._handshaked:
            return data
        return self._do_handshake(data)
    def _do_handshake(self, data):
        …

class TgwClientMixin(object): …
很多协议,随意组合。
class TgwServerTransport(TgwServerMixin,
  Transport):
    …
class TgwClientTransport(TgwClientMixin,
  Transport):
    …

class SecTgwServerTransport(SecServerMixin,
  TgwServerTransport):
    …
class SecTgwClientTransport(SecClientMixin,
  TgwClientTransport):
    …
Mixin 威武!

 socketserver.ForkingMixIn
socketserver.ThreadingMixIn
好,大概就是这些了……

         state
  publish-subscribe
       observer
         mixin
使用这些组件……
• http://pypi.python.org/pypi/message
• http://pypi.python.org/pypi/state
• http://pypi.python.org/pypi/abu.rpc
够了吗?
为何不改变语法?
object Earth(Object):
  state default Day(State):
     behavior tick(self):
         if not Sun.visible:
             switch(self, self.Night)
  state Night(State):
     behavior tick(self):
         if Sun.visible:
             switch(self, self.Day)
如果你愿意……

明年我来讲这个。
谢谢大家!

http://laiyonghao.com
1 of 55

Recommended

论 Python 与设计模式。 by
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。勇浩 赖
1.9K views36 slides
Python 于 webgame 的应用 by
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用勇浩 赖
4.5K views57 slides
深入淺出 Web 容器 - Tomcat 原始碼分析 by
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
3.8K views52 slides
Wind.js无障碍调试与排错 by
Wind.js无障碍调试与排错Wind.js无障碍调试与排错
Wind.js无障碍调试与排错jeffz
2K views43 slides
Python速成指南 by
Python速成指南Python速成指南
Python速成指南March Liu
8.7K views95 slides
合久必分,分久必合 by
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
5.2K views55 slides

More Related Content

What's hot

OpenEJB - 另一個選擇 by
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇Justin Lin
1.8K views49 slides
Jscex:案例、经验、阻碍、展望 by
Jscex:案例、经验、阻碍、展望Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望jeffz
1.9K views70 slides
Jscex:案例、阻碍、体会、展望 by
Jscex:案例、阻碍、体会、展望Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望jeffz
2.2K views73 slides
Node way by
Node wayNode way
Node wayEthan Zhang
4.5K views42 slides
180518 ntut js and node by
180518 ntut js and node180518 ntut js and node
180518 ntut js and nodePeter Yi
122 views58 slides
iPhone,ios,Object-C基础入门 by
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门Lucien Li
863 views31 slides

What's hot(19)

OpenEJB - 另一個選擇 by Justin Lin
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
Justin Lin1.8K views
Jscex:案例、经验、阻碍、展望 by jeffz
Jscex:案例、经验、阻碍、展望Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望
jeffz1.9K views
Jscex:案例、阻碍、体会、展望 by jeffz
Jscex:案例、阻碍、体会、展望Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望
jeffz2.2K views
180518 ntut js and node by Peter Yi
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
Peter Yi122 views
iPhone,ios,Object-C基础入门 by Lucien Li
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
Lucien Li863 views
ios分享 by Lucien Li
ios分享ios分享
ios分享
Lucien Li718 views
基于原型的JavaScript面向对象编程 by zhangdaiping
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
zhangdaiping2.4K views
C++11综述/新特性描述/Overview of C++11 New Features by Peien Luo
C++11综述/新特性描述/Overview of C++11 New FeaturesC++11综述/新特性描述/Overview of C++11 New Features
C++11综述/新特性描述/Overview of C++11 New Features
Peien Luo97 views
jQuery源码学习 by fangdeng
jQuery源码学习jQuery源码学习
jQuery源码学习
fangdeng436 views
Ooredis by iammutex
OoredisOoredis
Ooredis
iammutex979 views
Advanced heap exploitaion by Angel Boy
Advanced heap exploitaionAdvanced heap exploitaion
Advanced heap exploitaion
Angel Boy27.1K views
Node.js开发体验 by QLeelulu
Node.js开发体验Node.js开发体验
Node.js开发体验
QLeelulu1.9K views
用Cython封装c++代码为python模块的一点经验 by Leo Zhou
用Cython封装c++代码为python模块的一点经验用Cython封装c++代码为python模块的一点经验
用Cython封装c++代码为python模块的一点经验
Leo Zhou506 views
Python learn guide by robin yang
Python learn guidePython learn guide
Python learn guide
robin yang465 views
Python 入门 by kuco945
Python 入门Python 入门
Python 入门
kuco945855 views
JAVA内存泄漏及诊断 by ivannotes
JAVA内存泄漏及诊断JAVA内存泄漏及诊断
JAVA内存泄漏及诊断
ivannotes1.6K views
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹 by Johnny Sung
炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
Johnny Sung988 views

Similar to 页游开发中的 Python 组件与模式

Scala by
ScalaScala
Scalapopeast
999 views74 slides
Programming python - part 1 by
Programming python - part 1Programming python - part 1
Programming python - part 1Che-Cheng Hsu
537 views174 slides
Python入門:5大概念初心者必備 2021/11/18 by
Python入門:5大概念初心者必備 2021/11/18Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18Derek Lee
227 views72 slides
lambda/closure – JavaScript、Python、Scala 到 Java SE 7 by
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7Justin Lin
2K views52 slides
《Python 3.5 技術手冊》第六章草稿 by
《Python 3.5 技術手冊》第六章草稿《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿Justin Lin
3.2K views37 slides
functional-scala by
functional-scalafunctional-scala
functional-scalawang hongjiang
1.7K views68 slides

Similar to 页游开发中的 Python 组件与模式(20)

Scala by popeast
ScalaScala
Scala
popeast999 views
Programming python - part 1 by Che-Cheng Hsu
Programming python - part 1Programming python - part 1
Programming python - part 1
Che-Cheng Hsu537 views
Python入門:5大概念初心者必備 2021/11/18 by Derek Lee
Python入門:5大概念初心者必備 2021/11/18Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18
Derek Lee227 views
lambda/closure – JavaScript、Python、Scala 到 Java SE 7 by Justin Lin
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
Justin Lin2K views
《Python 3.5 技術手冊》第六章草稿 by Justin Lin
《Python 3.5 技術手冊》第六章草稿《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿
Justin Lin3.2K views
Ecma script edition5-小试 by lydiafly
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
lydiafly780 views
Javascript share by Xu Mac
Javascript shareJavascript share
Javascript share
Xu Mac84 views
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫 by Justin Lin
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
Justin Lin11K views
Android resource-management by Lucas Xu
Android resource-managementAndroid resource-management
Android resource-management
Lucas Xu977 views
Java Script 引擎技术 by bigqiang zou
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
bigqiang zou2.5K views
02.python基础 by modou li
02.python基础02.python基础
02.python基础
modou li370 views
基于XMPP的Gtalk机器人 by roamin9 Zhou
基于XMPP的Gtalk机器人基于XMPP的Gtalk机器人
基于XMPP的Gtalk机器人
roamin9 Zhou3.5K views
CKAN : 資料開放平台技術介紹 (CAKN : Technical Introduction to Open Data Portal) by Jian-Kai Wang
CKAN : 資料開放平台技術介紹 (CAKN : Technical Introduction to Open Data Portal)CKAN : 資料開放平台技術介紹 (CAKN : Technical Introduction to Open Data Portal)
CKAN : 資料開放平台技術介紹 (CAKN : Technical Introduction to Open Data Portal)
Jian-Kai Wang636 views
Learning python in the motion picture industry by will zhou by Will Zhou
Learning python in the motion picture industry   by will zhouLearning python in the motion picture industry   by will zhou
Learning python in the motion picture industry by will zhou
Will Zhou908 views
JavaScript 脚本控件(二) by RANK LIU
JavaScript 脚本控件(二)JavaScript 脚本控件(二)
JavaScript 脚本控件(二)
RANK LIU1.3K views
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二) by 永立 連
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
永立 連2.3K views

More from 勇浩 赖

一种多屏时代的通用 web 应用架构 by
一种多屏时代的通用 web 应用架构一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构勇浩 赖
3.7K views35 slides
Tp web by
Tp webTp web
Tp web勇浩 赖
1.1K views35 slides
2012,我的技术之选 by
2012,我的技术之选2012,我的技术之选
2012,我的技术之选勇浩 赖
2.2K views26 slides
Scala by
ScalaScala
Scala勇浩 赖
1.5K views74 slides
珠三角技术沙龙广州场 by
珠三角技术沙龙广州场珠三角技术沙龙广州场
珠三角技术沙龙广州场勇浩 赖
1.3K views12 slides
为什么 rust-lang 吸引我? by
为什么 rust-lang 吸引我?为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?勇浩 赖
2.7K views32 slides

More from 勇浩 赖(20)

一种多屏时代的通用 web 应用架构 by 勇浩 赖
一种多屏时代的通用 web 应用架构一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构
勇浩 赖3.7K views
2012,我的技术之选 by 勇浩 赖
2012,我的技术之选2012,我的技术之选
2012,我的技术之选
勇浩 赖2.2K views
珠三角技术沙龙广州场 by 勇浩 赖
珠三角技术沙龙广州场珠三角技术沙龙广州场
珠三角技术沙龙广州场
勇浩 赖1.3K views
为什么 rust-lang 吸引我? by 勇浩 赖
为什么 rust-lang 吸引我?为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?
勇浩 赖2.7K views
Behavior+tree+ai lite by 勇浩 赖
Behavior+tree+ai liteBehavior+tree+ai lite
Behavior+tree+ai lite
勇浩 赖2.1K views
敏捷网游架构与性能的新玩法 by 勇浩 赖
敏捷网游架构与性能的新玩法敏捷网游架构与性能的新玩法
敏捷网游架构与性能的新玩法
勇浩 赖1.1K views
先用再学 - 借助 Xna 快速开发游戏原型 by 勇浩 赖
先用再学  - 借助 Xna 快速开发游戏原型先用再学  - 借助 Xna 快速开发游戏原型
先用再学 - 借助 Xna 快速开发游戏原型
勇浩 赖904 views
关于Bitworld的一些话题222 by 勇浩 赖
关于Bitworld的一些话题222关于Bitworld的一些话题222
关于Bitworld的一些话题222
勇浩 赖1.3K views
03 -黄朝兴--腾讯游戏 by 勇浩 赖
03 -黄朝兴--腾讯游戏03 -黄朝兴--腾讯游戏
03 -黄朝兴--腾讯游戏
勇浩 赖881 views
abu.rpc intro by 勇浩 赖
abu.rpc introabu.rpc intro
abu.rpc intro
勇浩 赖1.6K views
06 -甄焱琨--知识转化为资源 by 勇浩 赖
06 -甄焱琨--知识转化为资源06 -甄焱琨--知识转化为资源
06 -甄焱琨--知识转化为资源
勇浩 赖409 views
07 -林伟铃--成长中的36氪 by 勇浩 赖
07 -林伟铃--成长中的36氪07 -林伟铃--成长中的36氪
07 -林伟铃--成长中的36氪
勇浩 赖753 views
01 -阿朱--简单事情夯实做 by 勇浩 赖
01 -阿朱--简单事情夯实做01 -阿朱--简单事情夯实做
01 -阿朱--简单事情夯实做
勇浩 赖479 views
Python 温故 by 勇浩 赖
Python 温故Python 温故
Python 温故
勇浩 赖1.6K views
如何做好沙龙演讲 by 勇浩 赖
如何做好沙龙演讲如何做好沙龙演讲
如何做好沙龙演讲
勇浩 赖1.2K views
虚拟世界是怎么炼成的(图片版) by 勇浩 赖
虚拟世界是怎么炼成的(图片版)虚拟世界是怎么炼成的(图片版)
虚拟世界是怎么炼成的(图片版)
勇浩 赖473 views
Techparty story by 勇浩 赖
Techparty storyTechparty story
Techparty story
勇浩 赖545 views

Recently uploaded

[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式 by
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式Shengyou Fan
150 views54 slides
AI Technology & Development of Civilization by
AI Technology & Development of CivilizationAI Technology & Development of Civilization
AI Technology & Development of Civilizationunclebrown017
41 views74 slides
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班 by
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班IttrainingIttraining
43 views32 slides
Hacking Facebook for fun and profit by Pranav Hivarekar by
Hacking Facebook for fun and profit by Pranav HivarekarHacking Facebook for fun and profit by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav HivarekarPranav Hivarekar
6 views69 slides
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班 by
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班IttrainingIttraining
43 views25 slides
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班 by
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班IttrainingIttraining
40 views37 slides

Recently uploaded(6)

[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式 by Shengyou Fan
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
Shengyou Fan150 views
AI Technology & Development of Civilization by unclebrown017
AI Technology & Development of CivilizationAI Technology & Development of Civilization
AI Technology & Development of Civilization
unclebrown01741 views
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
Hacking Facebook for fun and profit by Pranav Hivarekar by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav HivarekarHacking Facebook for fun and profit by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav Hivarekar
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班

页游开发中的 Python 组件与模式