public void NewGame(Dictionary <List <long>, Rectangle> inits, int moment = 0) { foreach (var pair in inits) { var i = random.Next(pair.Value.Left, pair.Value.Right); var j = random.Next(pair.Value.Top, pair.Value.Bottom); var value = pair.Key[random.Next(0, pair.Key.Count)]; TargetMovement.Appear(i, j, value, moment); } }
public void Generate(List <long> type, Rectangle area, int moment = 1) { var target = type[random.Next(0, type.Count)]; var p = new List <Point>(); for (var i = area.Left; i <= area.Right; i++) { for (var j = area.Top; j <= area.Bottom; j++) { if (TargetCore[i, j] == Core.None) { p.Add(new Point(i, j)); } } } if (p.Count == 0) { return; } var point = p[random.Next(0, p.Count)]; TargetMovement.Appear(point.X, point.Y, target, moment); }
protected Core Move(int x_move, int y_move, int x_start, int y_start, int step_x_move, int step_y_move) { // 初始化 var answer = new Core(TargetCore); var record = new Core(TargetCore.GameSize); if (x_start < 0) { x_start += answer.Width; } if (y_start < 0) { y_start += answer.Height; } var during_step_x_move = -x_move; var during_step_y_move = -y_move; var x = x_start; var y = y_start; // 逐行/逐列处理 while (answer[x_start, y_start] != Core.OutOfRange) { x = x_start; y = y_start; while (answer[x, y] != Core.OutOfRange) { if (answer[x, y] != Core.None && answer[x, y] != Core.BackGround) { var now_number = answer[x, y]; // 取目标单元移动位置 var to = answer.LatestBlock(x, y, x_move, y_move); var to_number = answer[to.X, to.Y]; if (to_number == now_number) { // 合并 answer.Execute(TargetMovement.Move(x, y, to.X, to.Y)); answer.Execute(TargetMovement.Appear(to.X, to.Y, 2 * to_number, 1)); TargetCore.ToAddScore += Math.Abs(to_number * 2); record[to.X, to.Y] = answer[to.X, to.Y]; // 记录 answer[to.X, to.Y] = Core.BackGround; // 此位置已行动 } else if (to_number + now_number == 0) { // 湮灭 answer.Execute(TargetMovement.Move(x, y, to.X, to.Y)); answer.Execute(TargetMovement.Disappear(to.X, to.Y, 1)); TargetCore.ToAddScore += Math.Abs(to_number * 4); record[to.X, to.Y] = Core.WillDelete; // 记录 answer[to.X, to.Y] = Core.BackGround; // 此位置已行动 } else { // 反方向检查 var predict = answer.LatestBlock(x, y, -x_move, -y_move); var predict_number = answer[predict.X, predict.Y]; // 如果反方向上已经存在了一个负值,那么停止 if (predict_number + now_number == 0) { goto while_out; } // 移动 to.Offset(-x_move, -y_move); answer.Execute(TargetMovement.Move(x, y, to.X, to.Y)); } } while_out: x += during_step_x_move; y += during_step_y_move; } x_start += step_x_move; y_start += step_y_move; } return(answer.AddFrom(record)); }