Страница 2 из 2

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

Добавлено: 28 мар 2008, 09:17
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);
Вот основной список процедур, каждая из них проста в выполнении - их композиция делает код читабельным, понятным, простым в работе и разборе. Вы без труда сможете поменять правила игры, поведение шарика, отрисовку объектов не перелопачивая весь код.

Re: .

Добавлено: 28 мар 2008, 11:14
Хыиуду
BBB писал(а):Это, наверное, "очень круто" (и вообще не стоит усложнять :) ), но если еще и учитывать скорость движения ракетки в момент удара? На практике за счет сцепления шарика с поверхностью ракетки движение ракетки будет придавать некоторый импульс шарику.
А можно сделать так, что ракетка при движении наклоняется в сторону движения. Тогда и сохраняется принцип "угол падения равен углу отражения", и релизуется ваша идея.

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

Добавлено: 28 мар 2008, 13:24
icq-client
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);
Вот основной список процедур, каждая из них проста в выполнении - их композиция делает код читабельным, понятным, простым в работе и разборе. Вы без труда сможете поменять правила игры, поведение шарика, отрисовку объектов не перелопачивая весь код.
спасиба буду въезжать)))) не моглибы аську включить вдруг какие вопросы появятся???

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

Добавлено: 28 мар 2008, 18:56
Medved
&quot писал(а):А можно взять за основу принцип арканоида
Это даже надо сделать, если ракетки всегда перпендикулярны столу. Иначе шарик будет до бесконечности ходить вверх-вниз пока кто-то не уберёт ракетку. Или как вариант можно сделать ракетки дугами ) | ( но тогда тяжелей считать угол отражения.Либо ещё как вариант чтоб ракетки вращать можно было. Но управление сложней становится, а для двух человек и подавно.

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

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