/** * テスト用のブロックを配置 */ void setTestBlocks(int w, int h, int color, Stage stg, int[] blocks) { // 配置指定でブロックが無い場合は、配置先を変更しないので別途盤面をクリアしておく stg.clearAllBlocks(); Stage.BlockInfo[] area = new Stage.BlockInfo[w * h]; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { int index; index = x + y * w; area[index] = new Stage.BlockInfo(); if (1 == blocks[index]) { area[index].state = Stage.BLOCK_STATE.EXISTS; area[index].color_index = color; } else { area[index].state = Stage.BLOCK_STATE.NONE; area[index].color_index = 0; } } } // 指定されたブロックの領域を配置 stg.placeBlocks(0, 0, area, w, h); }
/** * 判定用のブロック状態を作成 */ Stage.BlockInfo[] createPatternArea(Tetrimino tetrimino) { Tetrimino.Pattern pat = tetrimino.getPattern(); Stage.BlockInfo[] patArea = new Stage.BlockInfo[pat.w * pat.h]; for (int y = 0; y < pat.h; y++) { for (int x = 0; x < pat.w; x++) { int index = x + y * pat.w; Stage.BlockInfo binfo = new Stage.BlockInfo(); if ('1' == pat.pat[index]) { binfo.state = Stage.BLOCK_STATE.EXISTS; binfo.color_index = tetrimino.getColorIndex(); } else { binfo.state = Stage.BLOCK_STATE.NONE; binfo.color_index = 0; } patArea[index] = binfo; } } return(patArea); }
public void placeBlocks() { Stage stg = new Stage(6, 10); int block_w = 6; int block_h = 10; Stage.BlockInfo[] area = new Stage.BlockInfo[block_w * block_h]; int index; for (int y = 0; y < block_h; y++) { for (int x = 0; x < block_w; x++) { index = x + y * block_w; area[index] = new Stage.BlockInfo(); area[index].state = Stage.BLOCK_STATE.EXISTS; area[index].color_index = index; // 確認用にインデックスをそのまま入れておく } } Stage.BlockInfo[,] stgBinfo = stg.getBlockInfo(); int blank_count = 0; //[todo] このループ何とかする for (int y = 0; y < block_h; y++) { for (int x = 0; x < block_w; x++) { if ((stgBinfo[x, y].state == Stage.BLOCK_STATE.NONE) && (stgBinfo[x, y].color_index == 0)) { blank_count++; } } } Assert.AreEqual(block_w * block_h, blank_count); stg.placeBlocks(0, 0, area, 6, 10); int exists_count = 0; for (int y = 0; y < block_h; y++) { for (int x = 0; x < block_w; x++) { index = x + y * block_w; if ((stgBinfo[x, y].state == Stage.BLOCK_STATE.EXISTS) && (stgBinfo[x, y].color_index == index)) { exists_count++; } } } Assert.AreEqual(block_w * block_h, exists_count); }
/** * 指定されたブロックの状態と盤面を比較 */ // 比較するブロックの色は、ひとまず1色のみにしておく // 「ブランク=0」それ以外は指定の色とみなす void compareBlocks(int block_w, int block_h, int[] blocks, int block_color, Stage.BlockInfo[,] binfos) { for (int y = 0; y < block_h; y++) { for (int x = 0; x < block_w; x++) { // 消えたラインの分、一番上のラインは何もなくなる Stage.BlockInfo binfo = binfos[x, y]; int block = blocks[x + y * block_w]; Assert.IsTrue(((block == 1) && (binfo.state == Stage.BLOCK_STATE.EXISTS)) || ((block == 0) && (binfo.state == Stage.BLOCK_STATE.NONE)), "[" + x + "," + y + "] is not match" ); Assert.IsTrue(((block == 1) && (binfo.color_index == block_color)) || ((block == 0) && (binfo.color_index == 0)), "[" + x + "," + y + "] is not match" ); } } }