Привет всем! В прошлый раз мы сделали рабочую версию игры 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.Диапазон применимых в музыке звуков разбит на 9 октав, каждая из которых имеет своё название. Список октав и частоты нот в них вы можете посмотреть в википедии. Приведем несколько расчетов частоты звука. Например, нам нужна нота До из контроктавы, Ре из первой октавы и Ми из пятой.
Код проигрыша этих нот:
-
#include <dos.h>
-
int main() {
-
sound(32.703); delay(300); nosound();delay(300);
-
sound(293.665); delay(300); nosound();delay(300);
-
sound(5274); delay(300); nosound();}
Вот нечто похожее на фрагмент из «Собачьего вальса»:
-
sound(293.7);delay(200);nosound();delay(0);
-
sound(261.7);delay(200);nosound();delay(0);
-
sound(174.6);delay(200);nosound();delay(150);
-
sound(349.2);delay(200);nosound();delay(100);
-
sound(349.2);delay(200);nosound();delay(150);
-
sound(293.7);delay(200);nosound();delay(0);
-
sound(261.7);delay(200);nosound();delay(0);
-
sound(174.6);delay(200);nosound();delay(150);
-
sound(349.2);delay(200);nosound();delay(100);
-
sound(349.2);delay(200);nosound();delay(100);
-
sound(293.7);delay(200);nosound();delay(0);
-
sound(261.7);delay(200);nosound();delay(0);
-
sound(174.6);delay(200);nosound();delay(150);
-
sound(349.2);delay(200);nosound();delay(150);
-
sound(220);delay(200);nosound();delay(150);
-
sound(349.2);delay(200);nosound();delay(100);
-
sound(349.2);delay(200);nosound();delay(200);
-
sound(293.7);delay(200);nosound();delay(0);
-
sound(261.7);delay(200);nosound();delay(0);
-
sound(130);delay(150);nosound();delay(200);
-
sound(349.2);delay(150);nosound();delay(200);
-
sound(349.2);delay(150);nosound();delay(200);
-
sound(293.7);delay(200);nosound();delay(0);
-
sound(261.7);delay(200);nosound();delay(0);
-
sound(130);delay(200);nosound();delay(200);
-
sound(349.2);delay(150);nosound();delay(200);
-
sound(349.2);delay(150);nosound();delay(200);
-
sound(293.7);delay(200);nosound();delay(0);
-
sound(261.7);delay(200);nosound();delay(150);
-
sound(146);delay(200);nosound();delay(150);
-
sound(349.2);delay(200);nosound();delay(200);
-
sound(164.8);delay(200);nosound();delay(150);
-
sound(349.2);delay(200);nosound();delay(200);
-
sound(174.6);delay(200);nosound();delay(150);
-
sound(349.2);delay(200);nosound();delay(200);
-
sound(349.2);delay(200);nosound();delay(200);
При желании можно сделать «музыкальный инструмент», т.е. чтобы при нажатии клавиши издавался звук. Но проблема будет в том, что нельзя заставить динамик проигрывать две и более нот одновременно. Теперь добавим к нашей игре меню.
Для начала пересохраним то, что мы с делали в прошлый раз, с расширением *.h. Подключим этот файл к нашей новой работе:
-
#include "oxo.h"
Обратите внимание на то, что заголовочный файл взят не в стандартные < >, а в кавычки. Это значит, что он будет подключаться из текущего каталога.
Далее опишем функции, которые нам понадобятся:
-
void check2(int x, int y)
-
{
-
bar(x,y,x+10,y+5);//выводим закрашенный квадратик, с помощью которого мы будем перемещаться по нашему меню
-
}
-
void step2(int y)//функция выполнения задач, в зависимости от выбранного пункта меню
-
{
-
if(y==129) closegraph();//если нажат выход, то закрываем программу
-
if(y==114){start=1;main2();}//иначе запускаем главную функцию из заголовочного файла «oxo.h», т.е. саму игру
-
}
-
void menu(int x,int y){//вывод самого меню
-
settextjustify(CENTER_TEXT, CENTER_TEXT);//устанавливаем отображение текста по центру
-
settextstyle(DEFAULT_FONT,HORIZ_DIR,10);//настраиваем стили текста
-
setcolor(2);//цвет
-
outtextxy(x,y-25,"OXO");//надпись
-
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
-
setcolor(6);
-
outtextxy(x,y+30,"1 player");//пункты меню
-
outtextxy(x,y+45,"2 players");
-
outtextxy(x,y+60,"Exit");
-
setfillstyle(1,7);//задаём стиль заполнения нашего указателя в меню
-
}
И как подобает игровому меню, добавим какую-нибудь короткую мелодию при его появлении:
-
a[0]=330; a[1]=80; a[2]=330;
-
a[3]=140; a[4]=430; a[5]=100;
-
a[6]=410; a[7]=160; a[8]=490;
-
a[9]=160; a[10]=450; a[11]=200;
-
a[12]=490; a[13]=220;
-
delay(1000);
-
for(i=0;i<14;i++){
-
sound(a[i]);delay(200);}
-
delay(200);
-
nosound();
Этот код должен быть прописан в главной функции – int main(void). Все исходные материалы, а также exe-шник вы можете скачать здесь.
Как вы, возможно, заметили, у нас работает только два пункта меню – выход и 2 players. И если рядом нет друга, и играть с самим с собой уже наскучило , то на помощь придет Искусственный Интеллект. Продолжение следует…