ПИНГ-ПОНГ НА ПАСКАЛЕ

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Пока вы не разберете программу на отдельные части и блоки, у вас врядли что получиться. Движение шарика - это изменение его координат во времени - вам нужна хоть какая то синхронизация. Если называется процедура "движение", то она должна выполнять изменение координат шарика за единицу времени, которую вы определите заранее. В эту процедуру не должны входить проверки нажатия клавиш, всякие графические работы и пр. Попробуйте сначала навести порядок в самой программе, потому что потом будет ж... и уже никто кроме вас самих не сможет помочь.
Для более простой и быстрой разработки программы, а также для простоты ее модификации желательно определить ракетку и шарик хотя бы в виде записей (Record).
Тогда для шарика имеем:

Код: Выделить всё

TBall = record
 X : Single;
 Y : Single;
 V : Single;
 Angle : Single;
end;
Почему там стоит Single? Потому что при низкой скорости шарика (V < 1) в одной из осей - его координаты не поменяются, т.к. dx или dy < 1, а координаты шарика - целые числа.
Для прямоугольной ракетки зададим в качестве координат его левый верхний угол.

Код: Выделить всё

TRacket = record
 X : Integer;
 Y : Integer;
 Width : Integer;
 Height : Integer;
end;
Т.к. игроков два, то и ракеток тоже. Поэтому в коде должны присутствовать две переменные этого типа. Теперь вам надо внедрить это описание в свою программу и сделать хотя бы процедуру инициализации и отрисовки ракетки. В качестве параметров передается сама ракетка. Все расчеты потом будут выполнятся через функции, параметрами которых будут шарик и (или) ракетка. Гибкость программы - очень важный фактор.

Код: Выделить всё

function InitRacket(Player : Byte) : TRacket;
procedure DrawRacket(R : TRacket);
procedure BallMoving(B : TBall);
procedure DrawBall(B : TBall);
function CheckForCollision(B:TBall;R:TRacket):Boolean;
procedure CalcCollisionPhysics(B:TBall;R:TRacket);
function CheckForWallsCollision(B:TBall):Boolean;
procedure CalcWallsCollisionPhysics(B:TBall);
Вот основной список процедур, каждая из них проста в выполнении - их композиция делает код читабельным, понятным, простым в работе и разборе. Вы без труда сможете поменять правила игры, поведение шарика, отрисовку объектов не перелопачивая весь код.
It's a long way to the top if you wanna rock'n'roll
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

BBB писал(а):Это, наверное, "очень круто" (и вообще не стоит усложнять :) ), но если еще и учитывать скорость движения ракетки в момент удара? На практике за счет сцепления шарика с поверхностью ракетки движение ракетки будет придавать некоторый импульс шарику.
А можно сделать так, что ракетка при движении наклоняется в сторону движения. Тогда и сохраняется принцип "угол падения равен углу отражения", и релизуется ваша идея.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
icq-client
Сообщения: 5
Зарегистрирован: 25 мар 2008, 19:07

somewhere писал(а):Пока вы не разберете программу на отдельные части и блоки, у вас врядли что получиться. Движение шарика - это изменение его координат во времени - вам нужна хоть какая то синхронизация. Если называется процедура "движение", то она должна выполнять изменение координат шарика за единицу времени, которую вы определите заранее. В эту процедуру не должны входить проверки нажатия клавиш, всякие графические работы и пр. Попробуйте сначала навести порядок в самой программе, потому что потом будет ж... и уже никто кроме вас самих не сможет помочь.
Для более простой и быстрой разработки программы, а также для простоты ее модификации желательно определить ракетку и шарик хотя бы в виде записей (Record).
Тогда для шарика имеем:

Код: Выделить всё

TBall = record
 X : Single;
 Y : Single;
 V : Single;
 Angle : Single;
end;
Почему там стоит Single? Потому что при низкой скорости шарика (V < 1) в одной из осей - его координаты не поменяются, т.к. dx или dy < 1, а координаты шарика - целые числа.
Для прямоугольной ракетки зададим в качестве координат его левый верхний угол.

Код: Выделить всё

TRacket = record
 X : Integer;
 Y : Integer;
 Width : Integer;
 Height : Integer;
end;
Т.к. игроков два, то и ракеток тоже. Поэтому в коде должны присутствовать две переменные этого типа. Теперь вам надо внедрить это описание в свою программу и сделать хотя бы процедуру инициализации и отрисовки ракетки. В качестве параметров передается сама ракетка. Все расчеты потом будут выполнятся через функции, параметрами которых будут шарик и (или) ракетка. Гибкость программы - очень важный фактор.

Код: Выделить всё

function InitRacket(Player : Byte) : TRacket;
procedure DrawRacket(R : TRacket);
procedure BallMoving(B : TBall);
procedure DrawBall(B : TBall);
function CheckForCollision(B:TBall;R:TRacket):Boolean;
procedure CalcCollisionPhysics(B:TBall;R:TRacket);
function CheckForWallsCollision(B:TBall):Boolean;
procedure CalcWallsCollisionPhysics(B:TBall);
Вот основной список процедур, каждая из них проста в выполнении - их композиция делает код читабельным, понятным, простым в работе и разборе. Вы без труда сможете поменять правила игры, поведение шарика, отрисовку объектов не перелопачивая весь код.
спасиба буду въезжать)))) не моглибы аську включить вдруг какие вопросы появятся???
Medved
Сообщения: 256
Зарегистрирован: 14 фев 2008, 20:51
Контактная информация:

&quot писал(а):А можно взять за основу принцип арканоида
Это даже надо сделать, если ракетки всегда перпендикулярны столу. Иначе шарик будет до бесконечности ходить вверх-вниз пока кто-то не уберёт ракетку. Или как вариант можно сделать ракетки дугами ) | ( но тогда тяжелей считать угол отражения.Либо ещё как вариант чтоб ракетки вращать можно было. Но управление сложней становится, а для двух человек и подавно.
Ваши руки совершили идиотскую ошибку и будут оторваны!
[OK]
sasha3050
Сообщения: 26
Зарегистрирован: 04 окт 2008, 23:13

Пожалуйста помогите очень нужно!!!!!!!!!Написать программу на Paskal, которая вычисляет среднюю длину слов в файле, который содержит текст.В данном случае будет считатьтся любая строка символов, которая начинается и заканчивается одним с следующих елеметов: пробел, запятая, точка, начало строки и конец строки.В программе должна быть обозначена функция, которая получает в качестве аргумента поток ввода с файла.
Ответить