Загрузка данных


Да. У тебя уже есть почти всё необходимое: gameOver, player1, player2, shape.Position, left.Position, right.Position. Самый простой вариант — сделать прямоугольную кнопку «RESTART», которая появляется после окончания игры и при клике запускает игру заново.
1. Создай кнопку рядом с остальными объектами
После:
bool gameOver = false;
добавь:
RectangleShape restartButton = new RectangleShape(new Vector2f(200, 60));
restartButton.Position = new Vector2f(300, 400);
restartButton.FillColor = Color.Red;

Font buttonFont = new Font("Fonts/arial.ttf");
Text restartText = new Text("RESTART", buttonFont, 30);
restartText.Position = new Vector2f(335, 412);
restartText.FillColor = Color.White;
Координаты можешь потом поменять.


⸻


2. Сделай сброс игры
Перед while (window.IsOpen()) добавь:
void RestartGame()
{
    player1 = 0;
    player2 = 0;

    shape.Position = new Vector2f(400, 300);

    left.Position = new Vector2f(20, 200);
    right.Position = new Vector2f(760, 200);

    ballSpeed = 200f;
    shapeSpeed = 500f;

    gameOver = false;
}
Но: если RestartGame() вставить прямо внутрь Main, C# так не позволит в обычной структуре метода. Поэтому лучше сделать отдельный метод внутри класса Program, но вне Main.
То есть внизу у тебя уже есть:
private static bool collides(...)
{
    ...
}
Вот перед collides можно сделать:
private static void RestartGame(
    ref int player1,
    ref int player2,
    ref bool gameOver,
    ref CircleShape shape,
    ref RectangleShape left,
    ref RectangleShape right,
    ref float ballSpeed)
{
    player1 = 0;
    player2 = 0;

    shape.Position = new Vector2f(400, 300);

    left.Position = new Vector2f(20, 200);
    right.Position = new Vector2f(760, 200);

    ballSpeed = 200f;

    gameOver = false;
}
Но это уже выглядит громоздко.
Я бы для твоего проекта сделал ещё проще: отдельный кусок сброса прямо в Main, без отдельного метода.


⸻


3. Проверка клика по кнопке
Внутри твоего:
while (window.IsOpen())
{
добавь обработку мыши:
if (gameOver)
{
    if (Mouse.IsButtonPressed(Mouse.Button.Left))
    {
        Vector2f mousePos = new Vector2f(
            Mouse.GetPosition(window).X,
            Mouse.GetPosition(window).Y
        );

        if (restartButton.GetGlobalBounds().Contains(mousePos.X, mousePos.Y))
        {
            player1 = 0;
            player2 = 0;

            shape.Position = new Vector2f(400, 300);

            left.Position = new Vector2f(20, 200);
            right.Position = new Vector2f(760, 200);

            ballSpeed = 200f;

            gameOver = false;
        }
    }
}


⸻


4. Нарисовать кнопку
У тебя в конце сейчас примерно:
window.Clear();

window.Draw(text);
window.Draw(shape);
window.Draw(left);
window.Draw(right);

window.Display();
Перед window.Display(); добавь:
if (gameOver)
{
    window.Draw(restartButton);
    window.Draw(restartText);
}
Получится:
window.Clear();

window.Draw(text);
window.Draw(shape);
window.Draw(left);
window.Draw(right);

if (gameOver)
{
    window.Draw(restartButton);
    window.Draw(restartText);
}

window.Display();
В итоге логика такая
Игра
 ↓
кто-то набрал 10
 ↓
gameOver = true
 ↓
появляется RESTART
 ↓
клик мышкой
 ↓
счёт = 0
мяч возвращается в центр
ракетки возвращаются
gameOver = false
 ↓
игра снова начинается
Если хочешь именно по твоему коду с фотографий, я могу прямо взять твою текущую структуру и показать куда конкретно вставить 5–10 строк, не переделывая весь Pong.