我需要为朋友展示一些简单的代码示例,例如顺时针沿着屏幕边缘移动按钮。当然这是非常简单的事情,不,这是最简单的。但我发现自己花了将近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)
这个至少将数据与代码分开,使得更简单。从第一次尝试起,它对我有用。但我仍然不完全满意)
答案 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);
正如我所提到的,这几乎肯定需要进行一些调整,以达到与您所制作的代码一样好看的程度。我的代码可能不太幼稚,但它不太容易理解 - 实际上它在完成任务时效果不佳。
不要担心你的代码有多花哨。它运作良好,并且清楚易懂,这才是最重要的。
我后来意识到我忘记了从中心开始的所有内容,我发布的代码会从左上角开始做一个圆圈。我在上面添加了中心内容。看到?增加复杂性并不意味着代码会更好......: - )
另外,我确实想出了一个我推荐给你原始算法的改变:命名你的状态!使它们成为字符串,并使状态为“顶部”,“右”,“底部”和“左”,并主动设置它们而不是使用状态++。这将有助于使您的代码更具可读性。