• 8833
  • 4
  • 1
Нравится блог?
Подписывайтесь!

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

Привет всем! В прошлый раз мы сделали рабочую версию игры 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 октав, каждая из которых имеет своё название. Список октав и частоты нот в них вы можете посмотреть в википедии. Приведем несколько расчетов частоты звука. Например, нам нужна нота До из контроктавы, Ре из первой октавы и Ми из пятой.

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

 
  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);

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

Для начала пересохраним то, что мы с делали в прошлый раз, с расширением *.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. И если рядом нет друга, и играть с самим с собой уже наскучило , то на помощь придет Искусственный Интеллект. Продолжение следует…

13 мая 2013, 15:01
968

Загрузка...
Loading...

Комментарии

Верните RVVA !!!!!! Крутая графа у нее. Почему вы забросили ее?!
Я не имею отношения к RVVA. Этим занимались Nuligine - nuligine.yvision.kz

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

Школа High Tech High – дети здесь самостоятельны так же, как и профессионалы в офисах

Школа High Tech High – дети здесь самостоятельны так же, как и профессионалы в офисах

Известный казахстанский бизнесмен становится первопроходцем и создает школу, о которой можно только мечтать. То, что мы, как взрослые, делаем в бизнесе, дети будут делать в этой школе.
Zhumanova
24 апр. 2017 / 16:29
  • 20151
  • 5
Как выбрать новостройку в Алматы: инсайты, критерии и личный опыт

Как выбрать новостройку в Алматы: инсайты, критерии и личный опыт

Я прекрасно понимаю тех, кто долго ищет подходящую квартиру - сама искала, потратила на поиск 1,5 года. Что, прежде всего, повлияло на мой выбор при покупке квартиры в новостройке Алматы?
Zhumanova
21 апр. 2017 / 10:04
  • 3832
  • 12
«Третья мировая война начнётся в мае 2017 года» – провидец из Португалии

«Третья мировая война начнётся в мае 2017 года» – провидец из Португалии

Провидец из Португалии по имени Горацио Вильегас считает, что новая мировая война состоится уже в текущем году. Считается, что португалец два года назад объявил, что Трамп станет президентом.
Seattle
21 апр. 2017 / 15:33
  • 3735
  • 13
Кому в Казахстане жить хорошо? Почему мы остаёмся в топ-5 стран мира по числу самоубийств

Кому в Казахстане жить хорошо? Почему мы остаёмся в топ-5 стран мира по числу самоубийств

Всё ли так хорошо у жителей Казахстана? Почему-то наша страна сохраняет твёрдые позиции в первых строчках мировых рейтингов по числу самоубийств.
openqazaqstan
24 апр. 2017 / 16:54
  • 3318
  • 19
«А ты покушала?» или Как завоевать сердце женщины простой заботой

«А ты покушала?» или Как завоевать сердце женщины простой заботой

Так как опыт хождения по свиданиям у меня немаленький, да и с интуицией давно дружу, я быстро отсеиваю тех, с кем будут проблемы. Как я это определяю? Очень просто.
Bonittta
22 апр. 2017 / 14:10
Каждую ночь я жду его. Почти каждую ночь он оправдывает мои ожидания

Каждую ночь я жду его. Почти каждую ночь он оправдывает мои ожидания

Каждую ночь я жду его. Такая уж у него работа, он приходит поздно. Но почти каждую ночь он оправдывает мои ожидания. Когда его долго нет, признаюсь, я начинаю нервничать. Названивать и писать смс-ки...
DominaOmnium
21 апр. 2017 / 2:25
  • 2486
  • 12
Юный алматинец покорил Первый канал на шоу Максима Галкина

Юный алматинец покорил Первый канал на шоу Максима Галкина

Житель Алматы по имени Марк Усачев недавно оказался на телепрограмме "Лучше всех", с успехом идущей на Первом канале России. 9-летний алматинец покорил публику своими недюжинными знаниями.
Seattle
24 апр. 2017 / 16:59
  • 2078
  • 2
«Казпочта» отжигает. Редкий шанс вспомнить агрессивные советские очереди

«Казпочта» отжигает. Редкий шанс вспомнить агрессивные советские очереди

Люди старшего и среднего поколений помнят шумные, недобрые, грубо ругающиеся очереди советских лет. Увидеть, как это было, можно теперь разве что в каком-нибудь фильме. Хотя не только.
openqazaqstan
вчера / 16:14
  • 1916
  • 20
Паводок в Атбасаре глазами блогера

Паводок в Атбасаре глазами блогера

Ситуация в населенном пункте непростая, много домов подтопило, по сравнению с 2014-м годом уровень воды поднялся намного выше. Жители держатся молодцом.
kokshetau_today
21 апр. 2017 / 14:17
  • 2003
  • 8