当前位置:   article > 正文

【Windows编程】球球大作战(三) 简单AI编写_ts中怎么写球球大作战移动

ts中怎么写球球大作战移动

本章我们要实现的是一个简单AI的编写,不过我更想称之为智障ai,因为以实现为主,所以没有使用任何数据结构,总之就是很弱。
简单AI编写
1.进行思考,判断离自己最近的食物
2.停止思考,向食物移动


首先是思考部分,很简单,将食物坐标与自己的坐标进行计算后判断出绝对距离最近的那个食物坐标。

// 思考为真,Coordinate坐标类,拥有一个圆的X坐标,y坐标以及中心坐标
if (isThinking == true)
{
aimCoordinate=JudgeDistance(GetCoordinate(),FoodVector);
isThinking = false;
}

// 就算距离的函数 
CaculateDistance(CCoordinate my, CCoordinate other)
{
    int result;
    // a^2+b^2=c^2;
result = (my.GetCentreX() - other.GetCentreX()) * (my.GetCentreX() - other.GetCentreX()) +       (my.GetCentreY() - other.GetCentreY()) * (my.GetCentreY() - other.GetCentreY());
    return result;
}

JudgeDistance(CCoordinate my, vector<CFood> FoodVector )
{
    int min;
    min = CaculateDistance(my, FoodVector[0].GetCoordinate());
    int i = 0;
    for (int index = 0; index < FoodVector.size(); index++)
    {
        try {   // 写上了try是因为之前被一个越界中断的bug困住了好久,最后发现是逻辑上的问题。
            if (CaculateDistance(my, FoodVector[index].GetCoordinate()) < min)
            {
                min = CaculateDistance(my, FoodVector[index].GetCoordinate());
                i = index;
            }
        }  catch (std::out_of_range &exc) {  
            MessageBox(NULL,L"SimpleAI", L"Move", 0);
        }  

    }
    // 返回一个距离最近的食物的坐标类
    return FoodVector[i].GetCoordinate();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

移动部分,我写的有些乱。
不过思路仍然是和自己移动有些类似,就是x,y坐标想着目标坐标进行 ++或者–操作 然后通过刷新画布来实现移动。

// 通过判断xy大小来决定移动方向
// X,Y轴的移动是分开判断和计算的,这样就可以实现斜向移动了
// 如果 在同一水平轴上,则这该轴上停止移动
else if (isThinking == false)
{
if (aimCoordinate.GetCentreX() > GetCoordinate().GetCentreX())
        {
            m_eDirectionX = right;
            return;
        }
        else if (aimCoordinate.GetCentreX() < GetCoordinate().GetCentreX())
        {
            m_eDirectionX = left;
            return;
        }
        else 
        {
            m_eDirectionX = stopX;
        }
        if (aimCoordinate.GetCentreY() > GetCoordinate().GetCentreY())
        {
            m_eDirectionY = down;
            return;
        }
        else if (aimCoordinate.GetCentreY() < GetCoordinate().GetCentreY())
        {
            m_eDirectionY = up;
            return;
        }
        else 
        {
            m_eDirectionY = stopY;
            return;
        }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

有个地方需要注意的是,如果x方向的速度为10,而自己的x坐标与目标的x坐标相差为8,这样按照原有的速度是无法让自己走到目标位置的。
我的解决方法:如果相对距离小于速度,则将速度置为相对距离,否则,将速度置为原有速度

// GetAbsolute 绝对值函数
distanceX = aimCoordinate.GetCentreX() -GetCoordinate().GetCentreX();

if (distanceX <= m_iSpeedX && distanceX != 0)
{
    m_iSpeedX = distanceX ;
}
else 
{// m_iOldSpeed初始速度
    m_iSpeedX = m_iOldSpeed;
}

// Y坐标的判断方式和X坐标一致
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

边界判断,如果球运动到边界,那该如何,我的想法是
遇到边界时,将坐标置为相对边界的坐标。比如一个长宽都为500的矩形,当球的x坐标为500时,相当于球运动到右边界,将X坐标置为0,这样就可以实现不会超出边界了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/503139
推荐阅读
相关标签
  

闽ICP备14008679号