将SpriteKIt中的AI应用于曲棍球吗?

问题描述 投票:0回答:1

我正在开发类似于SpriteKit中的曲棍球的游戏,以娱乐和学习Swift / Xcode。我预计AI将是一个巨大的挑战,因为游戏中还有其他要素需要考虑。我知道我将不得不一一解决每个问题。我已经为游戏创建了2人模式,现在我正在研究AI。这是一些我用来计算和委托从槌到冰球的脉冲的代码(在2人模式下):

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
{
    bottomTouchIsActive = true
    var releventTouch:UITouch!
    //convert set to known type
    let touchSet = touches

    //get array of touches so we can loop through them
    let orderedTouches = Array(touchSet)


    for touch in orderedTouches
    {
        //if we've not yet found a relevent touch
        if releventTouch == nil
        {
            //look for a touch that is in the activeArea (Avoid touches by opponent)
            if activeArea.contains(CGPoint(x: touch.location(in: parent!).x, y: touch.location(in: parent!).y + frame.height * 0.24))
            {
                isUserInteractionEnabled = true
                releventTouch = touch
            }
            else
            {
                releventTouch = nil
            }
        }
    }

    if (releventTouch != nil)
    {
        //get touch position and relocate player
        let location = CGPoint(x: releventTouch!.location(in: parent!).x, y: releventTouch!.location(in: parent!).y + frame.height * 0.24)
        position = location

        //find old location and use pythagoras to determine length between both points
        let oldLocation = CGPoint(x: releventTouch!.previousLocation(in: parent!).x, y: releventTouch!.previousLocation(in: parent!).y + frame.height * 0.24)
        let xOffset = location.x - oldLocation.x
        let yOffset = location.y - oldLocation.y
        let vectorLength = sqrt(xOffset * xOffset + yOffset * yOffset)

        //get eleapsed and use to calculate speed6A
        if  lastTouchTimeStamp != nil
        {
            let seconds = releventTouch.timestamp - lastTouchTimeStamp!
            let velocity = 0.01 * Double(vectorLength) / seconds

            //to calculate the vector, the velcity needs to be converted to a CGFloat
            let velocityCGFloat = CGFloat(velocity)

            //calculate the impulse
            let directionVector = CGVector(dx: velocityCGFloat * xOffset / vectorLength, dy: velocityCGFloat * yOffset / vectorLength)

            //pass the vector to the scene (so it can apply an impulse to the puck)
            delegate?.bottomForce(directionVector, fromBottomPlayer: self)
            delegate?.bottomTouchIsActive(bottomTouchIsActive, fromBottomPlayer: self)
        }
        //update latest touch time for next calculation
        lastTouchTimeStamp = releventTouch.timestamp
    }
}

我想知道如何为AI转换此代码。我一直在向更新功能添加一些AI逻辑,我相信这也可以使用时间戳并计算帧之间的行进距离以计算脉冲。我只是不确切地知道如何实现这种想法。任何帮助,不胜感激:)

这里是我到目前为止用于测试目的的一些基本代码,主要用于更新功能中的AI模式:

    if (ball?.position.y)! < frame.height / 2
    {
        if (botPlayer?.position.y)! < frame.height * 0.75
        {
            botPlayer?.position.y += 1
        }
    }
    else
    {
        if (botPlayer?.position.y)! > (ball?.position.y)!
        {
            if (botPlayer?.position.y)! - (ball?.position.y)! > frame.height * 0.1
            {
                botPlayer?.position.y -= 1
            }
            else
            {
                botPlayer?.position.y -= 3
            }
        }
        else
        {
            botPlayer?.position.y += 1
        }
    }
    if ((botPlayer?.position.x)! - (ball?.position.x)!) < 2
    {
        botPlayer?.position.x = (ball?.position.x)!
    }
    if (botPlayer?.position.x)! > (ball?.position.x)!
    {
        botPlayer?.position.x -= 2
    }
    else if (botPlayer?.position.x)! < (ball?.position.x)!
    {
        botPlayer?.position.x += 2
    }
swift xcode sprite-kit artificial-intelligence
1个回答
0
投票

要让AI做出决定,它必须具有有关游戏状态的信息。为此,您可以编写一个函数来读取所有可用的游戏数据(冰球位置,玩家得分,之前的举步等),并将状态作为字典返回。然后编写一个函数以接收此字典,并输出一个决定。在Python中考虑此工作流程。

# we want the AI to make a decision

# start by grabbing game state
gameState = getGameState()

# pass this to the decision function
decision = getDecision( gameState )

# implement the decision
if decision == "move left":
    moveLeft()
else:
    moveRight()

这是您要寻找的吗?

© www.soinside.com 2019 - 2024. All rights reserved.