65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (42投票s)

2007年10月3日

2分钟阅读

viewsIcon

80602

downloadIcon

914

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

Screenshot - balls.jpg

引言

这个程序会在你的桌面上创建三个球。如果你把光标移向它们,它们会四处移动并跳向你的光标,试图抓住它。如果它们成功了,它们会拖着你的光标,你必须通过等待或用鼠标点击来摆脱它们。

背景

一开始我想创建某种机器人,它可以自我复制,它的子代也会再次这样做,一遍又一遍……但由于它没有像预期的那样工作,所以我用目前拥有的代码创建了这个 - 只是想让你知道为什么项目名称是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时运动都会发生一点变化。

© . All rights reserved.