2014-02-06 36 views
0

我目前正在进行闲置游戏并遇到问题。Javascript:for,switch和Math.rand合为一体并且不能正常工作

我正在尝试创建一个函数,它将减少6个变量中的1个(每个代表一种工作类型)的次数。但是,如果这6个变量中的一个变为0,我需要它选择其中的另一个5,并且我无法让它工作。

随着摆弄周围,我得到这样的:

function killWorker(amount){ 
    var job; 
    for (var i=0;i<amount;i++){ 
     job = Math.floor((Math.random()*6)+1); 
     switch (job){ 
      case 1: 
       if(unass_workers>0){ 
        unass_workers -= 1; 
       }else{ 
        i-=1; 
       } 
      case 2: 
       if(farm_workers>0){ 
        farm_workers -= 1; 
       }else{ 
        i-=1; 
       } 
      break; 
      case 3: 
       if(tree_workers>0){ 
        tree_workers -= 1; 
       }else{ 
        i-=1; 
       } 
      break; 
      case 4: 
       if(metMine_workers>0){ 
        metMine_workers -= 1; 
       }else{ 
        i-=1; 
       } 
      break; 
      case 5: 
       if(golMine_workers>0){ 
        golMine_workers -= 1; 
       }else{ 
        i-=1; 
       } 
      break; 
      case 6: 
       if(paper_workers>0){ 
        paper_workers -= 1; 
       }else{ 
        i-=1; 
       } 
      break; 
      default: 
       console.log("error: killWorker() didn't work properly"); 
      break; 
     } 
    } 
} 

这工作时,我做了少量的,但是当我增加量高于整个事情坠毁。如果能够更好地发挥作用,我会很乐意彻底改变这个功能,如果这可以帮助获得更简单或更有效的解决方案,我也会使用jquery。

+0

我会努力找到一种方法,不允许你的随机数引用已经为0的工作者。并且可以移除该开关语句的方法(例如将你的工人放在一个对象中并循环它的键) –

+2

一旦类别用完了,你的函数就可能无限循环,并且一旦所有类别的用户都用完了,它肯定会无限循环。我会认为这是发生了什么事。 – Tibos

回答

0

正如我所说的,可能发生的情况是数量大于X_workers的总和,导致无限循环。

,让您的逻辑正确的修复程序是检查有足够的工人被杀害:

function killWorker(amount){ 
    if (amount < unass_workers + farm_workers + ...) return "Genocide"; 
    var job; 
    for (var i=0;i<amount;i++){ 
    ... 
} 

一种更好的方式来组织你的数据结构可以是:

var workerNames = [ 'unass', 'farm', 'tree', 'metMine', 'golMine', 'paper' ]; 
var workers = { 
    unass : 23, 
    farm : 45, 
    tree : 6, 
    metMine : 99, 
    golMine : 3, 
    paper: 43 
} 

function getRandomLiveJobName() { 
    var jobs = workerNames.filter(function(name) { 
    return workers[name] > 0; 
    }); 
    return jobs[Math.floor(Math.random()*jobs.length)]; 
} 

function killWorkers(amount) { 
    for (;amount--;) { 
    var job = getRandomLiveJobName(); 
    if (!job) return "Genocide"; 
    workers[job]--; 
    } 
} 

killWorkers(150); 
console.log(workers); // { farm: 0, golMine: 0, metMine: 64, paper: 5, tree: 0, unass: 0 } 

当然它可以通过在每次需要通过更新killWorkers中的单个数组进行随机实时工作时不创建新阵列来优化,但我认为现在更容易阅读。

+0

嘿,所以,我试图实现你的workerNames数组解决方案,似乎有问题。我已经开始尝试在代码的其他部分首先实现它,但我现在正在阅读NaN。 当页面加载下面的函数运行时。我把控制台登录,发现很奇怪 function initialize(){ \t console.log(workers); \t show(“gameMain”); \t reset(); \t console.log(workers); \t ... } 第一个console.log正确读取,但第二个读取为0.工作变量之间没有被触摸...然后...我不知道发生了什么事... – Dezonus

+0

你'显然是与工人之间的工作变量进行变化。只需要更多地关注你写的代码。 – Tibos