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

📄 gliq.c

📁 学习c++必备
💻 C
字号:
/*   *  CS 453 - Final project : An OpenGL version of the pegboard game IQ *  Due : June 5, 1997 *  Author : Kiri Wagstaff * *  File : gliq.c *  Description : Main board display file. * *  5/22 : Displays the board selection screen, and uses keyboard *  input to manipulate it and select. * */#include "gliq.h"/* globals */#if 0//GLuint cone;#endifint curstate;int mouse_state=-1;int mouse_button=-1;int pegs=0;int totalpegs=0;int lastpicked = 0;/* functions */void init(void);void reshape(int width, int height);void display(void);void special(int key, int x, int y);void keyboard(unsigned char key, int x, int y);void mouse(int button, int state, int x, int y);void motion(int x, int y);void idle(void);int main(int argc, char** argv){  glutInit(&argc, argv);  glutInitWindowSize(512, 512);  glutInitWindowPosition(0, 0);  glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);  glutCreateWindow("GLIQ");    glutReshapeFunc(reshape);  glutDisplayFunc(display);  glutKeyboardFunc(keyboard);  glutSpecialFunc(special);  glutMouseFunc(mouse);  glutMotionFunc(motion);  glutPassiveMotionFunc(passive);  glutIdleFunc(idle);    init();    glutMainLoop();  return 0;}void init(void){  int i, j;  /* lighting */  glEnable(GL_LIGHTING);  glEnable(GL_LIGHT0);  glEnable(GL_COLOR_MATERIAL);  glEnable(GL_DEPTH_TEST);  glDepthFunc(GL_LEQUAL);  /*  glEnable(GL_CULL_FACE);*/  /* put the identity in the trackball transform */  tbInit(GLUT_RIGHT_BUTTON);  glSelectBuffer(SELECT_BUFFER, select_buffer);  /* make the star cone */  /*  cone = glGenLists(1);    glNewList(cone, GL_COMPILE);  glPushMatrix();  for (i=0; i<3; i++)    {      glRotatef(45.0, 1.0, 0.0, 0.0);      glutSolidCone(0.2, 2.0, 8, 8);    }  glPopMatrix();  glEndList();*/  /* Initialize the state */  for (i=0; i<BOARDSIZE; i++)    for (j=0; j<BOARDSIZE; j++)      filled[i][j] = UNUSED;  curstate = SELBOARD;  curboard = 0;  readboards();  readscores();}void reshape(int width, int height){  GLfloat lightpos[4] = { 1.0, 1.0, 1.0, 1.0 };  tbReshape(width, height);  glViewport(0, 0, width, height);    glMatrixMode(GL_PROJECTION);  glLoadIdentity();  gluPerspective(60.0, (GLfloat)height / (GLfloat)width, 1.0, 128.0);  glMatrixMode(GL_MODELVIEW);  glLoadIdentity();  glLightfv(GL_LIGHT0, GL_POSITION, lightpos);  glTranslatef(0.0, -2.0, -15.0);}void display(void){  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  /* draw */  switch(curstate)    {    case SELBOARD:      selectboard();      break;    case PLAY:      playgame();      break;    case HIGHSC:      highscore();      break;    case VIEWSCORES:      showhighscores();      break;    default:      printf("Unknown state %d, exiting.\n", curstate);      exit(1);    }  glutSwapBuffers();}/* ARGSUSED1 */void special(int key, int x, int y){  switch (key) {     case GLUT_KEY_UP:      break;    case GLUT_KEY_DOWN:      break;    case GLUT_KEY_RIGHT:      break;    case GLUT_KEY_LEFT:      break; }  glutPostRedisplay();}/* ARGSUSED1 */void keyboard(unsigned char key, int x, int y){  switch (key) {  case 'h':    printf("gliq help\n\n");    printf("f            -  Filled\n");    printf("w            -  Wireframe\n");    printf("s            -  See high scores\n");    printf("escape or q  -  Quit\n\n");    break;  case 'f':    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);    break;  case 'w':    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);    break;  case 's':    curstate = VIEWSCORES;    glutIdleFunc(idlescore);    break;      case 'q':  case 27:    exit(0);    break;  }  glutPostRedisplay();}void mouse(int button, int state, int x, int y){  int i, j;  int mid=0;    mouse_state = state;  mouse_button = button;  if (state == GLUT_DOWN && button==GLUT_LEFT_BUTTON)    switch(curstate)      {      case SELBOARD:	switch(picked)	  {	  case NONE:	    break;	  case LEFTARR:	    curboard--;	    totalpegs = 0;	    if (curboard<0)	      curboard = numboards-1;	    /* 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++;		}	    break;	    	  case SELECT:	    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++;		}	    curstate = PLAY;	    playdone = 0;	    pegs = totalpegs;	    glutIdleFunc(NULL);	    break;	  case RIGHTARR:	    curboard++;	    totalpegs = 0;	    if (curboard>=numboards)	      curboard = 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++;		}	    break;	  case QUIT:	    exit(0);	  default:	    printf("picked is %d.\n", picked);	  }	break;      case PLAY:#if 0//	printf("picked is %d\n", picked);#endif	if (picked == 0)	  break;	if (picked == QUIT)	  {	    if (pegs < minscore || (pegs==minscore && totalpegs > minpegs))	      {		curstate = HIGHSC;		numentered = 0;		written = 0;		glutKeyboardFunc(keyscores);		glutIdleFunc(idlescore);		break;	      }	    curstate = SELBOARD;	    glutIdleFunc(idle);	    totalpegs = 0;	    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++;		}	    break;	  }	if (filled[(picked-1)/BOARDSIZE][(picked-1)%BOARDSIZE] == FULL)	  {	    if (canmove(picked))	      filled[(picked-1)/BOARDSIZE][(picked-1)%BOARDSIZE] = CANMOVE;	    else	      {		filled[(picked-1)/BOARDSIZE][(picked-1)%BOARDSIZE] = CANTMOVE;#if 0		Beep(1000, 40);		PlaySound("SPR_OUCH.WAV", NULL, SND_FILENAME);#endif	      }	    lastpicked = picked;	  }	else	  lastpicked = 0;	break;      case HIGHSC:	if (written)	  {	    curstate = VIEWSCORES;	    glutKeyboardFunc(NULL);	    glutIdleFunc(idlescore);	  }	break;      case VIEWSCORES:	curstate = SELBOARD;	glutKeyboardFunc(keyboard);	glutIdleFunc(idle);	totalpegs = 0;	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++;	    }	break;      default:	printf("Unknown state %d, exiting.\n", curstate);	exit(1);      }  /* Release a button, reset the array */  else if (state==GLUT_UP && button==GLUT_LEFT_BUTTON)    switch (curstate)      {      case SELBOARD:	break;      case PLAY:	if (picked <= 0)	  break;	if ((mid = legalmove()))	  {#if 0	    //	    printf("Erasing (%d,%d).", (mid-1)/BOARDSIZE, (mid-1)%BOARDSIZE);#endif	    filled[(lastpicked-1)/BOARDSIZE][(lastpicked-1)%BOARDSIZE] = EMPTY;	    filled[(mid-1)/BOARDSIZE][(mid-1)%BOARDSIZE] = EMPTY;	    filled[(picked-1)/BOARDSIZE][(picked-1)%BOARDSIZE] = FULL;	    pegs--;	    /* Check for any legal moves left */	    if (!movesexist())	      {		/* Display score & "no moves left" */		printf("No moves remaining.  You finished with %d pegs left.\n",		       pegs);		playdone = 1;#if 0		//		exit(0);#endif	      }	  }	else if (lastpicked != 0)	  filled[(lastpicked-1)/BOARDSIZE][(lastpicked-1)%BOARDSIZE] = FULL;	break;      case HIGHSC:	break;      case VIEWSCORES:	break;      default:	printf("Unknown state %d, exiting.\n", curstate);	exit(1);      }  else    tbMouse(button, state, x, y);#if 0  else if (state == GLUT_DOWN && button == GLUT_RIGHT_BUTTON)    tbStartMotion(x, y, button, glutGet(GLUT_ELAPSED_TIME));  else if (state == GLUT_UP && button == GLUT_RIGHT_BUTTON)    tbStopMotion(button, glutGet(GLUT_ELAPSED_TIME));#endif  glutPostRedisplay();}void motion(int x, int y){  tbMotion(x, y);  if (mouse_button == GLUT_LEFT_BUTTON)    picked = pick(x,y);    glutPostRedisplay();}void idle(void){  display();}  

⌨️ 快捷键说明

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