Exemplo n.º 1
0
        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);
        }