⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 board.c

📁 学习c++必备
💻 C
字号:
/*   *  CS 453 - Final project : An OpenGL version of the pegboard game IQ *  Due : June 5, 1997 *  Author : Kiri Wagstaff * *  File : board.c *  Description : Contains the board readin and selection functions. * *   */#include "gliq.h"/* functions */void selectboard(void);void readboards(void);void drawboard(void);void drawpegs(void); /* Draw all the pegs */void drawpeg(void);  /* Draw one peg */void displaybuttons(void);/* globals */int numboards, curboard;int*** boards;int filled[BOARDSIZE][BOARDSIZE]; /* Current state of the pegs *//* Define the board */GLfloat vertices[8*3] = {   -5.0,0.0,5.0,   5.0,0.0,5.0,  5.0,0.5,5.0,  -5.0,0.5,5.0,  -5.0,0.0,-5.0,  5.0,0.0,-5.0,  5.0,0.5,-5.0,  -5.0,0.5,-5.0};GLuint faces[6*4] = {   0,1,2,3, /*front*/  0,3,7,4, /*left*/   0,4,5,1, /*bottom*/  1,5,6,2, /*right*/  3,2,6,7, /*top*/  4,7,6,5  /*back*/};GLfloat normals[6*3] = {   0.0,  0.0,  1.0,  -1.0,  0.0,  0.0,   0.0, -1.0,  0.0,   1.0,  0.0,  0.0,   0.0,  1.0,  0.0,   0.0,  0.0, -1.0,};void selectboard(void){  int height=glutGet(GLUT_WINDOW_HEIGHT);  int width=glutGet(GLUT_WINDOW_WIDTH);  static float spin=0.0;  /* Eventually make it spin */  /* Display the buttons */  displaybuttons();  /* Draw the quit button */  drawquit(7.0, 9.0, 0.4, 1.0);  /* Quit */  glColor3f(1.0, 1.0, 1.0);  /* white */  /*  text(0.78*width, 0.89*height, 0.1*height, "Quit"); */  /* Select message */  glColor3f(0.0, 1.0, 0.0);  text(0.3*width, 0.9*height, 0.07*height, "Select a board");  /* Draw the total # of pegs */  glPushMatrix();    glColor3f(1.0, 1.0, 0.0);     /* yellow */    glTranslatef(-7.8, 8.8, 0.0);    drawpeg();    text(0.1*width, 0.9*height, 0.07*height, ": %02d", totalpegs);  glPopMatrix();    /* do the trackball rotation. */  glPushMatrix();  /*    tbMatrix(); */    glRotatef(45.0, 1.0, 0.0, 0.0);    glRotatef(spin, 0.0, 1.0, 0.0);    drawboard();    drawpegs();  glPopMatrix();  spin++;}void readboards(void){  int i, j, hole;  FILE* fp;  /* Read in the boards */  fp = fopen("boards.txt", "r");  if (!fp)    {      printf("Could not open boards.txt, exiting.\n");      exit(1);    }  fscanf(fp, "%d", &numboards);  boards = (int***)malloc(numboards*sizeof(int**));  for (i=0; i<numboards; i++)    {      boards[i] = (int**)malloc(BOARDSIZE*sizeof(int*));      for (j=0; j<BOARDSIZE; j++)	boards[i][j] = (int*)malloc(BOARDSIZE*sizeof(int));    }  for (i=0; i<numboards; i++)    for (j=0; j<BOARDSIZE*BOARDSIZE; j++)      {	fscanf(fp, "%d", &hole);	boards[i][j/BOARDSIZE][j%BOARDSIZE] = hole;      }  totalpegs = 0;  /* Set up filled array */  for (i=0; i<BOARDSIZE; i++)    for (j=0; j<BOARDSIZE; j++)       {	filled[i][j] = boards[curboard][i][j];	if (filled[i][j] == FULL)	  totalpegs++;      }  if (numboards == 1)    {      curboard = 0;      pegs = totalpegs;      curstate = PLAY;    }}void drawboard(void){  int i, j;  GLUquadricObj* hole;  /* Draw the board */  glColor3f(0.3, 0.3, 1.0);  /* Blue */  glShadeModel(GL_FLAT);  glBegin(GL_QUADS);  for (i=0; i<6; i++)     {      glNormal3fv(&normals[3*i]);      for (j=0; j<4; j++) 	glVertex3fv(&vertices[3*faces[i*4 + j]]);    }  glEnd();  /* Draw holes */  glShadeModel(GL_SMOOTH);  /*  glColor3f(0.0, 0.0, 0.0); */  glPushMatrix();  glTranslatef(-4.0, 0.51, -4.0);  for (i=0; i<BOARDSIZE; i++)    {      glPushMatrix();      for (j=0; j<BOARDSIZE; j++)	{	  if (filled[i][j] == UNUSED)	    {	      glTranslatef(1.0, 0.0, 0.0);	      continue;	    }	  glColor3f(0.3, 0.3, 1.0);  /* Blue */	  glPushMatrix();	    glRotatef(-90.0, 1.0, 0.0, 0.0);	    hole = gluNewQuadric();	    gluQuadricDrawStyle(hole, GLU_FILL);	    gluQuadricNormals(hole, GLU_SMOOTH);	    gluCylinder(hole, 0.3, 0.3, 0.5, 8, 1); 	    gluDeleteQuadric(hole);	  glPopMatrix();	  glTranslatef(1.0, 0.0, 0.0);	}      glPopMatrix();      glTranslatef(0.0, 0.0, 1.0);    }  glPopMatrix();}void drawpegs(void){  int i, j;  int name = 0;    /* Draw pegs */  glShadeModel(GL_SMOOTH);  glColor3f(1.0, 1.0, 0.0);  /* Yellow */  glPushMatrix();    glTranslatef(-4.0, 0.51, -4.0);    for (i=0; i<BOARDSIZE; i++)      {	glPushMatrix();	for (j=0; j<BOARDSIZE; j++)	  {	    name++;	    switch (filled[i][j])	      {	      case EMPTY:		glLoadName(name);		glDepthMask(GL_FALSE);		glEnable(GL_BLEND);		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);		glColor4f(1.0, 1.0, 0.0, 0.0);  /* Invisible */		drawpeg();		glDisable(GL_BLEND);		glDepthMask(GL_TRUE);		break;	      case UNUSED:		glTranslatef(1.0, 0.0, 0.0);		continue;	      case FULL:		glLoadName(name);		glColor3f(1.0, 1.0, 0.0);  /* Yellow */		if (picked == name)		  glColor3f(1.0, 0.5, 0.0); /* Orange */		drawpeg();		break;	      case CANMOVE:		glLoadName(name);		glColor3f(0.0, 1.0, 0.0); /* Green */		drawpeg();		break;	      case CANTMOVE:		glLoadName(name);		glColor3f(1.0, 0.0, 0.0); /* Red */		drawpeg();		break;	      default:		printf("Unknown peg value %d, exiting.", filled[i][j]);		exit(1);	      }	    glTranslatef(1.0, 0.0, 0.0);	  }	glPopMatrix();	glTranslatef(0.0, 0.0, 1.0);      }  glPopMatrix();}void drawpeg(void){  float ang=-90.0;  float radcyl=0.25;  float radball=0.4;  float len=0.8;  static GLuint peg=0;  GLUquadricObj* stick;  /* Generate the displaylist on the first call */   if (peg)     {      glCallList(peg);      return;    }  peg = glGenLists(1);  glNewList(peg, GL_COMPILE_AND_EXECUTE);  /* Draw the ball */  glPushMatrix();    glTranslatef(0.0, len+(radball/2), 0.0);    glutSolidSphere(radball, 8, 8);  glPopMatrix();  /* Draw the cone (stick) */  /*  glColor3f(1.0, 1.0, 0.0);  Yellow */  stick = gluNewQuadric();  glPushMatrix();    glRotatef(ang, 1.0, 0.0, 0.0);    gluQuadricDrawStyle(stick, GLU_FILL);    gluQuadricNormals(stick, GLU_SMOOTH);    gluCylinder(stick, radcyl, radcyl, len, 8, 1);     gluDeleteQuadric(stick);    /*    glutSolidCone(rad, len, 8, 8);*/  glPopMatrix();  glEndList();}void displaybuttons(void){  GLUquadricObj* stick;  /* Previous*/  glPushMatrix();    glLoadName(LEFTARR);    if (picked == LEFTARR)      glColor3f(1.0, 1.0, 1.0);  /* white */    else      glColor3f(0.0, 1.0, 0.0);  /* green */    glTranslatef(-5.0, 6.5, -2.0);    glRotatef(-90.0, 0.0, 1.0, 0.0);    glutSolidCone(1.5, 3.0, 8, 8);    glTranslatef(0.0, 0.0, -2.0);    stick = gluNewQuadric();    gluQuadricDrawStyle(stick, GLU_FILL);    gluQuadricNormals(stick, GLU_SMOOTH);    gluCylinder(stick, 1.0, 1.0, 2.0, 8, 1);     gluDeleteQuadric(stick);  glPopMatrix();  /* Select */  glPushMatrix();    glLoadName(SELECT);    if (picked == SELECT)      glColor3f(1.0, 1.0, 1.0);  /* white */    else      glColor3f(0.0, 1.0, 0.0);  /* green */    glTranslatef(0.0, 6.5, -2.0);    glutSolidCube(2.5);  glPopMatrix();  /* Next */  glPushMatrix();    glLoadName(RIGHTARR);    if (picked == RIGHTARR)      glColor3f(1.0, 1.0, 1.0);  /* white */    else      glColor3f(0.0, 1.0, 0.0);  /* green */    glTranslatef(5.0, 6.5, -2.0);    glRotatef(90.0, 0.0, 1.0, 0.0);    glutSolidCone(1.5, 3.0, 8, 8);    glTranslatef(0.0, 0.0, -2.0);    stick = gluNewQuadric();    gluQuadricDrawStyle(stick, GLU_FILL);    gluQuadricNormals(stick, GLU_SMOOTH);    gluCylinder(stick, 1.0, 1.0, 2.0, 8, 1);     gluDeleteQuadric(stick);  glPopMatrix();  glLoadName(0); /* stop name loading */}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -