魔方吧·中文魔方俱乐部

标题: C语言魔方游戏代码 [打印本页]

作者: 引力透镜    时间: 2009-11-15 00:55:48     标题: C语言魔方游戏代码

用C语言加openGL写的,非原创


#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
//小方块的结构,包括小方块在x,y,z上的旋转角度,颜色数组下标,小方块的三维坐标。
struct rcube{
      int xr;
      int yr;
      int zr;
      int cl[6];
      GLfloat x;
      GLfloat y;
      GLfloat z;
};
struct rcube rc[3][3][3];
struct rcube *temp[3][3];
//颜色数组
GLfloat color[6][3]={{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0},
                       {1.0,1.0,0.0},{1.0,0.0,1.0},{0.0,1.0,1.0}};
int tempc[3][3][6];
//有关旋转的一些变量
GLfloat xRot = 10.0f;
GLfloat yRot = 10.0f;
int rotateType=0;
int rotateOK=0;
int rotateRate=50;
int rotate=0;
///////////////////////////////////////////////////////////////////////////////
//画小方块
void drawcube(int cl[6])
{   
      glBegin(GL_QUADS);
//右面
      glColor3fv(color[cl[0]]);
      glVertex3f(0.14f,-0.14f,-0.14f);
      glVertex3f(0.14f,0.14f,-0.14f);
      glVertex3f(0.14f,0.14f,0.14f);
      glVertex3f(0.14f,-0.14f,0.14f);
//左面
      glColor3fv(color[cl[1]]);
      glVertex3f(-0.14f,-0.14f,0.14f);
      glVertex3f(-0.14f,0.14f,0.14f);
      glVertex3f(-0.14f,0.14f,-0.14f);
      glVertex3f(-0.14f,-0.14f,-0.14f);
//前面
      glColor3fv(color[cl[2]]);
      glVertex3f(-0.14f,0.14f,0.14f);
      glVertex3f(-0.14f,-0.14f,0.14f);
      glVertex3f(0.14f,-0.14f,0.14f);
      glVertex3f(0.14f,0.14f,0.14f);
//后面
      glColor3fv(color[cl[3]]);
      glVertex3f(-0.14f,0.14f,-0.14f);
      glVertex3f(0.14f,0.14f,-0.14f);
      glVertex3f(0.14f,-0.14f,-0.14f);
      glVertex3f(-0.14f,-0.14f,-0.14f);
//上面
      glColor3fv(color[cl[4]]);
      glVertex3f(-0.14f,0.14f,-0.14f);
      glVertex3f(-0.14f,0.14f,0.14f);   
      glVertex3f(0.14f,0.14f,0.14f);
      glVertex3f(0.14f,0.14f,-0.14f);
//下面
      glColor3fv(color[cl[5]]);
      glVertex3f(-0.14f,-0.14f,-0.14f);
      glVertex3f(0.14f,-0.14f,-0.14f);
      glVertex3f(0.14f,-0.14f,0.14f);
      glVertex3f(-0.14f,-0.14f,0.14f);
      glEnd();
      glFlush();
}
作者: 引力透镜    时间: 2009-11-15 00:57:56

//窗口刷新时被调用。
void RenderScene(void)
{
      int i,j,k;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
for(i=0;i<3;i++)
{
       for(j=0;j<3;j++)
       {
           for(k=0;k<3;k++)
           {
               //魔方在这显示
               glPushMatrix();      
                  glRotatef(rc[j][k].xr, 1.0f, 0.0f, 0.0f);
                  glRotatef(rc[j][k].zr, 0.0f, 0.0f, 1.0f);
                  glRotatef(rc[j][k].yr, 0.0f, 1.0f, 0.0f);     
                  glTranslatef(rc[j][k].x,rc[j][k].y,rc[j][k].z);               
               drawcube(rc[j][k].cl);            
               glPopMatrix();
           }
          }
      }            
glPopMatrix();
glutSwapBuffers();
}
//初始化。
void SetupRC()
{
      GLfloat x,y,z;
int i,j,k,l;
for(i=0,x=-0.3f;i<3;i++,x+=0.3f)
{
       for(j=0,y=-0.3f;j<3;j++,y+=0.3f)
       {
           for(k=0,z=-0.3f;k<3;k++,z+=0.3f)
           {
               rc[j][k].x=x;rc[j][k].xr=0;
                  rc[j][k].y=y;rc[j][k].yr=0;
                  rc[j][k].z=z;rc[j][k].zr=0;                                      
                  for(l=0;l<6;l++)
                  {
                      rc[j][k].cl[l]=l;                           
                  }   
               }
           }
       }
glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
      glEnable(GL_DEPTH_TEST);
      glEnable(GL_CULL_FACE);
}
作者: 引力透镜    时间: 2009-11-15 00:59:18

//选择转动的那一组小方块。
void elect(int type)
{
      int i,j;  
      for(i=0;i<3;i++)
      {
          for(j=0;j<3;j++)
          {
              switch (type)
              {
                  case 1:
                      temp[j]=&rc[0][j]; break;
                  case 2:
                      temp[j]=&rc[1][j]; break;
                  case 3:
                      temp[j]=&rc[2][j]; break;
                  case 4:
                      temp[j]=&rc[j][0]; break;
                  case 5:
                      temp[j]=&rc[j][1]; break;
                  case 6:
                      temp[j]=&rc[j][2]; break;
                  case 7:
                      temp[j]=&rc[j][0]; break;
                  case 8:
                      temp[j]=&rc[j][1]; break;
                  case 9:
                      temp[j]=&rc[j][2]; break;
              }            
          }
      }     
}
//判断是否胜利。
int win(void)
{
      int i,j,k,c,cl[6];
      for(k=0;k<6;k++)
      {
          cl[k]=rc[0][0][0].cl[k];
      }   
      for(i=0;i<3;i++)
      {
          for(j=0;j<3;j++)
          {
              for(k=0;k<3;k++)
              {
                  for(c=0;c<6;c++)
                  {
                      if(rc[j][k].cl[c]!=cl[c])
                          return 0;
                  }   
              }   
          }   
      }
      return 1;
}   
//转动小方块,实际上是交换颜色。
void shift(void)
{   
      int i,j,k,c;
      elect(rotateType);
      for(i=0;i<3;i++)
      {
          for(j=0;j<3;j++)
          {
              (*temp[j]).xr=0;
              (*temp[j]).yr=0;
              (*temp[j]).zr=0;   
              if(rotateType>0&&rotateType<=3)
              {
                  c=(*temp[j]).cl[2];
                  (*temp[j]).cl[2]=(*temp[j]).cl[4];
                  (*temp[j]).cl[4]=(*temp[j]).cl[3];
                  (*temp[j]).cl[3]=(*temp[j]).cl[5];
                  (*temp[j]).cl[5]=c;
              }
              if(rotateType>3&&rotateType<=6)
              {
                  c=(*temp[j]).cl[0];
                  (*temp[j]).cl[0]=(*temp[j]).cl[2];
                  (*temp[j]).cl[2]=(*temp[j]).cl[1];
                  (*temp[j]).cl[1]=(*temp[j]).cl[3];
                  (*temp[j]).cl[3]=c;
              }
              if(rotateType>6&&rotateType<=9)
              {
                  c=(*temp[j]).cl[4];
                  (*temp[j]).cl[4]=(*temp[j]).cl[0];
                  (*temp[j]).cl[0]=(*temp[j]).cl[5];
                  (*temp[j]).cl[5]=(*temp[j]).cl[1];
                  (*temp[j]).cl[1]=c;
              }
              for(k=0;k<6;k++)
              {
                  tempc[2-j][k]=(*temp[j]).cl[k];
              }
          }
      }   
      for(i=0;i<3;i++)
      {
          for(j=0;j<3;j++)
          {
              for(k=0;k<6;k++)
              {
                  (*temp[j]).cl[k]=tempc[j][k];
              }   
          }
      }
//如果完成将背景色设成黑色,否则设成灰色。
      if(win()==1)
          glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
      else
          glClearColor(0.5f, 0.5f, 0.5f, 1.0f );
}   
//转动魔方,也就是改变小方块在x,y,z上的旋转角度。
void turn (void)
{
      int j,k;
      elect(rotateType);
      for(j=0;j<3;j++)
      {
          for(k=0;k<3;k++)
          {            
              if(rotateType>0&&rotateType<=3)
                  (*temp[j][k]).xr+=10;
              if(rotateType>3&&rotateType<=6)
                  (*temp[j][k]).yr+=10;
              if(rotateType>6&&rotateType<=9)
                  (*temp[j][k]).zr+=10;            
          }
      }
}
作者: 引力透镜    时间: 2009-11-15 01:00:57

//定时器回调函数,当魔方转动时产生动画。
void TimerFunc(int value)
{
      rotate+=10;        
      turn();
      glutPostRedisplay();
      if(rotate==90)
      {
          shift();
          rotate=0;
          rotateOK=0;        
          rotateType=0;        
          return;
      }      
glutTimerFunc(rotateRate,TimerFunc,1);
}
//接收键盘输入。
void SpecialKeys(int key, int x, int y)
{
      int temp=0;
      switch (key)
      {     
          case GLUT_KEY_F1:
              temp=1; break;
          case GLUT_KEY_F2:
              temp=2; break;
          case GLUT_KEY_F3:
              temp=3; break;                       
          case GLUT_KEY_F4:
              temp=4; break;
          case GLUT_KEY_F5:
              temp=5; break;
          case GLUT_KEY_F6:
              temp=6; break;
          case GLUT_KEY_F7:
              temp=7; break;
          case GLUT_KEY_F8:
              temp=8; break;
          case GLUT_KEY_F9:
              temp=9; break;                                                   
          case GLUT_KEY_UP:
              xRot -= 5.0f; break;
       case GLUT_KEY_DOWN:
              xRot += 5.0f; break;
       case GLUT_KEY_LEFT:
              yRot -= 5.0f; break;
       case GLUT_KEY_RIGHT:
              yRot += 5.0f; break;
      }
      if ( rotateOK==0 && temp!=0)
      {
          rotateType=temp;
          rotateOK=1;
          glutTimerFunc(rotateRate,TimerFunc,1);
      }
      else temp=0;
      if(xRot > 356.0f) xRot = 0.0f;
if(xRot < -1.0f) xRot = 355.0f;
if(yRot > 356.0f) yRot = 0.0f;
if(yRot < -1.0f) yRot = 355.0f;
glutPostRedisplay();        
}
//当窗口改变尺寸时被调用。
void ChangeSize(int w, int h)
{
GLfloat nRange = 1.9f;
if(h == 0)
    h = 1;
      glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
      if (w <= h)
    glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
      else
    glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//主函数。
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutReshapeFunc(ChangeSize);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene);
SetupRC();
glutMainLoop();
return 0;
}
作者: Boooo    时间: 2009-11-15 01:02:50

...没学C....LZ加油哈~
作者: zqfnwpu    时间: 2009-11-15 01:04:32

额~~C语言我是白痴。。。VB都吃力~~
作者: dhlsoft    时间: 2009-11-17 22:47:49

有年头的程序了。。呵呵
作者: NicholasKan    时间: 2009-11-24 12:56:01

OpenGL?楼主牛×。。。膜拜一个。
作者: imlei2008    时间: 2009-12-7 22:38:40

程序缺少文件吧    我运行了一下   
Cpp1.cpp
c:\users\administrator\desktop\cpp1.cpp(4) : fatal error C1083: Cannot open include file: 'gl/glut.h': No such file or directory
执行 cl.exe 时出错.

Cpp1.exe - 1 error(s), 0 warning(s)
作者: jslylzy    时间: 2009-12-16 21:20:18

看不懂唉      
作者: river999    时间: 2009-12-17 22:30:52

代码是什么程序的呢?可以达到什么效果?谢谢
作者: latios    时间: 2009-12-27 01:34:30

我有裝visual C++ XDD,可以用
作者: yq_118    时间: 2009-12-27 01:37:19

不错。
只有源代码,不知道运行起来怎么样啊。
作者: latios    时间: 2009-12-27 01:38:42

原帖由 imlei2008 于 2009-12-7 22:38 发表
程序缺少文件吧    我运行了一下   
Cpp1.cpp
c:\users\administrator\desktop\cpp1.cpp(4) : fatal error C1083: Cannot open include file: 'gl/glut.h': No such file or directory
执行 cl.exe 时出错.

Cp ...

我都一樣....
fatal error C1083: Cannot open include file: 'gl/glut.h': No such file or directory
21 - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

[ 本帖最后由 latios 于 2009-12-27 01:39 编辑 ]
作者: Neo63    时间: 2009-12-27 02:04:45

好厉害。。。我改天试试用Java写一个
作者: 小甲点点    时间: 2018-11-6 08:47:29

imlei2008 发表于 2009-12-7 22:38
程序缺少文件吧    我运行了一下   
Cpp1.cpp
c:\users\administrator\desktop\cpp1.cpp(4) : fatal erro ...

你需要下载glut,并且将其中的dll,lib,.h文件放到指定文件夹,百度可以解决。因为他引用了这个头文件,如果没有这个文件,vs是包含了另外2个的,可以直接打开。




欢迎光临 魔方吧·中文魔方俱乐部 (http://bbs.mf8-china.com/) Powered by Discuz! X2