2016-07-23 3 views
0

コードは次のとおりです。以下はjsfiddleへのリンクです。テトリスピースとグリッドの配列の使用。なぜこの作品は完全に見えないのですか?

ブロックの最初の行が何らかの理由で描画されていないため、これらの2次元のループはすべて私の頭を包むのが難しく、ブロックが2行目と完了しません。

add_block関数は、任意のブロックから配列データを読み込み、my x座標とy座標があるグリッドに配置することになっています。

もしブロックを回転させる方法を知っている人がいればそれも涼しいでしょう。何か+90度を回すためには転置してから各行を読み返す必要がありますが、試してみる。

私は説明がうまくいかないと知っていますが、あなたの質問には必ず答えます。 ありがとうございます!私は本当に、配列とループ用の二重線がどうやって相互にやりとりをするのかを完全に把握したいと思っています。

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

"i"を "j"に、 "j"を "i"に変更しました。正直なところ、xが "i"の前に来るので意味がありません。 あなたが言ったように、if文を変更しても何も変わりませんでした。 jsfiddle:https:// jsfiddleが更新されました。熟練したソフトウェア開発者になることは、あなたの直感を放棄すること、そして物事が「想定されている」ことを「常識」とし、意図を正確に表現する方法を正確に理解していることを知っていることになります(net/NeuroTypicalCure/w2epqfL6/1/ – onlyme0349

+0

)あなたが働いている言語で –

+0

あなたの哲学的なコメントは私をどのように助けてくれるでしょうか?私の意図を正確に表現する方法が分かっていれば、私はここにいません。私はちょうどどこに見えるか、これを修正する方法について大まかに教えて、私は他のプロジェクトでそれを私と一緒に持っていくつもりだと思っています。ちょうど正常です。 – onlyme0349

0

"b"の配列は何らかの理由で逆さになりました。grid[j+x][i+y] = b[j][i]grid[j+x][i+y] = b[i][j]に変更しましたが、完全なブロックが表示されますが、今後もこれらの問題を回避することはできません。 配列は私にはとても混乱しています。

私はそれが最終的に私は推測するが、一日は行く必要があります。

+0

"何らかの理由で" - > "それは私がそれを書いたからです"。 –

+0

私はこれらが終わることを知らなかった、私はすでに喜んでいるよりももっと愚かな気分にさせてはいけない – onlyme0349

関連する問題