PongGame - шар пролетает сквозь ракетки

Проблема описана в заголовке. Я написал следующую функцию для обработки столкновения шарика с ракеткой (в классе Ball.cs):

public bool IsCollideWithPaddle()
        {
            if (X == pad1.X + 1)
            {
                return (Y >= pad1.Y - pad1.Length / 2) && (Y <= pad1.Y + pad1.Length / 2);
            }
            else if (X == pad2.X - 1)
            {
                return (Y >= pad2.Y - pad2.Length / 2) && (Y <= pad2.Y + pad2.Length / 2);
            }
            else return false;
        }

Но не было бы вопроса, будь она рабочей. Шарик просто пролетает сквозь ракетку. Причём, если возвращать true, если по координате X шарик совпадает с ракеткой, то отражение от всей этой вертикальной плоскости будет работать. То есть проблема заключается именно в логике этой функции, но я не могу понять где я ошибся. Вот все файлы игры:

Ball.cs

namespace Ping_Pong
{
    class Ball
    {
        public int X { get; set; }
        public int Y { get; set; }
        public int SpeedX { get; set; }
        public int SpeedY { get; set; }
        public int BotBorder { get; set; }
        public int RightBorder { get; set; }
        public Paddle pad1 { get; set; }
        public Paddle pad2 { get; set; }

        public Ball(int width, int height, Paddle p1, Paddle p2)
        {
            X = width / 2;
            Y = height / 2;
            SpeedX = -1;
            SpeedY = -1;
            BotBorder = height;
            RightBorder = width;
            pad1 = p1;
            pad2 = p2;
        }
        public void Erase()
        {
            Console.BackgroundColor = ConsoleColor.Black;
            Console.SetCursorPosition(X - SpeedX, Y - SpeedY);
            Console.Write(" ");
            Console.SetCursorPosition(X, Y);
        }
        public void Draw()
        {
            Console.BackgroundColor = ConsoleColor.White;
            Console.SetCursorPosition(X, Y);
            Console.Write(" ");
            Console.BackgroundColor = ConsoleColor.Black;
            Erase();
        }
        public void Move()
        {
            if (IsCollideWithBorder()) { SpeedY = -SpeedY; }
            if (IsCollideWithPaddle()) { SpeedX = -SpeedX; }
            X += SpeedX;
            Y += SpeedY;
            Draw();
            Thread.Sleep(100);
        }
        public bool IsCollideWithBorder()
        { if (Y <= 0 || Y >= BotBorder) return true; else return false; }
        public bool IsCollideWithPaddle()
        {
            if (X == pad1.X + 1)
            {
                return (Y >= pad1.Y - pad1.Length / 2) && (Y <= pad1.Y + pad1.Length / 2);
            }
            else if (X == pad2.X - 1)
            {
                return (Y >= pad2.Y - pad2.Length / 2) && (Y <= pad2.Y + pad2.Length / 2);
            }
            else return false;
        }
    }
}

Board.cs

    class Board
    {
        public int Height { get; set; }
        public int Width { get; set; }
        public Board(int h = 20, int w = 60)
        { Height = h; Width = w; }
        public void CreateWindow()
        {
            Console.CursorVisible = false;
            Console.WindowHeight = Height + 1;
            Console.WindowWidth = Width + 1;

            Console.BufferHeight = Console.WindowHeight;
            Console.BufferWidth = Console.WindowWidth;
        }
    }
}

Paddle.cs

namespace Ping_Pong
{
    class Paddle
    {
        int boardHeight;
        public int X { get; set; }
        public int Y { get; set; }
        public int Length { get; set; }

        public Paddle(int x, int Height) // x - position, Height - b1.Height
        {
            this.boardHeight = Height;
            X = x;
            Y = Height / 2 + 6;
            Length = 5;
        }

        [DllImport("user32.dll")]
        static extern ushort GetAsyncKeyState(int vKey);
        public bool IsKeyPushed(ConsoleKey vKey)
        { return 0 != (GetAsyncKeyState((int)vKey) & 0x8000); }

        public void Draw()
        {
            Console.BackgroundColor = ConsoleColor.White;
            for (int i = Y - (Length / 2); i <= (Y + Length / 2); i++)
            {
                Console.SetCursorPosition(X, Y + i);
                Console.Write(" ");
            }
            Console.SetCursorPosition(X, Y + Length);
            Console.BackgroundColor = ConsoleColor.Black;
        }
        public void Erase()
        {
            Console.BackgroundColor = ConsoleColor.Black;
            for (int i = Y - (Length / 2); i <= (Y + Length / 2); i++)
            {
                Console.SetCursorPosition(X, Y + i);
                Console.Write(" ");
            }
            Console.SetCursorPosition(X, Y + Length);
        }
        public void Move(ConsoleKey Up, ConsoleKey Down)
        {
            Console.ReadKey(true);
            if (IsKeyPushed(Up))
            { 
                if (Y >= 2)
                {
                    Erase();
                    Y--;
                    Draw();
                } 
            }
            if (IsKeyPushed(Down))
            { 
                if (Y <= boardHeight * 2 + 3)
                {
                    Erase();
                    Y++;
                    Draw();
                } 
            }
            if (IsKeyPushed(ConsoleKey.Escape))
            { Environment.Exit(0); }
        }
    }
}

Game.cs

namespace Ping_Pong
{
    class Game
    {
        private const int BoardHeight = 30;
        private const int BoardLength = 100;
        public Board b;
        public Paddle p1;
        public Paddle p2;
        public Ball ball;
        public int countLeft;
        public int countRight;
        public Game()
        {
            b = new Board(BoardHeight, BoardLength);
            p1 = new Paddle(2, 5);
            p2 = new Paddle(BoardLength - 2, 5);
            ball = new Ball(BoardLength, BoardHeight, p1, p2);
            countLeft = 0;
            countRight = 0;
        }
        // метод для обновления карты (потом пригодится)
        public void Init()
        {
            b = new Board(BoardHeight, BoardLength);
            p1 = new Paddle(2, 5);
            p2 = new Paddle(BoardLength - 2, 5);
            ball = new Ball(BoardLength, BoardHeight, p1, p2);
        }
        public void Run()
        {
            b.CreateWindow();
            p1.Draw();
            p2.Draw();
            ball.Draw();
            while (true)
            {
                ball.Move();
                p1.Move(ConsoleKey.W, ConsoleKey.S);
                p2.Move(ConsoleKey.UpArrow, ConsoleKey.DownArrow);
                Thread.Sleep(10);
            }
        }
    }
}

Program.cs

namespace Ping_Pong
{
    class Program
    {
        static void Main(string[] args)
        {
            Game game = new Game();
            game.Run();
        }
    }
}

Ошибка по всей видимости кроется в методе Draw(), либо Move() класса Ball, но я не могу понять в чём именно там ошибка.


Ответы (0 шт):