桌面上的烦人的,讨厌的球






4.84/5 (42投票s)
2007年10月3日
2分钟阅读

80602

914
一些在桌面上弹跳并试图抓住光标的、烦人的、讨厌的球 - GDI+、透明窗体和一些人工智能的混合体

引言
这个程序会在你的桌面上创建三个球。如果你把光标移向它们,它们会四处移动并跳向你的光标,试图抓住它。如果它们成功了,它们会拖着你的光标,你必须通过等待或用鼠标点击来摆脱它们。
背景
一开始我想创建某种机器人,它可以自我复制,它的子代也会再次这样做,一遍又一遍……但由于它没有像预期的那样工作,所以我用目前拥有的代码创建了这个 - 只是想让你知道为什么项目名称是Replicator
。
使用程序
只需执行程序,看看这些球在弹跳。尽量避开它们。为了在它们抓住你之后摆脱它们,只需左键单击几次。如果你想关闭程序,右键单击其中一个(例如,当其中一个抓住你时)。机器人的当前状态由中间的填充圆圈表示。红色是攻击
,蓝色是跟随
,灰色是待机
,黑色代表非活动
。
Using the Code
图形表示,正如我在其他文章中进一步描述的那样,是通过一个透明的窗体完成的。每个机器人都有自己的对话框。
但更有趣的部分是运动/人工智能
public void Loop()
{
while (!Disposing)
{
Think();
Act();
Thread.Sleep(33);
}
}
窗体显示后,会创建一个线程来处理动作部分。只要机器人存在,线程就会调用两个方法。第一个是Think()
部分。它“分析”当前情况,并决定做什么,走到哪里,跳到哪里。第二个是Act()
部分,它实际处理物理(重力、弹跳、运动)。
public enum eBrain
{
Idle,
Following,
Attacking,
CursorCatched,
Wait
}
Think()
部分使用大脑状态eBrain
来描述当前情况。在这种情况下,Idle
被用作决定性部分。它根据到目标的距离决定下一个大脑状态是什么,并且在当前大脑状态的当前条件不再有效时设置它。
大脑采取的动作由函数Walk(int x),
Jump(int y)
和 Stand()
表示。 它们只是稍微改变了当前速度,并且依赖于每次tick时被调用,以便在经过一些tick后,完成预期的运动。
Act()
部分然后移动球,并对其应用重力、摩擦和其他物理属性。
简而言之
人工智能是通过包含人工智能和物理的线程来完成的,该线程每次都会调用Think()
部分,这反过来导致每次tick时运动都会发生一点变化。