LUA 中用 Math.库找角度和距离的问题?

我试图使用 math. 库(连同 arctan)制作一个输入程序,但无论第1个选项中给定的“位置”是什么(距离为500,角度为88或89),它都会带来相同的结果。

math.randomseed (os.time())

local player_choice = 0
local Player_x, Player_y = 400,300
local Enemy_x, Enemy_y = 0,0

while player_choice ~= 4 do
    print ("+=======================================+")
    print ("  欢迎,"..os.date())
    print (":---------------------------------------:")
    print (": 1. 随机生成敌人位置。    :")
    print (": 2. 敌人与玩家之间的距离 :")
    print (": 3. 敌人与玩家之间的角度 :")
    print (": 4. 退出                               :")
    print ("+=======================================+")

    print ("请选择你的选项:")
    local player_choice = io.read ("*n")

    if player_choice == 1 then
        local Enemy_x = math.random (0,800)
        local Enemy_y = math.random (0,600)
        print ("新敌人位置: ["..Enemy_x..","..Enemy_y.."]")
    end

    if player_choice == 2 then
        local distance = math.sqrt((Enemy_x - Player_x)^2 + (Enemy_y - Player_y)^2)
        print ("敌人到玩家的距离: ".. distance)

    end

    if player_choice == 3 then
        local angle = math.atan (Enemy_y - Player_y - Enemy_x - Player_x)
        local angle_degree = math.deg (angle)
        print ("敌人到玩家的角度: ".. angle_degree.." 度")
    end
end

有没有办法解决这个代码,还是版本本身就有缺陷?(我从早期版本的教程中看到的)

原文链接 https://stackoverflow.com/questions/70932989

点赞
stackoverflow用户2858170
stackoverflow用户2858170

有两个问题在你的代码中。

问题 1:

你随机敌人的位置是局部的,只在这个 if 语句内:

if player_choice == 1 then
   local Enemy_x = math.random (0,800)
   local Enemy_y = math.random (0,600)
   print ("new enemy position: ["..Enemy_x..","..Enemy_y.."]")
 end

你没有改变你在这里定义的 local Enemy_x, Enemy_y = 0,0。 在 if 块外,Enemy_xEnemy_y 还是 0

在 if 块中定义这些局部变量会遮盖一个更大作用域中同名的变量。

你需要在 if 语句中删除 local 关键字。

if player_choice == 1 then Enemy_x = math.random (0,800) Enemy_y = math.random (0,600) print ("new enemy position: ["..Enemy_x..","..Enemy_y.."]") end

这解释了为什么你的距离总是 500,也是为什么你的角度不改变的一部分。

问题 2:

两个点之间的角度不能像这样计算它们坐标的差值:

local angle = math.atan (Enemy_y - Player_y - Enemy_x - Player_x)

可能是个打字错误?

你应该实际计算 math.atan(Enemy_y - Player_y, Enemy_x - Player_y)

结果是你的代码总是计算 math.atan(-700),这导致一个无法改变的角度。

我建议你重新阅读 https://zh.wikipedia.org/wiki/Atan2

2022-01-31 21:49:23