V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
Dummy
V2EX  ›  JavaScript

一个JS的问题,绕不过去了。

  •  
  •   Dummy · 2012-10-21 11:17:02 +08:00 · 4014 次点击
    这是一个创建于 4417 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚学JS编程, 哥哥给出了道JS的题,有个思考绕不过去,求指点:

    有四张卡片,每张都有正反面。
    程序开始执行,五秒后第一张卡片翻面,过五秒再翻回来,再过10秒下一张卡片翻面,也是五秒之后再翻回来...

    依次类推到第四次卡片翻回来之后,再翻第一张卡片。。

    怎么用卡片翻面的脚本应该很简单就不求解了,只想请教一下这个逻辑怎么写?

    请V2EX的同学能够帮助一下我。
    11 条回复    1970-01-01 08:00:00 +08:00
    hyq
        1
    hyq  
       2012-10-21 11:40:14 +08:00
    http://gist.github.com/3925580
    不知道这个是不是你想要的
    54sword
        2
    54sword  
       2012-10-21 12:11:23 +08:00
    //true 正面, false 反面
    var card = ['false', 'false', 'false', 'false'];
    var index = 0;
    function startTurnCard() {
    if (index == card.length) index = 0;
    var time = 5000 * index;
    setTimeout(function() {
    card[index] = true;
    console.log((index + 1) + "卡片被翻到正面");
    setTimeout(function() {
    card[index] = false;
    console.log((index + 1) + "卡片被翻回反面");
    index++;
    startTurnCard();
    }, 5000);
    }, 5000 + time);
    }
    startTurnCard();

    也尝试写了一下,看看是否正确。
    zhangxiao
        3
    zhangxiao  
       2012-10-21 13:44:21 +08:00
    // 第一个函数,负责翻一张卡片,参数是卡片
    f1(card_id) {
    //翻卡片
    }

    // 第二个函数,负责每隔5s调用第一个函数,参数是卡片和调用次数(这里是2)
    f2(card_id, times) {
    for i in [0..times]
    f1(card_id)
    sleep(5)
    }

    // 第三个函数,负责每隔10s调用第二个函数,参数是卡片们
    f3(card_ids) {
    while true
    for i in [0..card_ids.length]
    f2(card_ids[i])
    }

    都是伪代码,逻辑应该能表示清楚了
    zhangxiao
        4
    zhangxiao  
       2012-10-21 13:45:22 +08:00
    呃...上面的f3里忘记sleep(10)了
    Dummy
        5
    Dummy  
    OP
       2012-10-21 13:51:09 +08:00
    @hyq 结果不对。

    5.002 "卡片0正面"
    10.004 "卡片0反面"
    20.007 "卡片1正面"
    25.009 "卡片1反面"
    40.011 "卡片2正面" //这儿好像不对,应该是 35才对。。
    hyq
        6
    hyq  
       2012-10-21 16:13:33 +08:00
    @Dummy 那个时间的序列是 5 5 10 5 10 5 10 5...?
    Dummy
        7
    Dummy  
    OP
       2012-10-21 16:46:54 +08:00
    @hyq 以下是你的程序算出的结果:

    5.001 "卡片0正面" //正确
    10.003 "卡片0反面" //正确
    20.005 "卡片1正面" //正确
    25.006 "卡片1反面" //正确
    40.007 "卡片2正面" //错误,应该是35
    45.008 "卡片2反面" //上一个不正确,这一个自然就错了,应该是 40
    65.009 "卡片3正面" //应该是 50,原因同上。
    hyq
        8
    hyq  
       2012-10-21 17:10:15 +08:00
    @Dummy 那就是我理解有误,你把order+1全部替换成2就行了
    Dummy
        9
    Dummy  
    OP
       2012-10-21 18:03:33 +08:00
    @hyq 也不对。
    hyq
        10
    hyq  
       2012-10-21 20:18:40 +08:00
    5 "卡片0正面"
    10.001 "卡片0反面"
    20.001 "卡片1正面"
    25.002 "卡片1反面"
    35.002 "卡片2正面"
    40.002 "卡片2反面"
    50.002 "卡片3正面"
    55.002 "卡片3反面"
    这个结果,不知道你是指哪里有问题
    tshwangq
        11
    tshwangq  
       2012-10-21 22:25:21 +08:00
    思路,牌+空档共有3个状态,4张牌12个状态也就是12位
    var cards = 0x6db,seq = 0,bits = 12;

    window.setInterval(function () {
    seq++;
    if ((cards & (0x1 << (seq-1) % bits)) > 0) {
    console.debug(seq * 5 + ":" + ~~(seq / 3)%4 + "/" + ((seq % 2) ^ ( ~~(seq / 3)%2)));
    } else {
    console.debug(seq * 5 + ":");
    }
    }, 500);
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2977 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:30 · PVG 21:30 · LAX 05:30 · JFK 08:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.