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

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 : game.c
  7.  *  Description : All the routines to actually play the game.
  8.  *  
  9.  */
  10. #include "gliq.h"
  11. int playdone=0;
  12. void playgame(void);
  13. void drawquit(float x, float y, float r1, float r2);
  14. int legalmove(void);
  15. int canmove(int peg);
  16. int movesexist(void);
  17. void playgame(void)
  18. {
  19.   int height = glutGet(GLUT_WINDOW_HEIGHT);
  20.   int width = glutGet(GLUT_WINDOW_WIDTH);
  21.   /* Draw the quit button */
  22.   drawquit(7.0, 9.0, 0.4, 1.0);
  23.   /* Quit */
  24. #if 0
  25.   //  glColor3f(1.0, 1.0, 1.0);  /* white */
  26.   //  text(0.78*width, 0.88*height, 0.1*height, "Quit");
  27. #endif
  28.   
  29.   /* Draw the current scores */
  30.   /* Draw the total # of pegs */
  31.   glPushMatrix();
  32.     glColor3f(1.0, 1.0, 0.0);     /* yellow */
  33.     glTranslatef(-7.8, 8.8, 0.0);
  34.     drawpeg();
  35.     text(0.1*width, 0.9*height, 0.07*height, ": %02d", pegs);
  36.   glPopMatrix();
  37.   if (playdone)
  38.     text(0.2*glutGet(GLUT_WINDOW_WIDTH),
  39.  0.75*glutGet(GLUT_WINDOW_HEIGHT),
  40.  0.08*glutGet(GLUT_WINDOW_HEIGHT),
  41.  "No moves left.");
  42.   /* do the trackball rotation. */
  43.   glPushMatrix();
  44.   glRotatef(45.0, 1.0, 0.0, 0.0);
  45.   tbMatrix();
  46.   drawboard();
  47.   drawpegs();
  48.   glPopMatrix();
  49. }
  50. int canmove(int peg)
  51. {
  52.   int i, j;
  53.   if (peg == 0)
  54.     return 0;
  55.   
  56.   i = (peg-1)/BOARDSIZE;
  57.   j = (peg-1)%BOARDSIZE;
  58.   
  59.   if ((i-2>0) && (filled[i-1][j]==FULL) && (filled[i-2][j]==EMPTY))
  60.     return 1;
  61.   else if ((i+2<BOARDSIZE) &&
  62.    (filled[i+1][j]==FULL) && (filled[i+2][j]==EMPTY))
  63.     return 1;
  64.   else if ((j-2>0) && (filled[i][j-1]==FULL) && (filled[i][j-2]==EMPTY))
  65.     return 1;
  66.   else if ((j+2<BOARDSIZE) &&
  67.    (filled[i][j+1]==FULL) && (filled[i][j+2]==EMPTY))
  68.     return 1;
  69.   else
  70.     return 0;
  71.   
  72. }
  73. /** returns 0 if not a legal move;
  74.  ** returns the index of the middle (jumped) peg if it was legal
  75.  ** (1 to BOARDSIZE*BOARDSIZE)
  76.  **/
  77. int legalmove(void)
  78. {
  79.   int lasti, lastj;
  80.   int i, j;
  81.   if (lastpicked == 0)
  82.     return 0;
  83.   
  84.   lasti = (lastpicked-1)/BOARDSIZE;
  85.   lastj = (lastpicked-1)%BOARDSIZE;
  86.   i = (picked-1)/BOARDSIZE;
  87.   j = (picked-1)%BOARDSIZE;
  88. #if 0
  89.   //  printf("Jumping from (%d,%d) to (%d,%d)n", lasti, lastj, i, j);
  90. #endif
  91.   
  92.   if (filled[lasti][lastj] == CANMOVE && filled[i][j] == EMPTY)
  93.     if (lasti==i+2)
  94.       return (i+1)*BOARDSIZE+(j)+1;  /* i+1, +1 to get the name right */
  95.     else if (lasti==i-2)
  96.       return (i-1)*BOARDSIZE+(j)+1;  /* i-1, +1 */
  97.     else if (lastj==j+2)
  98.       return (i)*BOARDSIZE+(j+1)+1;  /* j+1, +1 */
  99.     else if (lastj==j-2)
  100.       return (i)*BOARDSIZE+(j-1)+1;  /* j-1, +1 */
  101.     else
  102.       return 0;
  103.   return 0;
  104. }
  105. /* Checks for any legal moves remaining */
  106. int movesexist(void)
  107. {
  108.   int i, j, peg;
  109.   
  110.   for (peg=1; peg<=BOARDSIZE*BOARDSIZE; peg++)
  111.     {
  112.       i = (peg-1)/BOARDSIZE;
  113.       j = (peg-1)%BOARDSIZE;
  114.       if (filled[i][j] == FULL && canmove(peg))
  115. return 1;
  116.     }
  117.   return 0;
  118. }
  119. void drawquit(float x, float y, float r1, float r2)
  120. {
  121.   GLUquadricObj* stick;
  122.   glLoadName(QUIT);
  123. #if 0
  124.   //glDisable(GL_LIGHTING);
  125. #endif
  126.   glColor3f(1.0, 0.0, 0.0);  /* red */
  127. #if 0
  128.   //glRectf(x, y, x+w, y+h);
  129.   //glEnable(GL_LIGHTING);
  130. #endif
  131.   glPushMatrix();
  132.     glTranslatef(x, y, 0.0);
  133.     glPushMatrix();
  134.       stick = gluNewQuadric();
  135.       glRotatef(90, 0.0, 1.0, 0.0);
  136.       glRotatef(45, 1.0, 0.0, 0.0);
  137.       glTranslatef(0.0, 0.0, r2-1.5*r1);
  138.       gluQuadricDrawStyle(stick, GLU_FILL);
  139.       gluQuadricNormals(stick, GLU_SMOOTH);
  140.       gluCylinder(stick, 0.85*r1, 0.85*r1, 3*r1, 8, 1); 
  141.       gluDeleteQuadric(stick);
  142.     /*    glutSolidCone(rad, len, 8, 8);*/
  143.   glPopMatrix();
  144.   glRotatef(22.5, 0.0, 0.0, 1.0);
  145.   glutSolidTorus(r1, r2, 8, 8);
  146.   glPopMatrix();
  147.     
  148.   glLoadName(0);
  149. }