簡體   English   中英

Javascript-重復的if語句不起作用

[英]Javascript - Repeated if-statements don't work

我的代碼有效(不會失敗),但它做的事情不正確。

每當我想生成一個新的“塊”時,我都會調用“生成”函數,每次調用該函數時都會將一個新的數字傳遞給該函數。 它可以生成塊,但不會生成我想要的塊。

如果上一代是空間,我希望它生成一個空間,一個跳躍,一個滑動或一個間隙。 但是,如果上一代不是一個空間,請生成一個空間。 它不會那樣做。 有時彼此之間會產生2個間隙,2個跳躍或2個滑行,我不知道為什么... ???

這是我的代碼:

var ptg = 'space'; // what was previously generated to top
var wtgt; // what is currently being generated to top
var chunktogenerateto = 0;

function generate(a){
    chunktogenerateto = a;

    var rand1 = Math.floor(Math.random()*100) + 1;

    if(ptg == 'space' && rand1 <= 25){
        wtgt = 'space';
    }
    else if(ptg == 'space' && rand1 <= 50 && rand1 > 25){
        wtgt = 'jump';
    }
    else if(ptg == 'space' && rand1 <= 75 && rand1 > 50){
        wtgt = 'slide';
    }
    else if(ptg == 'space' && rand1 > 75){
        wtgt = 'gap';
    }
    else{
        wtgt = 'space';
    }

    ptg = wtgt;

    topGen(wtgt);
}

function topGen(g){
    document.getElementById('t' + chunktogenerateto).setAttribute('src','images/terrain/t' + g + '.png');
}

我希望這不是錯字...幫助!

“生成”的調用來自哪里:

var chunkpos = new Array();
chunkpos[0] = -100;
chunkpos[1] = 0;
chunkpos[2] = 100;
chunkpos[3] = 200;
chunkpos[4] = 300;
chunkpos[5] = 400;
chunkpos[6] = 500;
chunkpos[7] = 600;
chunkpos[8] = 700;
chunkpos[9] = 800;
chunkpos[10] = 900;
chunkpos[11] = 1000;
var temppos = new Array();
var time1;
var millis1;
var time2;
var millis2;
var millis3;
var firstreset = true;
var pos;
var poschange;

function moveLevel(){
    if(firstreset == true){
        resetTime();
    }
    var time2 = new Date();
    var millis2 = time2.getTime();
    var millis3 = millis2 - millis1;
    poschange = Math.floor(millis3 / 5);
    for(i = 0; i < chunkpos.length; i++){
        temppos[i] = chunkpos[i] - poschange;
        if(temppos[i] <= -150){
            generate(i);
            temppos[i] += 1200;
        }
        pos = temppos[i];
        document.getElementById('chunk' + i).setAttribute('style','left: ' + pos + 'px;');
    }
}



function resetTime(){
    time1 = new Date();
    millis1 = time1.getTime();
    if(firstreset != true){
        for(i = 0; i < chunkpos.length; i++){
            chunkpos[i] = temppos[i];
        }
    }
    firstreset = false;
    setTimeout('resetTime()',1000);
}

調用“ moveLevel”的位置來自:

window.onload = function(){
    if(test = 'runnable')
    {
        gameLoop();
    }
    else
    {
        document.getElementById('gm').innerHTML = (gm + 'Failed to run game.');
    }
}

function gameLoop(){
    if(currentscreen == 'playing'){
        moveLevel();
    }
    setTimeout('gameLoop()',0);
}

這是一個包含所有代碼的zip文件的下載鏈接: ParkourFreak.zip我遇到麻煩的代碼在scripts / generation.js下。 游戲主頁面(可見生成的頁面)是index.html。

而不是每個以“ if(ptg =='space'... etc”開頭的if語句-在一個簡單的“ if not space return space”中首先執行此操作。

之后,您可以隨機開始-應該適合您。

由於以下代碼,大約有四分之一的時間您以前有一個空間,它將創建另一個空間:

if(ptg == 'space' && rand1 <= 25){
    wtgt = 'space';
}

請注意,它是在先前創建空間時創建空間的。


邊注:

此行無需&& rand1 > 25

else if(ptg == 'space' && rand1 <= 50 && rand1 > 25){

由於您以前使用過if(ptg == 'space' && rand1 <= 25){ ,所以從ptg == 'space'rand1不能<= 25

(在以下情況下, && rand2 > 50同樣。)

您確定要增加chunktogenerateto嗎?

當前代碼似乎保持為0,是在您未顯示的細分中嗎?

編輯:哦,這是函數的參數。 嘗試記錄該變量,也許是問題所在?

// elsewhere
var wtgts = ['space','jump','slide','gap'];

// in the function
if(ptg !== 'space') {
    wtgt = 'space';
} else {
    var randidx = Math.floor(Math.random()*4);
    wtgt = wtgts[randidx];
}

甚至在函數中:

var newidx = (ptg == 'space') ? Math.floor(Math.random()*4) : 0;
wtgt = wtgts[newidx];
  1. 權重相等,因此只需從0到3中選擇一個隨機索引,然后使用該索引從數組中選擇一個動作即可。
  2. 分開將ptg作為空間的邏輯,以便只測試一次
  3. 考慮將動作表示為數字而不是字符串,因為賦值,比較等將更快,更可靠。

我認為問題在於一代人,而實際上我要做的就是改變這一點:

if(temppos[i] <= -100){
    generate(i);
    temppos[i] += 1200;
}

對此:

if(temppos[i] <= -100){
    generate(i);
    chunkpos[i] += 1200;
    temppos[i] += 1200;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM