Yvision.kz
kk
Разное
Разное
399 773 постов42 подписчика
Всяко-разно
0
03:01, 13 мая 2013

«Крестики-нолики». Меню и звук.

Привет всем! В прошлый раз мы сделали рабочую версию игры OXO («Крестики-нолики»). Сегодня мы добавим к ней стандартное меню (1 игрок, 2 игрока, выход) и звуковое оформление. Со звука, пожалуй, и начнем.

Управление звуковым устройством компьютера (в данном случае системным динамиком; если вы используете DosBox, то он будет эмулировать звук системного динамика через любое звуковое устройство) осуществляется последовательностью следующих операторов:

Sound(F) - включение звука с частотой тона F (измеряется в герцах);
Delay(N) - задержка выполнения программы на N миллисекунд;
NoSound - выключение звука.

Для программирования мелодии удобно применять известную формулу расчета частоты звука:

F=Round(440*Exp(Ln(2)*(No-(10-Nn)/12))),
где No - номер октавы  -4<= No <=4;  для основной октавы No=0;
Nn - номер ноты   1 - До,   2 - До#,   3 - Ре,  и т. д.  12 - Cи;
при сквозной нумерации нот принять для No<0 - Nn<1,  для No>0 - Nn>12.

Blog post image

Диапазон применимых в музыке звуков разбит на 9 октав, каждая из которых имеет своё название. Список октав и частоты нот в них вы можете посмотреть в википедии. Приведем несколько расчетов частоты звука. Например, нам нужна нота До из контроктавы, Ре из первой октавы и Ми из пятой.

Blog post image

Код проигрыша этих нот:

 
  1. #include <dos.h>
  2. int main() {
  3. sound(32.703); delay(300); nosound();delay(300);
  4. sound(293.665); delay(300); nosound();delay(300);
  5. sound(5274); delay(300); nosound();}

Вот нечто похожее на фрагмент из «Собачьего вальса»:

  1. sound(293.7);delay(200);nosound();delay(0);
  2. sound(261.7);delay(200);nosound();delay(0);
  3. sound(174.6);delay(200);nosound();delay(150);
  4. sound(349.2);delay(200);nosound();delay(100);
  5. sound(349.2);delay(200);nosound();delay(150);
  6. sound(293.7);delay(200);nosound();delay(0);
  7. sound(261.7);delay(200);nosound();delay(0);
  8. sound(174.6);delay(200);nosound();delay(150);
  9. sound(349.2);delay(200);nosound();delay(100);
  10. sound(349.2);delay(200);nosound();delay(100);
  11. sound(293.7);delay(200);nosound();delay(0);
  12. sound(261.7);delay(200);nosound();delay(0);
  13. sound(174.6);delay(200);nosound();delay(150);
  14. sound(349.2);delay(200);nosound();delay(150);
  15. sound(220);delay(200);nosound();delay(150);
  16. sound(349.2);delay(200);nosound();delay(100);
  17. sound(349.2);delay(200);nosound();delay(200);
  18. sound(293.7);delay(200);nosound();delay(0);
  19. sound(261.7);delay(200);nosound();delay(0);
  20. sound(130);delay(150);nosound();delay(200);
  21. sound(349.2);delay(150);nosound();delay(200);
  22. sound(349.2);delay(150);nosound();delay(200);
  23. sound(293.7);delay(200);nosound();delay(0);
  24. sound(261.7);delay(200);nosound();delay(0);
  25. sound(130);delay(200);nosound();delay(200);
  26. sound(349.2);delay(150);nosound();delay(200);
  27. sound(349.2);delay(150);nosound();delay(200);
  28. sound(293.7);delay(200);nosound();delay(0);
  29. sound(261.7);delay(200);nosound();delay(150);
  30. sound(146);delay(200);nosound();delay(150);
  31. sound(349.2);delay(200);nosound();delay(200);
  32. sound(164.8);delay(200);nosound();delay(150);
  33. sound(349.2);delay(200);nosound();delay(200);
  34. sound(174.6);delay(200);nosound();delay(150);
  35. sound(349.2);delay(200);nosound();delay(200);
  36. sound(349.2);delay(200);nosound();delay(200);

При желании можно сделать «музыкальный инструмент», т.е. чтобы при нажатии клавиши издавался звук. Но проблема будет в том, что нельзя заставить динамик проигрывать две и более нот одновременно. Теперь добавим к нашей игре меню.

Blog post image

Для начала пересохраним то, что мы с делали в прошлый раз, с расширением *.h. Подключим этот файл к нашей новой работе:

  1. #include "oxo.h"

Обратите внимание на то, что заголовочный файл взят не в стандартные < >, а в кавычки. Это значит, что он будет подключаться из текущего каталога.

Далее опишем функции, которые нам понадобятся:

  1. void check2(int x, int y)
  2. {
  3. bar(x,y,x+10,y+5);//выводим закрашенный квадратик, с помощью которого мы будем перемещаться по нашему меню
  4. }
  5. void step2(int y)//функция выполнения задач, в зависимости от выбранного пункта меню
  6. {
  7. if(y==129) closegraph();//если нажат выход, то закрываем программу
  8. if(y==114){start=1;main2();}//иначе запускаем главную функцию из заголовочного файла «oxo.h», т.е. саму игру
  9. }
  10. void menu(int x,int y){//вывод самого меню
  11. settextjustify(CENTER_TEXT, CENTER_TEXT);//устанавливаем отображение текста по центру
  12. settextstyle(DEFAULT_FONT,HORIZ_DIR,10);//настраиваем стили текста
  13. setcolor(2);//цвет
  14. outtextxy(x,y-25,"OXO");//надпись
  15. settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
  16. setcolor(6);
  17. outtextxy(x,y+30,"1 player");//пункты меню
  18. outtextxy(x,y+45,"2 players");
  19. outtextxy(x,y+60,"Exit");
  20. setfillstyle(1,7);//задаём стиль заполнения нашего указателя в меню
  21. }

И как подобает игровому меню, добавим какую-нибудь короткую мелодию при его появлении:

  1. a[0]=330; a[1]=80; a[2]=330;
  2. a[3]=140; a[4]=430; a[5]=100;
  3. a[6]=410; a[7]=160; a[8]=490;
  4. a[9]=160; a[10]=450; a[11]=200;
  5. a[12]=490; a[13]=220;
  6. delay(1000);
  7. for(i=0;i<14;i++){
  8. sound(a[i]);delay(200);}
  9. delay(200);
  10. nosound();

Этот код должен быть прописан в главной функции – int main(void). Все исходные материалы, а также exe-шник вы можете скачать здесь.

Как вы, возможно, заметили, у нас работает только два пункта меню – выход и 2 players. И если рядом нет друга, и играть с самим с собой уже наскучило Blog post image, то на помощь придет Искусственный Интеллект. Продолжение следует…

0
1130
2