public int AIshootcheck(double fromX, double fromY, double toX, double toY) { // Lấy góc địa điểm hiện tại của tank so với tọa độ (x, y). double angle = GetAngle(fromX, fromY, toX, toY); if (angle.Equals(double.NaN)) { return(2); } // Độ chính xác trong khi check. const int checkingAccuracy = 64; Point checkingSquare = Point.Zero; Vector2 offset = Vector2.Zero; int i = 1; int Allyflag = 0, Enemyflag = 0, Wallflag = 0; // Check cho đến khi ô đang check trùng với ô đích. while (checkingSquare != Map.GetSquareAtPixel(new Vector2((float)toX, (float)toY)) && checkingSquare.X >= 0 && checkingSquare.Y >= 0 && checkingSquare.X < Map.MapWidth && checkingSquare.Y < Map.MapHeight) { // Tính tọa độ của ô sắp check offset.X = i * checkingAccuracy * (float)Math.Cos(angle); offset.Y = i * checkingAccuracy * (float)Math.Sin(angle); i++; checkingSquare = Map.GetSquareAtPixel(this.CurrentWorldPosition + offset); // Đọc dữ liệu của ô. // [0,0] chứa thông tin địa hình. // [1,0] chứa sự tồn tại của người chơi. // [2,0] và [3,0] chứa sự tồn tại của Enemy. ([3,0] để dự // phòng trường hợp xấu nhất có 2 Enemy Tanks trong cùng // một ô) if (Map.IsWallTile(checkingSquare)) { // Return sự hiện diện của người chơi, tránh trường hợp // người chơi lợi dụng đứng trong tường và bắn ra. if (Map.IsOccupiedByPlayer(checkingSquare)) { Enemyflag = 1; break; } Wallflag = 1; break; } if (Map.IsOccupiedByEnemy(checkingSquare)) { Allyflag = 1; } if (Map.IsOccupiedByPlayer(checkingSquare)) { Enemyflag = 1; break; } } if (Wallflag == 1) { return(1); } else if (Enemyflag == 1) { if (Allyflag == 1) { return(3); } else { return(2); } } return(0); }