Yvision.kzYvision.kz
kk
Разное
Разное
399 773 постов41 подписчиков
Всяко-разно
0
08:45, 04 августа 2013

Понг своими руками

Доброго времени суток! В прошлый раз мы нашли все необходимые формулы  для реализации простой версии игры Понг. Сегодня мы ее реализуем на знакомом нам Turbo C++ под DOS (пора бы уже закончить с этим недоразумением и перейти на нормальную платформу).

Важным шагом в развитии  технологий программирования было появление объектно-ориентированного программирования. Это позволило оперировать не просто процедурами и функциями, а целыми классами.

Класс – совокупность свойств, методов и событий. Объект – это экземпляр класса. С помощью класса описывается сущность, с которой нужно работать. У каждого класса обязательно присутствуют два метода: «создать объект» и «уничтожить объект». Во время создания объекта происходит выделение памяти для хранения необходимых свойств и заполняются значения по умолчанию. Во время уничтожения объекта происходит освобождение выделенной памяти. Метод для создания объекта называется конструктором, а для уничтожения – деструктором. Сам процесс создания объекта называется инициализацией. Создадим класс для игры Понг и назовем его Ball:

 
  1. class Ball
  2. {
  3. public:
  4. // объявляем конструктор и деструктор
  5. Ball();
  6. ~Ball();
  7. // объявляем методы
  8. double ContactX();
  9. double ContactY();
  10. double Bat();
  11. // объявляем события
  12. double Move();
  13. double Move2();
  14. // объявляем свойства
  15. double x1,x2,x11,x12;
  16. double y1,y2,y11,y12;
  17. double alpha,t0,vx,vy;
  18. int x,y,a,b;
  19. int go;
  20. int pos;
  21. int t,score;
  22. };

Сохраним это в отдельный библиотечный файл и назовем его Ball.h

Blog post image

Свойства – это переменные, которые влияют на состояние класса. Например,  радиус или диаметр мяча, его позиция, цвет.

Методы – это те же процедуры и функции, т.е. это то, что класс умеет делать (вычислять). Например, в нашем случае класс имеет функции расчета отражения мяча при соударении со стенкой или ракеткой. Эти функции и есть методы, которые принадлежат классу.

  1. double Ball::ContactX()
  2. {
  3. alpha=x1/9;
  4. if((x1<630)&&(pos!=1)&&(pos!=2)){
  5. if(x1>320) alpha=alpha-320/9;
  6. if(y1==470) y2=10;
  7. if(y1==10) y2=470;
  8. x2=(((y1+y2)+(x1/tan(alpha*3.14/180)))/(x1/tan(alpha*3.14/180)))*x1;
  9. if(go==1) x2=x2-320;}
  10. if(pos==1){
  11. if(y1>240){
  12. x2=640-(((y1/tan(alpha*3.14/180)))/(y1/tan(alpha*3.14/180)))*y1;
  13. y2=470;}
  14. else{ y2=10;
  15. x2=320-(((y1/tan(alpha*3.14/180)))/(y1/tan(alpha*3.14/180)))*y1;}
  16. pos=0;}
  17. if(pos==2){
  18. if(y1>240){
  19. x2=640-(((y1/tan(alpha*3.14/180)))/(y1/tan(alpha*3.14/180)))*y1;
  20. y2=470;}
  21. else{ y2=10;
  22. x2=320-(((y1/tan(alpha*3.14/180)))/(y1/tan(alpha*3.14/180)))*y1;}
  23. pos=0;}
  24. if(x2>=630){x2=629;ContactY();
  25. pos=1;go=1;}
  26. if(x2<=10){x2=11;ContactY();
  27. pos=2;go=0;}
  28. return x2;
  29. }
  30. double Ball::ContactY()
  31. {
  32. int B=x2/tan(alpha*3.14/180);
  33. if(y1==10)
  34. y2=B-(B/(630/x1));
  35. if(y1==470) y2=470-(B-(B/(630/x1)));
  36. if((y1!=10)&&(y1!=470))
  37. y2=B-(B/(630/x1));
  38. return y2;
  39. }

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

Все эти свойства, методы и события опишем в отдельном файле и назовем его ball2.cpp

Теперь опишем файл, из которого будет вызываться сама игра:

  1. // указатель класса
  2. Ball* o1;
  3. // создаём объект и получаем на него указатель
  4. o1 =new Ball();
  5. // заполняем свойства объекта
  6. o1->x1=420;
  7. o1->y1=10;
  8. o1->go=1;
  9. o1->pos=0;
  10. o1->t=0;
  11. int key;
  12. do{
  13. if(o1->t==0){o1->ContactX();
  14. o1->Move();}
  15. o1->Move2();
  16. if(o1->t>=o1->t0){ o1->t=0;
  17. o1->y1=o1->y2;o1->x1=o1->x2;}
  18. if(kbhit()) key=getch();
  19. }while(key!=27);
  20. // разрушаем объект
  21. delete o1;
  22. o1=0;
  23. closegraph();
  24. return0;
  25. }

Для заданного типа o1, тип Ball* является «указателем на o1». Это означает, что переменные типа Ball* содержат объектов типа T. На этом всё. В следующий раз мы добавим игру против компьютера , а пока можете скачать исходники!

0
483
0