//public board clone() //{ // board cp = new board(); // cp.field = (int[,])field.Clone(); // cp.isb2b = isb2b; // cp.combo = combo; // cp.column_height = (int[])column_height.Clone(); // if (piece != null) // cp.piece = piece.clone(); // if (holdpiece != null) // cp.holdpiece = holdpiece.clone(); // cp.isdead = isdead; // cp.garbage_cnt = garbage_cnt; // return cp; //} public simpboard tosimple() { simpboard sBoard = new simpboard(); sBoard.isb2b = isb2b; sBoard.isb2bclear = isb2bclear; sBoard.combo = combo; if (piece != null) { sBoard.piece = piece.clone(); } if (holdpiece != null) { sBoard.holdpiece = holdpiece.clone(); } sBoard.isdead = isdead; sBoard.column_height = (int[])column_height.Clone(); sBoard.garbage_cnt = garbage_cnt; for (int i = 0; i < 40; ++i) { for (int j = 0; j < 10; ++j) { sBoard.field[i, j] = (field[i, j] != 0); } } return(sBoard); }
public int soft_drop_floor(ref simpboard field) { int dist = 900; for (int i = 0; i < weight; i++) { for (int j = 0; j < height; ++j) { if (minofield[j, i] != 0) { dist = Math.Min(dist, minopos.x - field.column_height[i + minopos.y] + j); break; } } } if (dist < 0) { dist = 0; while (check_mino_ok(ref field, minopos.x - dist - 1, minopos.y)) { dist++; } } if (dist > 0) ////while (check_mino_ok(ref field, minopos.x - 1, minopos.y)) { minopos.x -= dist; spinlast = false; } return(dist); }
public bool ismin(ref simpboard field) { if (name != "T") { return(false); } if (stat == 1) { return(field.checkfield(minopos.x, minopos.y) && field.checkfield(minopos.x + 1, minopos.y) && field.checkfield(minopos.x + 2, minopos.y)); } if (stat == 2) { return(field.checkfield(minopos.x + 2, minopos.y) && field.checkfield(minopos.x + 2, minopos.y + 1) && field.checkfield(minopos.x + 2, minopos.y + 2)); } if (stat == 3) { return(field.checkfield(minopos.x, minopos.y + 2) && field.checkfield(minopos.x + 1, minopos.y + 2) && field.checkfield(minopos.x + 2, minopos.y + 2)); } if (stat == 0) { return(field.checkfield(minopos.x, minopos.y) && field.checkfield(minopos.x, minopos.y + 1) && field.checkfield(minopos.x, minopos.y + 2)); } return(false); }
public bool soft_drop(ref simpboard field) { if (check_mino_ok(ref field, minopos.x - 1, minopos.y)) { minopos.x -= 1; spinlast = false; return(true); } return(false); }
public bool right_move(ref simpboard field) { if (check_mino_ok(ref field, minopos.x, minopos.y + 1)) { minopos.y += 1; spinlast = false; return(true); } return(false); }
public void reset_stat(board a) { Board = a.tosimple(); tree temp = boardtree.clone(); temp.pieceidx = boardtree.pieceidx; boardtree = temp; boardtree.Board = Board.clone(); extend_node(); }
public void spinstatupdate(ref simpboard field) { if (isTspin(ref field)) { Tspin = true; if (ismin(ref field)) { mini = true; } } }
public bool check_mino_ok(ref simpboard field, pos p, int[,] minofield) { for (int i = 0; i < height; ++i) { for (int j = 0; j < weight; ++j) { if (field.checkfield(i + p.x, j + p.y) && minofield[i, j] != 0) { return(false); } } } return(true); }
public void reset_stat(bool[,] field, bool b2b, int combo) { tree temp = boardtree.clone(); temp.pieceidx = boardtree.pieceidx; Board = temp.Board.clone(); Board.field = field; Board.column_height = Board.updatecol(); Board.isb2b = b2b; Board.combo = combo; boardtree = temp; boardtree.Board = Board.clone(); extend_node(); }
public bool isTspin(ref simpboard field) { if (name != "T") { return(false); } if (!spinlast) { return(false); } int cnt = (field.checkfield(minopos.x, minopos.y) ? 1 : 0) + (field.checkfield(minopos.x + 2, minopos.y) ? 1 : 0) + (field.checkfield(minopos.x, minopos.y + 2) ? 1 : 0) + (field.checkfield(minopos.x + 2, minopos.y + 2) ? 1 : 0); return(cnt >= 3); }
public simpboard clone() { simpboard cp = new simpboard(); cp.field = (bool[, ])field.Clone(); cp.isb2b = isb2b; cp.combo = combo; cp.column_height = (int[])column_height.Clone(); if (piece != null) { cp.piece = piece.clone(); } if (holdpiece != null) { cp.holdpiece = holdpiece.clone(); } cp.isdead = isdead; cp.garbage_cnt = garbage_cnt; return(cp); }
public Tuple <int, int> lock_piece_calc(ref simpboard Board) { rule gamerule = defaultop.defrule; Board.piece.mino_lock(ref Board); bool isb2b = Board.isb2b; int row = Board.clear_full(); int atk = 0; if (Board.isperfectclear) { atk += 6; } if (Board.piece.Tspin) { atk += gamerule.GetTspindmg(row); } else { atk += gamerule.Getcleardmg(row); } atk += gamerule.Getrendmg(Board.combo); if (isb2b) { atk += gamerule.Getb2bdmg(row); } if (Board.piece.mini && row == 1) { atk -= 1; } // attack calu //if (Board.piece.isTspin()) //Board.cl //int clear return(new Tuple <int, int>(atk, row)); }
public int right_rotation(ref simpboard field) { int a = height, b = weight; int kick_try = 0; int[,] newfield = new int[a, b]; right_roll(ref newfield); for (int kick = 0; kick < kicktable.GetLength(1); ++kick) { if (!check_mino_ok(ref field, minopos.x + kicktable[stat, kick].y, minopos.y + kicktable[stat, kick].x, newfield)) { kick_try += 1; } else { minopos.x += kicktable[stat, kick].y; minopos.y += kicktable[stat, kick].x; break; } } if (kick_try > 4) { return(-1); } stat += 1; stat %= 4; for (int i = 0; i < a; ++i) { for (int j = 0; j < b; ++j) { minofield[i, j] = newfield[i, j]; } } spinlast = true; return(kick_try); }
public bool mino_lock(ref simpboard field) { if (!check_mino_ok(ref field, minopos)) { return(false); } soft_drop_floor(ref field); for (int i = 0; i < height; i++) { for (int j = weight - 1; j >= 0; --j) { if (minofield[j, i] != 0) { field.column_height[i + minopos.y] = Math.Max(field.column_height[i + minopos.y], minopos.x + j + 1); break; } } } spinstatupdate(ref field); for (int i = 0; i < height; ++i) { for (int j = 0; j < weight; ++j) { if (minofield[i, j] != 0) { field.field[i + minopos.x, j + minopos.y] = true; } } } locked = true; //if (minopos.x >= 20) return false; return(true); } // 不锁定判断tspin
static public List <mino> findalltslot(simpboard Board) { List <mino> allpos = new List <mino>(); bool[,,] visit = new bool[42, 12, 4]; bool[,,] visit1 = new bool[42, 12, 4]; Queue <mino_stat> minoque = new Queue <mino_stat>(); if (!Board.piece.check_mino_ok(ref Board, Board.piece.minopos)) { return(allpos); } minoque.Enqueue(new mino_stat(Board.piece.minopos, Board.piece.stat)); visit[Board.piece.minopos.x + 2, Board.piece.minopos.y + 2, Board.piece.stat] = true; mino_gene minogen = new mino_gene(); mino temp = Board.piece.clone(); while (minoque.Count != 0) { mino_stat node = minoque.Dequeue(); //visit[node.minoopos.x, node.minoopos.y, node.stat] = true; // 硬降 temp.setpos(node.minoopos); temp.setstat(node.stat); if (temp.left_rotation(ref Board) != -1) { if (!visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat]) { visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat] = true; minoque.Enqueue(new mino_stat(temp.minopos, temp.stat, node.idx, node.path, 2, node.movetime)); } } temp.setpos(node.minoopos); temp.setstat(node.stat); if (temp.right_rotation(ref Board) != -1) { if (!visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat]) { visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat] = true; minoque.Enqueue(new mino_stat(temp.minopos, temp.stat, node.idx, node.path, 3, node.movetime)); } } temp.setpos(node.minoopos); temp.setstat(node.stat); if (temp.left_move(ref Board)) { if (!visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat]) { visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat] = true; minoque.Enqueue(new mino_stat(temp.minopos, temp.stat, node.idx, node.path, 0, node.movetime)); } } temp.setpos(node.minoopos); temp.setstat(node.stat); if (temp.right_move(ref Board)) { if (!visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat]) { visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat] = true; minoque.Enqueue(new mino_stat(temp.minopos, temp.stat, node.idx, node.path, 1, node.movetime)); } } temp.setpos(node.minoopos); temp.setstat(node.stat); int dis = temp.soft_drop_floor(ref Board); //{ if (!visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat]) { visit[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat] = true; minoque.Enqueue(new mino_stat(temp.minopos, temp.stat, node.idx, node.path, -dis, node.movetime, repeat: dis)); } //} if (!visit1[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat]) { visit1[temp.minopos.x + 2, temp.minopos.y + 2, temp.stat] = true; mino fi = temp.clone(); fi.spinstatupdate(ref Board); fi.path = node; allpos.Add(fi); } //source.setpos } return(allpos); }