home *** CD-ROM | disk | FTP | other *** search
/ In'side Shareware 1995 March / ish0395.iso / os2 / musicmem / source / musicmem.cpp < prev    next >
C/C++ Source or Header  |  1994-12-30  |  5KB  |  242 lines

  1. #include "easy.h"
  2. #include "musicmem.h"
  3.  
  4. #include <time.h>
  5. #include <math.h>
  6.  
  7. Program program;
  8.  
  9. class MainWindow : public StandardWindow
  10. {   char Text[256];
  11.     public :
  12.     Flag Active;
  13.     MainWindow (int id, char *title) :
  14.         StandardWindow(id,title,
  15.             StandardWindow::normal_nosize|StandardWindow::menu|
  16.             StandardWindow::min),
  17.         Active(1)
  18.     {   strcpy(Text,String(5));
  19.         init();
  20.         size(300,350);
  21.         top();
  22.     }
  23.     virtual void redraw (PS &ps);
  24.     virtual void clicked (LONG x, LONG y, clicktype type);
  25.     void drawtext (PS &ps);
  26.     void settext (char *s);
  27. } window(ID_Window,String(1));
  28.  
  29. void MainWindow::drawtext (PS &ps)
  30. {    ps.move(0,300);
  31.     ps.backarea(300,50);
  32.     ps.move(150,325);
  33.     ps.text(Text,Colors::black,
  34.         Alignment::center,Alignment::middle);
  35. }
  36.  
  37. void MainWindow::settext (char *s)
  38. {    strcpy(Text,s);
  39.     WindowPS ps(*this);
  40.     drawtext(ps);
  41. }
  42.  
  43. Menu menu(window);
  44.  
  45. const int maxsize=512;
  46. double duration=0.5;
  47. int frequency[4]={220,294,330,440};
  48.  
  49. int arc[4][4]=
  50. {    155,155,0,90,
  51.     145,155,90,180,
  52.     145,145,180,270,
  53.     155,145,270,360
  54. };
  55.  
  56. LONG darkcol[4]={CLR_DARKRED,CLR_DARKGREEN,
  57.         CLR_DARKBLUE,CLR_BROWN},
  58.     lightcol[4]={CLR_RED,CLR_GREEN,CLR_BLUE,CLR_YELLOW};
  59.  
  60. void dark (PS &ps, int i)
  61. {    ps.filledpie(arc[i][0],arc[i][1],120,1,
  62.         arc[i][2],arc[i][3],CLR_WHITE,darkcol[i]);
  63. }
  64.  
  65. void light (PS &ps, int i)
  66. {    ps.filledpie(arc[i][0],arc[i][1],120,1,
  67.         arc[i][2],arc[i][3],CLR_WHITE,lightcol[i]);
  68. }
  69.  
  70. class Clickcheck // checks for double clicks
  71. {    int Last;
  72.     public :
  73.     Clickcheck () : Last(-1) {}
  74.     void reset () { Last=-1; }
  75.     int check (int i);
  76. } clickcheck;
  77.  
  78. int Clickcheck::check (int i)
  79. {    if (i==Last) return 0;
  80.     Last=i;
  81.     return 1;
  82. }
  83.  
  84. class Music
  85. {   int N[512];
  86.     int L,W;
  87.     Flag Mark;
  88.     public :
  89.     Music () : L(0),W(0),Mark(0) {}
  90.     void reset () { L=0; W=0; clickcheck.reset(); }
  91.     void add ();
  92.     void play (int i);
  93.     void play ();
  94.     int wait (int i);
  95.     int done () { return W>=L; }
  96.     int length () { return L; }
  97.     void mark ()
  98.     {    Mark.set();
  99.         window.Active.clear();
  100.         program.clear_messages();
  101.         window.Active.set();
  102.     }
  103.     int marking ();
  104.     int empty () { return L==0; }
  105. } music;
  106.  
  107. int Music::marking ()
  108. {    if (Mark)
  109.     {    Mark.clear();
  110.         play();
  111.         return 1;
  112.     }
  113.     return 0;
  114. }
  115.  
  116. int Music::wait (int i)
  117. {    int res=(N[W]==i);
  118.     W++;
  119.     return res;
  120. }
  121.  
  122. void Music::add ()
  123. {   if (L>=512) return;
  124.     do
  125.     {    N[L]=rand()%4;
  126.     } while (N[L]==N[L-1] && L>0);
  127.     L++;
  128.     W=0;
  129. }
  130.  
  131. void Music::play (int i)
  132. {    WindowPS ps(window);
  133.     dark(ps,i);
  134.     Beep(frequency[i],duration);
  135.     light(ps,i);
  136. }
  137.  
  138. void Music::play ()
  139. {    int i;
  140.     WindowPS ps(window);
  141.     for (i=0; i<L; i++)
  142.     {    dark(ps,N[i]);
  143.         Beep(frequency[N[i]],duration);
  144.         light(ps,N[i]);
  145.     }
  146.     W=0;
  147.     char text[256];
  148.     sprintf(text,String(6),L);
  149.     window.settext(text);
  150. }
  151.  
  152. void MainWindow::redraw (PS &ps)
  153. {    int i;
  154.     ps.erase();
  155.     ps.filledcircle(150,150,140,1,
  156.         CLR_BLACK,CLR_DARKGRAY);
  157.     for (i=0; i<4; i++) light(ps,i);
  158.     drawtext(ps);
  159. }
  160.  
  161. void MainWindow::clicked (LONG x, LONG y, clicktype type)
  162. {    if (type!=button1up || !window.Active) return;
  163.     if (music.empty())
  164.     {    music.add();
  165.         music.add();
  166.         music.play();
  167.         return;
  168.     }
  169.     if (music.marking()) return;
  170.     x-=150; y-=150;
  171.     if (abs(x)<5 || abs(y)<5) return;
  172.     if (x>0) x-=5;
  173.     else x+=5;
  174.     if (y<0) y-=5;
  175.     else y+=5;
  176.     if (sqrt((double)x*x+(double)y*y)>120) return;
  177.     int i;
  178.     if (x>0)
  179.         if (y>0) i=0; else i=3;
  180.     else
  181.         if (y<0) i=2; else i=1;
  182.     if (!clickcheck.check(i)) return;
  183.     if (music.wait(i))
  184.     {   if (music.done())
  185.         {   music.play(i);
  186.             window.settext(String(7));
  187.             music.add();
  188.             music.mark();
  189.             clickcheck.reset();
  190.         }
  191.         else music.play(i);
  192.     }
  193.     else
  194.     {    char msg[256];
  195.         sprintf(msg,String(2),music.length());
  196.         Message(msg,String(1),window);
  197.         music.play();
  198.         if (Question(String(3),String(1),window)
  199.                 ==Answers::no)
  200.             return;
  201.         music.reset();
  202.         music.add();
  203.         music.add();
  204.         window.settext(String(5));
  205.         music.mark();
  206.     }
  207. }
  208.  
  209. void doabort ()
  210. {    window.quit();
  211. }
  212.  
  213. void donewgame ()
  214. {    music.reset();
  215.     music.add();
  216.     music.add();
  217.     music.play();
  218. }
  219.  
  220. void dorepeat ()
  221. {    music.play();
  222. }
  223.  
  224. Help help(window,ID_Help,String(4),String(1));
  225.  
  226. void dohelp ()
  227. {    help.general();
  228. }
  229.  
  230. int main (int argc, char *argv[])
  231. {   if (argc==2) duration=atoi(argv[1])/1000;
  232.     time_t t;
  233.     srand(time(&t));
  234.     menu.add(IDM_Help,dohelp);
  235.     menu.add(IDM_Abort,doabort);
  236.     menu.add(IDM_NewGame,donewgame);
  237.     menu.add(IDM_Repeat,dorepeat);
  238.     program.loop();
  239.     return 0;
  240. }
  241.  
  242.