/* simple4.c A program that draws spiral lines with little rectangles. But before you can see my spiral lines, you've got to play a little game first. Yi Zhuang, Lauren Toma */ #include #include #include #include #ifdef __APPLE__ #include #else #include #endif #define PI (3.141526) GLfloat red[3] = {1.0, 0.0, 0.0}; GLfloat green[3] = {0.0, 1.0, 0.0}; GLfloat blue[3] = {0.0, 0.0, 1.0}; GLfloat black[3] = {0.0, 0.0, 0.0}; GLfloat white[3] = {1.0, 1.0, 1.0}; GLfloat gray[3] = {0.5, 0.5, 0.5}; GLfloat yellow[3] = {1.0, 1.0, 0.0}; GLfloat magenta[3] = {1.0, 0.0, 1.0}; GLfloat cyan[3] = {0.0, 1.0, 1.0}; GLint fillmode = 0; int rectCount = 3; int you_win = 0; int grid[10][10] = { {2,1,3,0,0,0,0,0,0,1}, {0,1,1,1,1,1,1,1,0,1}, {0,1,0,0,0,0,0,1,0,1}, {0,1,0,0,0,0,0,1,0,1}, {0,1,0,1,1,1,1,1,0,1}, {0,1,0,1,0,0,0,0,0,1}, {0,1,0,1,0,1,1,1,1,1}, {0,1,0,1,0,1,0,1,0,0}, {0,1,0,1,0,1,0,1,0,0}, {0,0,0,0,0,1,0,1,0,0} }; /* forward declarations of functions */ void display(void); void keypress(unsigned char key, int x, int y); void main_menu(int value); int main(int argc, char** argv) { /* open a window */ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutInitWindowPosition(100,100); glutCreateWindow(argv[0]); /* OpenGL init */ glClearColor(0, 0, 0, 0); /* set background color black*/ /* callback functions */ glutDisplayFunc(display); glutKeyboardFunc(keypress); glutCreateMenu(main_menu); glutAddMenuEntry("Fill/Outline", 1); glutAddMenuEntry("Quit", 2); glutAttachMenu(GLUT_LEFT_BUTTON); /* event handler */ glutMainLoop(); return 0; } void draw_polygon(){ int i,j; float r; GLfloat x,y; if (fillmode) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } else { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } if(you_win){ printf("you win\n"); for(i=0; i<720; i+=360/rectCount){ r=0.1 + i*0.8/720; x = r*cos(PI*i/180); y = r*sin(PI*i/180); glBegin(GL_POLYGON); glColor3fv(blue); glVertex2f(x,y); glColor3fv(red); glVertex2f(x+r/10,y+r/10); glColor3fv(gray); glVertex2f(x+r/5,y); glEnd(); } return; } for(i=0; i<10; i++){ for(j=0; j<10; j++){ if(grid[i][j]==0) continue; x=0.2*i-1; y=0.2*j-1; if(grid[i][j]==1){ glBegin(GL_POLYGON); glColor3fv(blue); glVertex2f(x,y); glColor3fv(white); glVertex2f(x,y+0.2); glColor3fv(red); glVertex2f(x+0.2,y+0.2); glColor3fv(gray); glVertex2f(x+0.2,y); glEnd(); } if(grid[i][j]==2){ glBegin(GL_POLYGON); glColor3fv(yellow); glVertex2f(x,y); glVertex2f(x,y+0.2); glVertex2f(x+0.2,y+0.2); glVertex2f(x+0.2,y); glEnd(); } if(grid[i][j]==3){ glBegin(GL_POLYGON); glColor3fv(red); glVertex2f(x,y); glVertex2f(x,y+0.2); glVertex2f(x+0.2,y+0.2); glVertex2f(x+0.2,y); glEnd(); } } } } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); draw_polygon(); /* execute the drawing commands */ glFlush(); } void keypress(unsigned char key, int x, int y) { int i,j; int found = 0; switch(key) { case 'q': exit(0); break; case 'a': for(i=0; i<10; i++){ for(j=0; j<10; j++){ if(grid[i][j]==2 && i-1>=0 && grid[i-1][j]==0){ grid[i][j]=0; grid[i-1][j]=2; glutPostRedisplay(); found = 1; break; } if(grid[i][j]==2 && i-1>=0 && grid[i-1][j]==3){ you_win = 1; found = 1; break; } } if(found) break; } break; case 'w': for(i=0; i<10; i++){ for(j=0; j<10; j++){ if(grid[i][j]==2 && j+1<10 && grid[i][j+1]==0){ grid[i][j]=0; grid[i][j+1]=2; glutPostRedisplay(); found = 1; break; } if(grid[i][j]==2 && j+1<10 && grid[i][j+1]==3){ you_win = 1; found = 1; break; } } if(found) break; } break; case 'd': for(i=0; i<10; i++){ for(j=0; j<10; j++){ if(grid[i][j]==2 && i+1<10 && grid[i+1][j]==0){ grid[i][j]=0; grid[i+1][j]=2; glutPostRedisplay(); found = 1; break; } if(grid[i][j]==2 && i+1<10 && grid[i+1][j]==3){ you_win = 1; found = 1; break; } } if(found) break; } break; case 's': for(i=0; i<10; i++){ for(j=0; j<10; j++){ if(grid[i][j]==2 && j-1>=0 && grid[i][j-1]==0){ grid[i][j]=0; grid[i][j-1]=2; glutPostRedisplay(); found = 1; break; } if(grid[i][j]==2 && j-1>=0 && grid[i][j-1]==3){ you_win = 1; found = 1; break; } } if(found) break; } break; case 'z': rectCount++; if(rectCount > 50) rectCount-- ; glutPostRedisplay(); break; case 'x': rectCount--; if(rectCount < 2) rectCount++; glutPostRedisplay(); break; } } void main_menu(int value) { switch (value){ case 1: /* toggle outline/fill */ fillmode = !fillmode; break; case 2: exit(0); } glutPostRedisplay(); }