📄 game.c
字号:
/* * CS 453 - Final project : An OpenGL version of the pegboard game IQ * Due : June 5, 1997 * Author : Kiri Wagstaff * * File : game.c * Description : All the routines to actually play the game. * */#include "gliq.h"int playdone=0;void playgame(void);void drawquit(float x, float y, float r1, float r2);int legalmove(void);int canmove(int peg);int movesexist(void);void playgame(void){ int height = glutGet(GLUT_WINDOW_HEIGHT); int width = glutGet(GLUT_WINDOW_WIDTH); /* Draw the quit button */ drawquit(7.0, 9.0, 0.4, 1.0); /* Quit */#if 0 // glColor3f(1.0, 1.0, 1.0); /* white */ // text(0.78*width, 0.88*height, 0.1*height, "Quit");#endif /* Draw the current scores */ /* 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", pegs); glPopMatrix(); if (playdone) text(0.2*glutGet(GLUT_WINDOW_WIDTH), 0.75*glutGet(GLUT_WINDOW_HEIGHT), 0.08*glutGet(GLUT_WINDOW_HEIGHT), "No moves left."); /* do the trackball rotation. */ glPushMatrix(); glRotatef(45.0, 1.0, 0.0, 0.0); tbMatrix(); drawboard(); drawpegs(); glPopMatrix();}int canmove(int peg){ int i, j; if (peg == 0) return 0; i = (peg-1)/BOARDSIZE; j = (peg-1)%BOARDSIZE; if ((i-2>0) && (filled[i-1][j]==FULL) && (filled[i-2][j]==EMPTY)) return 1; else if ((i+2<BOARDSIZE) && (filled[i+1][j]==FULL) && (filled[i+2][j]==EMPTY)) return 1; else if ((j-2>0) && (filled[i][j-1]==FULL) && (filled[i][j-2]==EMPTY)) return 1; else if ((j+2<BOARDSIZE) && (filled[i][j+1]==FULL) && (filled[i][j+2]==EMPTY)) return 1; else return 0; }/** returns 0 if not a legal move; ** returns the index of the middle (jumped) peg if it was legal ** (1 to BOARDSIZE*BOARDSIZE) **/int legalmove(void){ int lasti, lastj; int i, j; if (lastpicked == 0) return 0; lasti = (lastpicked-1)/BOARDSIZE; lastj = (lastpicked-1)%BOARDSIZE; i = (picked-1)/BOARDSIZE; j = (picked-1)%BOARDSIZE;#if 0 // printf("Jumping from (%d,%d) to (%d,%d)\n", lasti, lastj, i, j);#endif if (filled[lasti][lastj] == CANMOVE && filled[i][j] == EMPTY) if (lasti==i+2) return (i+1)*BOARDSIZE+(j)+1; /* i+1, +1 to get the name right */ else if (lasti==i-2) return (i-1)*BOARDSIZE+(j)+1; /* i-1, +1 */ else if (lastj==j+2) return (i)*BOARDSIZE+(j+1)+1; /* j+1, +1 */ else if (lastj==j-2) return (i)*BOARDSIZE+(j-1)+1; /* j-1, +1 */ else return 0; return 0;}/* Checks for any legal moves remaining */int movesexist(void){ int i, j, peg; for (peg=1; peg<=BOARDSIZE*BOARDSIZE; peg++) { i = (peg-1)/BOARDSIZE; j = (peg-1)%BOARDSIZE; if (filled[i][j] == FULL && canmove(peg)) return 1; } return 0;}void drawquit(float x, float y, float r1, float r2){ GLUquadricObj* stick; glLoadName(QUIT);#if 0 //glDisable(GL_LIGHTING);#endif glColor3f(1.0, 0.0, 0.0); /* red */#if 0 //glRectf(x, y, x+w, y+h); //glEnable(GL_LIGHTING);#endif glPushMatrix(); glTranslatef(x, y, 0.0); glPushMatrix(); stick = gluNewQuadric(); glRotatef(90, 0.0, 1.0, 0.0); glRotatef(45, 1.0, 0.0, 0.0); glTranslatef(0.0, 0.0, r2-1.5*r1); gluQuadricDrawStyle(stick, GLU_FILL); gluQuadricNormals(stick, GLU_SMOOTH); gluCylinder(stick, 0.85*r1, 0.85*r1, 3*r1, 8, 1); gluDeleteQuadric(stick); /* glutSolidCone(rad, len, 8, 8);*/ glPopMatrix(); glRotatef(22.5, 0.0, 0.0, 1.0); glutSolidTorus(r1, r2, 8, 8); glPopMatrix(); glLoadName(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -