2016-07-23 36 views
0

下面是代碼,下面是jsfiddle的鏈接。對俄羅斯方塊和網格使用數組。爲什麼這件作品不會完全顯示出來?

塊的第一行沒有繪製出於某種原因,所有這些2維的循環對我來說很難包圍我的頭,並且找不到塊爲什麼只是從第二排並不完整。

add_block函數應該從任何塊中讀取數組數據並將其放在我的x和y座標所在的網格上。

如果有人知道如何旋轉塊,那也會很酷,我知道爲了轉動一些+90度的東西我需要轉置然後再渲染每一行,但它在早期並沒有真正起作用嘗試。

我知道我不擅長解釋,但我一定會回答你的任何問題。 在此先感謝!我真的很想有一個關於數組和double for循環如何與海誓山盟互動的完整圖片,在我的腦海中。

var canvas = document.getElementById('c'); 
var ctx = canvas.getContext('2d'); 
canvas.width = 300; 
canvas.height = 500; 

var grid_columns = 10; 
var grid_rows = 15; 
var grid_cell_size = 10; 

var grid = []; 
function create_empty_grid(){ 
    for(var i=0;i<grid_columns;i++){ 
     grid[i] = []; 
     for(var j=0;j<grid_rows;j++){ 
      grid[i][j] = 0; 
     } 
    } 
    // END DOUBLE FOR LOOPS 
} 
function clear_grid(){ 
    for(var i=0;i<grid_columns;i++){ 
     for(var j=0;j<grid_rows;j++){ 
      grid[i][j] = 0; 
     } 
    } 
    // END DOUBLE FOR LOOPS 
} 

var x = 0; 
var y = 0; 
var w = 2; 
var h = 3; 

var block = []; 
block[0] = [ 
    [1,0,0,0], 
    [1,1,0,0], 
    [0,1,0,0], 
    [0,0,0,0] 
]; 
function add_block(num){ 
    var b = block[num]; 
    for(var i=0;i<w;i++){ 
     for(var j=0;j<h;j++){ 

      if(i >= x && j >= y && i <= w && j <= h){ 
       grid[i][j] = b[i][j]; 
      } 
     } 
    } 
    // END DOUBLE FOR LOOPS 
} 

function draw(){ 
    for(var i=0;i<grid_columns;i++){ 
     for(var j=0;j<grid_rows;j++){ 
      ctx.fillStyle = "black"; 
      if(grid[i][j] === 1){ 
       ctx.fillStyle = "red"; 
      }else if(grid[i][j] === 0){ 
       ctx.fillStyle = "green"; 
      } 
      ctx.fillRect(i*grid_cell_size,j*grid_cell_size,grid_cell_size-1,grid_cell_size-1); 
     } 
    } 
    // END DOUBLE FOR LOOP 
} 
function update(){ 

} 
function tick(){ 
    clearRect(0,0,canvas.width,canvas.height); 
    clear_grid(); 
    draw(); 
    update(); 
} 

create_empty_grid(); 
add_block(0); 
draw(); 

View in jsfiddle

+1

在'b [i] [j]'中,請注意'i'指的是您的矩陣的y軸,'j'指的是x軸。你是這樣做的。 – Arnauld

回答

0

好像你正在使用ij表示 「塊」 的座標,並 xy代表 「網格」 的座標。因此,我認爲這種情況是錯誤的:

if(i >= x && j >= y && i <= w && j <= h){ 
       grid[i][j] = b[i][j]; 
      } 

我覺得你真正需要的是在這裏與像更換if聲明:

grid[i+x][j+y] = b[i][j]; 

但作爲@Arnauld指出,還有一個關於i,j是表示「行,列」還是「列,行」,這看起來像你的用法與數組初始化的方式相反。換句話說,你使用:

grid[row][column]b[row][column]

,但奠定了你的陣列的方式,它需要

grid[column][row]b[column][row]

所以你需要在這裏和那裏做一些調整,使代碼做你想做的事情。

+0

將每個「我」改變爲「j」和「j」改爲「我」,說實話,這是沒有意義的,因爲x在字母y之前就像「i」在「j」之前。 我照你所說的做了,但改變if語句並沒有改變任何東西。 更新了jsfiddle:https:// jsfiddle。net/NeuroTypicalCure/w2epqfL6/1/ – onlyme0349

+0

@only:成爲一名熟練的軟件開發人員的一部分是知道何時放棄直覺和「常識」,瞭解事情「應該」如何工作,並準確理解如何準確地表達自己的意圖用你正在使用的語言。 –

+0

你的哲學評論應該如何幫助我?如果我知道如何準確地表達我的意圖,我就不會在這裏。我只是想學習,如果你粗略地告訴我在哪裏看,或者我如何去解決這個問題,我會在其他項目中把它帶到我身邊,我不能像一些編碼天才一樣把自己看成是我自己,我是正常。 – onlyme0349

0

由於某種原因,「b」陣列顛倒了,所以我將grid[j+x][i+y] = b[j][i]更改爲grid[j+x][i+y] = b[i][j],這顯示了完整的區塊,但我仍然無法想象這些陣列或將來無法防止這些問題。 陣列對我來說很困惑。

我會想出最終的結果,我想,但一天必須經過。

+0

「出於某種原因」 - >「因爲這就是我寫的。」 –

+0

我不知道這些會以這種方式結束,不要讓我覺得比我更加愚蠢 – onlyme0349