📄 board.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 + -