将此功能从童年时代转换为更好的东西?

时间:2013-05-21 07:27:35

标签: javascript

我需要为朋友展示一些简单的代码示例,例如顺时针沿着屏幕边缘移动按钮。当然这是非常简单的事情,不,这是最简单的。但我发现自己花了将近30分钟。我被淹没了,因为我是20多年的专业程序员,我甚至需要在按钮正确飞行之前多次启动程序。我在想,为什么?所以我推测这种代码很难立即得到正确的,因为它是非常旧的样式,每种情况都是单独输入的,每次检查都必须手动输入,你需要经历每次迭代并仔细确保所有数字和检查完全正确,这很难做到,因为代码风格的本质,即eehh,spaghetti,messy?

所以我想,是否有办法将其转换为“现代”方式,如使用循环而不是案例,使用模板或其他元编程,使用功能方法或至少使用数组。似乎我找不到任何好办法。

var mx = screen.width - b.w, my = screen.height - b.h

setInterval(function() {
    var step = 3
    if (state == 1) {
        b.x += step
        if (b.x >= mx) b.x = mx, state++
    } else if (state == 2) {
        b.y += step
        if (b.y >= my) b.y = my, state++
    } else if (state == 3) {
        b.x -= step
        if (b.x <= 0) b.x = 0, state++
    } else if (state == 4) {
        b.y -= step
        if (b.y <= 0) b.y = 0, state = 1
    }
    b.apply()
}, 1)

这是JavaScript,在C中,快速获取会更加困难,因为你需要考虑类型。

这就是我自己提出来的......这可能是我想要实现的目标。我不是在谈论选择不同的算法。而是abotu探索语言功能和编程技术。

var D = 3, name = ['x','y'], delta = [D,D,-D,-D], 
    limit = [screen.width - b.w, screen.height - b.h,0,0]

setInterval(function() {
    b[name[0]] += delta[0]
    if (delta[0] > 0 && b[name[0]] > limit[0] || b[name[0]] <= 0)
        b[name[0]] = limit[0],
        [name,delta,limit].some(function(x){ x.push(x.shift()) })
    b.apply()
},1)

这个至少将数据与代码分开,使得更简单。从第一次尝试起,它对我有用。但我仍然不完全满意)

1 个答案:

答案 0 :(得分:3)

美国报纸的平均文章写得像六年级阅读水平。这不是因为写作的人从未超过6年级;相反,他们已经知道以每个人都能理解的方式写作更好。我提出这个问题是因为你把你的代码称为幼稚或简单,但它是你所拥有的任务中最清晰简洁的代码,因此是最好的。

如果你想去一个广场,除了你做的事情之外你真的不会有任何选择 - 有四个不同的方向去,并跟踪你在哪里。你的代码展示了状态机的基础知识,因为这是你需要在四条不同的直线上进行的。

如果你愿意用稍微不同的动作伪造它,你可以删除所有状态,然后使用一些三角函数在椭圆中四处走动。 (它实际上应该是一个圆圈,但由于屏幕是矩形的,你会得到一个椭圆,在屏幕的长边和短边都有不同的速度。)

这是基础知识。可能需要进行一些调整以确保边缘碰到正确的位置。说实话,我认为当你解决这个版本的特殊情况时,你会发现你的解决方案更优雅。

// find the center x and y
var centerX = screen.width / 2;
var centerY = screen.height / 2;
// first, find the radius.  If you want to cover everything, you need half the diagonal
var radius = Math.sqrt(centerX * centerX + centerY * centerY);
var increment = 0.01; // higher values, of course, will move you faster
var theta = 0;
setInterval(function() {
    b.x = Math.min(Math.max(centerX + radius * Math.cos(x), screen.width), 0);
    b.y = Math.min(Math.max(centerY + radius * Math.sin(y), screen.height), 0);
    theta -= increment;
    b.apply();
}, 1);

正如我所提到的,这几乎肯定需要进行一些调整,以达到与您所制作的代码一样好看的程度。我的代码可能不太幼稚,但它不太容易理解 - 实际上它在完成任务时效果不佳。

不要担心你的代码有多花哨。它运作良好,并且清楚易懂,这才是最重要的。

修改

我后来意识到我忘记了从中心开始的所有内容,我发布的代码会从左上角开始做一个圆圈。我在上面添加了中心内容。看到?增加复杂性并不意味着代码会更好......: - )

另外,我确实想出了一个我推荐给你原始算法的改变:命名你的状态!使它们成为字符串,并使状态为“顶部”,“右”,“底部”和“左”,并主动设置它们而不是使用状态++。这将有助于使您的代码更具可读性。