CatCoding

A Basket-Ball Demo

2011-10-20

最近闲暇时间用 C++ 写了个小 Demo,一个小小的篮球模拟。在学校的时候看过《人工智能编程精粹》,里面有个足球模拟,看起来还比较逼真。我这个篮球模拟是比较类似的,主要好玩的地方是在于状态机。图形方面做得很简单,还是用 OpenGL 来实现的,另外用了一个库 glui,这个东西很好,把 GUI 方面琐碎的事情就简化了。整个效果图如下,这可是湖人对火箭噢。

调试状态机是个很有趣的过程,每一个球队有自己的状态机,分为进攻状态、防守状态、准备发球状态,每个球员也有自己的状态机,如下图所示。这里使用的是状态模式,把复杂的转移逻辑分散到各个状态节点,这正是状态模式的精华啊。现在这个还只是个粗糙的版本,虽然看得出来有那么点意思,规则都出来了,但是每个球员的跑位不逼真,没有多少智能的感觉。当篮球碰到边界的时候自动反弹,这点有点假,不过这也简化了不少比较繁琐的捡球和发球动作。当然现在的规则都比较简单,连三分和两分都没有分出来,罚球也没有,哈哈。现在的状态机看起来大部分时间还可以,很少的时候会出现一些比较反常规的现象。把每个状态转移过程在画面中显示出来能比较直观的去调试。

下面这个是球员的状态转移图,也就是 FieldPlayerStates.cpp 实现的。球队的状态机要简单一些,只有三个。

程序在这里GitHub:BasketBall,感兴趣的可以看一下,也有 7000 行的代码了,也有点乱:). 后面有时间再调试一下,慢慢细化,球员的站位和防守动作做到更智能些。

公号同步更新,欢迎关注👻