gliq.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:8k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*  
  2.  *  CS 453 - Final project : An OpenGL version of the pegboard game IQ
  3.  *  Due : June 5, 1997
  4.  *  Author : Kiri Wagstaff
  5.  *
  6.  *  File : gliq.c
  7.  *  Description : Main board display file.
  8.  *
  9.  *  5/22 : Displays the board selection screen, and uses keyboard
  10.  *  input to manipulate it and select.
  11.  *
  12.  */
  13. #include "gliq.h"
  14. /* globals */
  15. #if 0
  16. //GLuint cone;
  17. #endif
  18. int curstate;
  19. int mouse_state=-1;
  20. int mouse_button=-1;
  21. int pegs=0;
  22. int totalpegs=0;
  23. int lastpicked = 0;
  24. /* functions */
  25. void init(void);
  26. void reshape(int width, int height);
  27. void display(void);
  28. void special(int key, int x, int y);
  29. void keyboard(unsigned char key, int x, int y);
  30. void mouse(int button, int state, int x, int y);
  31. void motion(int x, int y);
  32. void idle(void);
  33. int main(int argc, char** argv)
  34. {
  35.   glutInit(&argc, argv);
  36.   glutInitWindowSize(512, 512);
  37.   glutInitWindowPosition(0, 0);
  38.   glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
  39.   glutCreateWindow("GLIQ");
  40.   
  41.   glutReshapeFunc(reshape);
  42.   glutDisplayFunc(display);
  43.   glutKeyboardFunc(keyboard);
  44.   glutSpecialFunc(special);
  45.   glutMouseFunc(mouse);
  46.   glutMotionFunc(motion);
  47.   glutPassiveMotionFunc(passive);
  48.   glutIdleFunc(idle);
  49.   
  50.   init();
  51.   
  52.   glutMainLoop();
  53.   return 0;
  54. }
  55. void init(void)
  56. {
  57.   int i, j;
  58.   /* lighting */
  59.   glEnable(GL_LIGHTING);
  60.   glEnable(GL_LIGHT0);
  61.   glEnable(GL_COLOR_MATERIAL);
  62.   glEnable(GL_DEPTH_TEST);
  63.   glDepthFunc(GL_LEQUAL);
  64.   /*  glEnable(GL_CULL_FACE);*/
  65.   /* put the identity in the trackball transform */
  66.   tbInit(GLUT_RIGHT_BUTTON);
  67.   glSelectBuffer(SELECT_BUFFER, select_buffer);
  68.   /* make the star cone */
  69.   /*  cone = glGenLists(1);  
  70.   glNewList(cone, GL_COMPILE);
  71.   glPushMatrix();
  72.   for (i=0; i<3; i++)
  73.     {
  74.       glRotatef(45.0, 1.0, 0.0, 0.0);
  75.       glutSolidCone(0.2, 2.0, 8, 8);
  76.     }
  77.   glPopMatrix();
  78.   glEndList();*/
  79.   /* Initialize the state */
  80.   for (i=0; i<BOARDSIZE; i++)
  81.     for (j=0; j<BOARDSIZE; j++)
  82.       filled[i][j] = UNUSED;
  83.   curstate = SELBOARD;
  84.   curboard = 0;
  85.   readboards();
  86.   readscores();
  87. }
  88. void reshape(int width, int height)
  89. {
  90.   GLfloat lightpos[4] = { 1.0, 1.0, 1.0, 1.0 };
  91.   tbReshape(width, height);
  92.   glViewport(0, 0, width, height);
  93.   
  94.   glMatrixMode(GL_PROJECTION);
  95.   glLoadIdentity();
  96.   gluPerspective(60.0, (GLfloat)height / (GLfloat)width, 1.0, 128.0);
  97.   glMatrixMode(GL_MODELVIEW);
  98.   glLoadIdentity();
  99.   glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  100.   glTranslatef(0.0, -2.0, -15.0);
  101. }
  102. void display(void)
  103. {
  104.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  105.   /* draw */
  106.   switch(curstate)
  107.     {
  108.     case SELBOARD:
  109.       selectboard();
  110.       break;
  111.     case PLAY:
  112.       playgame();
  113.       break;
  114.     case HIGHSC:
  115.       highscore();
  116.       break;
  117.     case VIEWSCORES:
  118.       showhighscores();
  119.       break;
  120.     default:
  121.       printf("Unknown state %d, exiting.n", curstate);
  122.       exit(1);
  123.     }
  124.   glutSwapBuffers();
  125. }
  126. /* ARGSUSED1 */
  127. void special(int key, int x, int y)
  128. {
  129.   switch (key) { 
  130.     case GLUT_KEY_UP:
  131.       break;
  132.     case GLUT_KEY_DOWN:
  133.       break;
  134.     case GLUT_KEY_RIGHT:
  135.       break;
  136.     case GLUT_KEY_LEFT:
  137.       break;
  138.  }
  139.   glutPostRedisplay();
  140. }
  141. /* ARGSUSED1 */
  142. void keyboard(unsigned char key, int x, int y)
  143. {
  144.   switch (key) {
  145.   case 'h':
  146.     printf("gliq helpnn");
  147.     printf("f            -  Filledn");
  148.     printf("w            -  Wireframen");
  149.     printf("s            -  See high scoresn");
  150.     printf("escape or q  -  Quitnn");
  151.     break;
  152.   case 'f':
  153.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  154.     break;
  155.   case 'w':
  156.     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  157.     break;
  158.   case 's':
  159.     curstate = VIEWSCORES;
  160.     glutIdleFunc(idlescore);
  161.     break;
  162.     
  163.   case 'q':
  164.   case 27:
  165.     exit(0);
  166.     break;
  167.   }
  168.   glutPostRedisplay();
  169. }
  170. void mouse(int button, int state, int x, int y)
  171. {
  172.   int i, j;
  173.   int mid=0;
  174.   
  175.   mouse_state = state;
  176.   mouse_button = button;
  177.   if (state == GLUT_DOWN && button==GLUT_LEFT_BUTTON)
  178.     switch(curstate)
  179.       {
  180.       case SELBOARD:
  181. switch(picked)
  182.   {
  183.   case NONE:
  184.     break;
  185.   case LEFTARR:
  186.     curboard--;
  187.     totalpegs = 0;
  188.     if (curboard<0)
  189.       curboard = numboards-1;
  190.     /* Set up filled array */
  191.     for (i=0; i<BOARDSIZE; i++)
  192.       for (j=0; j<BOARDSIZE; j++)
  193. {
  194.   filled[i][j] = boards[curboard][i][j];
  195.   if (filled[i][j] == FULL)
  196.     totalpegs++;
  197. }
  198.     break;     
  199.   case SELECT:
  200.     totalpegs = 0;
  201.     /* Set up filled array */
  202.     for (i=0; i<BOARDSIZE; i++)
  203.       for (j=0; j<BOARDSIZE; j++)
  204. {
  205.   filled[i][j] = boards[curboard][i][j];
  206.   if (filled[i][j] == FULL)
  207.     totalpegs++;
  208. }
  209.     curstate = PLAY;
  210.     playdone = 0;
  211.     pegs = totalpegs;
  212.     glutIdleFunc(NULL);
  213.     break;
  214.   case RIGHTARR:
  215.     curboard++;
  216.     totalpegs = 0;
  217.     if (curboard>=numboards)
  218.       curboard = 0;
  219.     /* Set up filled array */
  220.     for (i=0; i<BOARDSIZE; i++)
  221.       for (j=0; j<BOARDSIZE; j++)
  222. {
  223.   filled[i][j] = boards[curboard][i][j];
  224.   if (filled[i][j] == FULL)
  225.     totalpegs++;
  226. }
  227.     break;
  228.   case QUIT:
  229.     exit(0);
  230.   default:
  231.     printf("picked is %d.n", picked);
  232.   }
  233. break;
  234.       case PLAY:
  235. #if 0
  236. // printf("picked is %dn", picked);
  237. #endif
  238. if (picked == 0)
  239.   break;
  240. if (picked == QUIT)
  241.   {
  242.     if (pegs < minscore || (pegs==minscore && totalpegs > minpegs))
  243.       {
  244. curstate = HIGHSC;
  245. numentered = 0;
  246. written = 0;
  247. glutKeyboardFunc(keyscores);
  248. glutIdleFunc(idlescore);
  249. break;
  250.       }
  251.     curstate = SELBOARD;
  252.     glutIdleFunc(idle);
  253.     totalpegs = 0;
  254.     for (i=0; i<BOARDSIZE; i++)
  255.       for (j=0; j<BOARDSIZE; j++)
  256. {
  257.   filled[i][j] = boards[curboard][i][j];
  258.   if (filled[i][j] == FULL)
  259.     totalpegs++;
  260. }
  261.     break;
  262.   }
  263. if (filled[(picked-1)/BOARDSIZE][(picked-1)%BOARDSIZE] == FULL)
  264.   {
  265.     if (canmove(picked))
  266.       filled[(picked-1)/BOARDSIZE][(picked-1)%BOARDSIZE] = CANMOVE;
  267.     else
  268.       {
  269. filled[(picked-1)/BOARDSIZE][(picked-1)%BOARDSIZE] = CANTMOVE;
  270. #if 0
  271. Beep(1000, 40);
  272. PlaySound("SPR_OUCH.WAV", NULL, SND_FILENAME);
  273. #endif
  274.       }
  275.     lastpicked = picked;
  276.   }
  277. else
  278.   lastpicked = 0;
  279. break;
  280.       case HIGHSC:
  281. if (written)
  282.   {
  283.     curstate = VIEWSCORES;
  284.     glutKeyboardFunc(NULL);
  285.     glutIdleFunc(idlescore);
  286.   }
  287. break;
  288.       case VIEWSCORES:
  289. curstate = SELBOARD;
  290. glutKeyboardFunc(keyboard);
  291. glutIdleFunc(idle);
  292. totalpegs = 0;
  293. for (i=0; i<BOARDSIZE; i++)
  294.   for (j=0; j<BOARDSIZE; j++)
  295.     {
  296.       filled[i][j] = boards[curboard][i][j];
  297.       if (filled[i][j] == FULL)
  298. totalpegs++;
  299.     }
  300. break;
  301.       default:
  302. printf("Unknown state %d, exiting.n", curstate);
  303. exit(1);
  304.       }
  305.   /* Release a button, reset the array */
  306.   else if (state==GLUT_UP && button==GLUT_LEFT_BUTTON)
  307.     switch (curstate)
  308.       {
  309.       case SELBOARD:
  310. break;
  311.       case PLAY:
  312. if (picked <= 0)
  313.   break;
  314. if ((mid = legalmove()))
  315.   {
  316. #if 0
  317.     //     printf("Erasing (%d,%d).", (mid-1)/BOARDSIZE, (mid-1)%BOARDSIZE);
  318. #endif
  319.     filled[(lastpicked-1)/BOARDSIZE][(lastpicked-1)%BOARDSIZE] = EMPTY;
  320.     filled[(mid-1)/BOARDSIZE][(mid-1)%BOARDSIZE] = EMPTY;
  321.     filled[(picked-1)/BOARDSIZE][(picked-1)%BOARDSIZE] = FULL;
  322.     pegs--;
  323.     /* Check for any legal moves left */
  324.     if (!movesexist())
  325.       {
  326. /* Display score & "no moves left" */
  327. printf("No moves remaining.  You finished with %d pegs left.n",
  328.        pegs);
  329. playdone = 1;
  330. #if 0
  331. // exit(0);
  332. #endif
  333.       }
  334.   }
  335. else if (lastpicked != 0)
  336.   filled[(lastpicked-1)/BOARDSIZE][(lastpicked-1)%BOARDSIZE] = FULL;
  337. break;
  338.       case HIGHSC:
  339. break;
  340.       case VIEWSCORES:
  341. break;
  342.       default:
  343. printf("Unknown state %d, exiting.n", curstate);
  344. exit(1);
  345.       }
  346.   else
  347.     tbMouse(button, state, x, y);
  348. #if 0
  349.   else if (state == GLUT_DOWN && button == GLUT_RIGHT_BUTTON)
  350.     tbStartMotion(x, y, button, glutGet(GLUT_ELAPSED_TIME));
  351.   else if (state == GLUT_UP && button == GLUT_RIGHT_BUTTON)
  352.     tbStopMotion(button, glutGet(GLUT_ELAPSED_TIME));
  353. #endif
  354.   glutPostRedisplay();
  355. }
  356. void motion(int x, int y)
  357. {
  358.   tbMotion(x, y);
  359.   if (mouse_button == GLUT_LEFT_BUTTON)
  360.     picked = pick(x,y);
  361.   
  362.   glutPostRedisplay();
  363. }
  364. void idle(void)
  365. {
  366.   display();
  367. }
  368.