board.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 : board.c
  7.  *  Description : Contains the board readin and selection functions.
  8.  *
  9.  *  
  10.  */
  11. #include "gliq.h"
  12. /* functions */
  13. void selectboard(void);
  14. void readboards(void);
  15. void drawboard(void);
  16. void drawpegs(void); /* Draw all the pegs */
  17. void drawpeg(void);  /* Draw one peg */
  18. void displaybuttons(void);
  19. /* globals */
  20. int numboards, curboard;
  21. int*** boards;
  22. int filled[BOARDSIZE][BOARDSIZE]; /* Current state of the pegs */
  23. /* Define the board */
  24. GLfloat vertices[8*3] = { 
  25.   -5.0,0.0,5.0, 
  26.   5.0,0.0,5.0,
  27.   5.0,0.5,5.0,
  28.   -5.0,0.5,5.0,
  29.   -5.0,0.0,-5.0,
  30.   5.0,0.0,-5.0,
  31.   5.0,0.5,-5.0,
  32.   -5.0,0.5,-5.0
  33. };
  34. GLuint faces[6*4] = { 
  35.   0,1,2,3, /*front*/
  36.   0,3,7,4, /*left*/ 
  37.   0,4,5,1, /*bottom*/
  38.   1,5,6,2, /*right*/
  39.   3,2,6,7, /*top*/
  40.   4,7,6,5  /*back*/
  41. };
  42. GLfloat normals[6*3] = {
  43.    0.0,  0.0,  1.0,
  44.   -1.0,  0.0,  0.0,
  45.    0.0, -1.0,  0.0,
  46.    1.0,  0.0,  0.0,
  47.    0.0,  1.0,  0.0,
  48.    0.0,  0.0, -1.0,
  49. };
  50. void selectboard(void)
  51. {
  52.   int height=glutGet(GLUT_WINDOW_HEIGHT);
  53.   int width=glutGet(GLUT_WINDOW_WIDTH);
  54.   static float spin=0.0;
  55.   /* Eventually make it spin */
  56.   /* Display the buttons */
  57.   displaybuttons();
  58.   /* Draw the quit button */
  59.   drawquit(7.0, 9.0, 0.4, 1.0);
  60.   /* Quit */
  61.   glColor3f(1.0, 1.0, 1.0);  /* white */
  62.   /*  text(0.78*width, 0.89*height, 0.1*height, "Quit"); */
  63.   /* Select message */
  64.   glColor3f(0.0, 1.0, 0.0);
  65.   text(0.3*width, 0.9*height, 0.07*height, "Select a board");
  66.   /* Draw the total # of pegs */
  67.   glPushMatrix();
  68.     glColor3f(1.0, 1.0, 0.0);     /* yellow */
  69.     glTranslatef(-7.8, 8.8, 0.0);
  70.     drawpeg();
  71.     text(0.1*width, 0.9*height, 0.07*height, ": %02d", totalpegs);
  72.   glPopMatrix();
  73.   
  74.   /* do the trackball rotation. */
  75.   glPushMatrix();
  76.   /*    tbMatrix(); */
  77.     glRotatef(45.0, 1.0, 0.0, 0.0);
  78.     glRotatef(spin, 0.0, 1.0, 0.0);
  79.     drawboard();
  80.     drawpegs();
  81.   glPopMatrix();
  82.   spin++;
  83. }
  84. void readboards(void)
  85. {
  86.   int i, j, hole;
  87.   FILE* fp;
  88.   /* Read in the boards */
  89.   fp = fopen("boards.txt", "r");
  90.   if (!fp)
  91.     {
  92.       printf("Could not open boards.txt, exiting.n");
  93.       exit(1);
  94.     }
  95.   fscanf(fp, "%d", &numboards);
  96.   boards = (int***)malloc(numboards*sizeof(int**));
  97.   for (i=0; i<numboards; i++)
  98.     {
  99.       boards[i] = (int**)malloc(BOARDSIZE*sizeof(int*));
  100.       for (j=0; j<BOARDSIZE; j++)
  101. boards[i][j] = (int*)malloc(BOARDSIZE*sizeof(int));
  102.     }
  103.   for (i=0; i<numboards; i++)
  104.     for (j=0; j<BOARDSIZE*BOARDSIZE; j++)
  105.       {
  106. fscanf(fp, "%d", &hole);
  107. boards[i][j/BOARDSIZE][j%BOARDSIZE] = hole;
  108.       }
  109.   totalpegs = 0;
  110.   /* Set up filled array */
  111.   for (i=0; i<BOARDSIZE; i++)
  112.     for (j=0; j<BOARDSIZE; j++) 
  113.       {
  114. filled[i][j] = boards[curboard][i][j];
  115. if (filled[i][j] == FULL)
  116.   totalpegs++;
  117.       }
  118.   if (numboards == 1)
  119.     {
  120.       curboard = 0;
  121.       pegs = totalpegs;
  122.       curstate = PLAY;
  123.     }
  124. }
  125. void drawboard(void)
  126. {
  127.   int i, j;
  128.   GLUquadricObj* hole;
  129.   /* Draw the board */
  130.   glColor3f(0.3, 0.3, 1.0);  /* Blue */
  131.   glShadeModel(GL_FLAT);
  132.   glBegin(GL_QUADS);
  133.   for (i=0; i<6; i++) 
  134.     {
  135.       glNormal3fv(&normals[3*i]);
  136.       for (j=0; j<4; j++) 
  137. glVertex3fv(&vertices[3*faces[i*4 + j]]);
  138.     }
  139.   glEnd();
  140.   /* Draw holes */
  141.   glShadeModel(GL_SMOOTH);
  142.   /*  glColor3f(0.0, 0.0, 0.0); */
  143.   glPushMatrix();
  144.   glTranslatef(-4.0, 0.51, -4.0);
  145.   for (i=0; i<BOARDSIZE; i++)
  146.     {
  147.       glPushMatrix();
  148.       for (j=0; j<BOARDSIZE; j++)
  149. {
  150.   if (filled[i][j] == UNUSED)
  151.     {
  152.       glTranslatef(1.0, 0.0, 0.0);
  153.       continue;
  154.     }
  155.   glColor3f(0.3, 0.3, 1.0);  /* Blue */
  156.   glPushMatrix();
  157.     glRotatef(-90.0, 1.0, 0.0, 0.0);
  158.     hole = gluNewQuadric();
  159.     gluQuadricDrawStyle(hole, GLU_FILL);
  160.     gluQuadricNormals(hole, GLU_SMOOTH);
  161.     gluCylinder(hole, 0.3, 0.3, 0.5, 8, 1); 
  162.     gluDeleteQuadric(hole);
  163.   glPopMatrix();
  164.   glTranslatef(1.0, 0.0, 0.0);
  165. }
  166.       glPopMatrix();
  167.       glTranslatef(0.0, 0.0, 1.0);
  168.     }
  169.   glPopMatrix();
  170. }
  171. void drawpegs(void)
  172. {
  173.   int i, j;
  174.   int name = 0;
  175.   
  176.   /* Draw pegs */
  177.   glShadeModel(GL_SMOOTH);
  178.   glColor3f(1.0, 1.0, 0.0);  /* Yellow */
  179.   glPushMatrix();
  180.     glTranslatef(-4.0, 0.51, -4.0);
  181.     for (i=0; i<BOARDSIZE; i++)
  182.       {
  183. glPushMatrix();
  184. for (j=0; j<BOARDSIZE; j++)
  185.   {
  186.     name++;
  187.     switch (filled[i][j])
  188.       {
  189.       case EMPTY:
  190. glLoadName(name);
  191. glDepthMask(GL_FALSE);
  192. glEnable(GL_BLEND);
  193. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  194. glColor4f(1.0, 1.0, 0.0, 0.0);  /* Invisible */
  195. drawpeg();
  196. glDisable(GL_BLEND);
  197. glDepthMask(GL_TRUE);
  198. break;
  199.       case UNUSED:
  200. glTranslatef(1.0, 0.0, 0.0);
  201. continue;
  202.       case FULL:
  203. glLoadName(name);
  204. glColor3f(1.0, 1.0, 0.0);  /* Yellow */
  205. if (picked == name)
  206.   glColor3f(1.0, 0.5, 0.0); /* Orange */
  207. drawpeg();
  208. break;
  209.       case CANMOVE:
  210. glLoadName(name);
  211. glColor3f(0.0, 1.0, 0.0); /* Green */
  212. drawpeg();
  213. break;
  214.       case CANTMOVE:
  215. glLoadName(name);
  216. glColor3f(1.0, 0.0, 0.0); /* Red */
  217. drawpeg();
  218. break;
  219.       default:
  220. printf("Unknown peg value %d, exiting.", filled[i][j]);
  221. exit(1);
  222.       }
  223.     glTranslatef(1.0, 0.0, 0.0);
  224.   }
  225. glPopMatrix();
  226. glTranslatef(0.0, 0.0, 1.0);
  227.       }
  228.   glPopMatrix();
  229. }
  230. void drawpeg(void)
  231. {
  232.   float ang=-90.0;
  233.   float radcyl=0.25;
  234.   float radball=0.4;
  235.   float len=0.8;
  236.   static GLuint peg=0;
  237.   GLUquadricObj* stick;
  238.   /* Generate the displaylist on the first call */ 
  239.   if (peg) 
  240.     {
  241.       glCallList(peg);
  242.       return;
  243.     }
  244.   peg = glGenLists(1);
  245.   glNewList(peg, GL_COMPILE_AND_EXECUTE);
  246.   /* Draw the ball */
  247.   glPushMatrix();
  248.     glTranslatef(0.0, len+(radball/2), 0.0);
  249.     glutSolidSphere(radball, 8, 8);
  250.   glPopMatrix();
  251.   /* Draw the cone (stick) */
  252.   /*  glColor3f(1.0, 1.0, 0.0);  Yellow */
  253.   stick = gluNewQuadric();
  254.   glPushMatrix();
  255.     glRotatef(ang, 1.0, 0.0, 0.0);
  256.     gluQuadricDrawStyle(stick, GLU_FILL);
  257.     gluQuadricNormals(stick, GLU_SMOOTH);
  258.     gluCylinder(stick, radcyl, radcyl, len, 8, 1); 
  259.     gluDeleteQuadric(stick);
  260.     /*    glutSolidCone(rad, len, 8, 8);*/
  261.   glPopMatrix();
  262.   glEndList();
  263. }
  264. void displaybuttons(void)
  265. {
  266.   GLUquadricObj* stick;
  267.   /* Previous*/
  268.   glPushMatrix();
  269.     glLoadName(LEFTARR);
  270.     if (picked == LEFTARR)
  271.       glColor3f(1.0, 1.0, 1.0);  /* white */
  272.     else
  273.       glColor3f(0.0, 1.0, 0.0);  /* green */
  274.     glTranslatef(-5.0, 6.5, -2.0);
  275.     glRotatef(-90.0, 0.0, 1.0, 0.0);
  276.     glutSolidCone(1.5, 3.0, 8, 8);
  277.     glTranslatef(0.0, 0.0, -2.0);
  278.     stick = gluNewQuadric();
  279.     gluQuadricDrawStyle(stick, GLU_FILL);
  280.     gluQuadricNormals(stick, GLU_SMOOTH);
  281.     gluCylinder(stick, 1.0, 1.0, 2.0, 8, 1); 
  282.     gluDeleteQuadric(stick);
  283.   glPopMatrix();
  284.   /* Select */
  285.   glPushMatrix();
  286.     glLoadName(SELECT);
  287.     if (picked == SELECT)
  288.       glColor3f(1.0, 1.0, 1.0);  /* white */
  289.     else
  290.       glColor3f(0.0, 1.0, 0.0);  /* green */
  291.     glTranslatef(0.0, 6.5, -2.0);
  292.     glutSolidCube(2.5);
  293.   glPopMatrix();
  294.   /* Next */
  295.   glPushMatrix();
  296.     glLoadName(RIGHTARR);
  297.     if (picked == RIGHTARR)
  298.       glColor3f(1.0, 1.0, 1.0);  /* white */
  299.     else
  300.       glColor3f(0.0, 1.0, 0.0);  /* green */
  301.     glTranslatef(5.0, 6.5, -2.0);
  302.     glRotatef(90.0, 0.0, 1.0, 0.0);
  303.     glutSolidCone(1.5, 3.0, 8, 8);
  304.     glTranslatef(0.0, 0.0, -2.0);
  305.     stick = gluNewQuadric();
  306.     gluQuadricDrawStyle(stick, GLU_FILL);
  307.     gluQuadricNormals(stick, GLU_SMOOTH);
  308.     gluCylinder(stick, 1.0, 1.0, 2.0, 8, 1); 
  309.     gluDeleteQuadric(stick);
  310.   glPopMatrix();
  311.   glLoadName(0); /* stop name loading */
  312. }