1、(1)建立魔方的三维模型。(2)初始化时随机生成一个打乱顺序的魔方,并显示。(3)用户可以选择通过键盘某一行或者某一列进行旋转。每次旋转结束后,判断魔方的当前状态是否符合游戏结束的条件,如果符合,则提示用户游戏结束。否则,游戏继续进行。 游戏另外附加的功能还包括:(1)保存当前魔方状态。(2)从数据文件中加载一个魔方。(3)缩放魔方大小。(4)查看正确答案。五、详细设计 1.魔方的三维模型建立魔方的数据主要体现在魔法表面各个正方形的颜色排列上,只要表达了这些颜色数据,也就表达了魔方状态。按照OpenGL默认的三维坐标进行建模。魔方几何中心位于坐标原点。为了便于计算和处理,给每个面进行编号。编号
2、如下:0:上平面1:前平面2:右平面3:后平面4:左平面5:下平面同时建立面之间的位置相对关系。用数组“int compensation6=5,3,4,1,2,0;”来表示这种关系。为了进行魔方游戏,需要用一种结构表示和记录当前魔方状态,这里用数组“color69;”来储存6个面中共54个正方形颜色。各种颜色定义如下:float mat_diffuse64 = 0.6, 0.0, 0.0, 0.0, /0:红色 0.6, 0.6, 0.0, 0.0, /1:黄色 0.6, 0.6, 0.6, 0.0, /2:白色 0.0, 0.6, 0.0, 0.0, /3:绿色 0.6, 0.0, 0.6,
3、 0.0, /4:紫色 0.0, 0.0, 0.6, 0.0 /5:蓝色 ; float mat_lighted64 = 1.0, 0.0, 0.0, 0.0, /0: 1.0, 1.0, 0.0, 0.0, /1: 1.0, 1.0, 1.0, 0.0, /2: 0.0, 1.0, 0.0, 0.0, /3: 1.0, 0.0, 1.0, 0.0, /4: 0.0, 0.0, 1.0, 0.0 /5:通过逐个绘制方块来绘制某一时刻魔方的模型/多边形的绘制模式,前后两面都要绘制并且是填充方式进行绘制glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);/设置材质属性
4、,不发光 glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, mat_none);/设置材质属性,没有镜面反射glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, mat_none); /魔方每个正方形小方块的大小 double actuallen = ( sidelen - 2 * stitch) / 3; /开始 绘制上底面/起点的x和z方向的两个参数startpoint1 = - sidelen / 2;startpoint2 = - sidelen / 2; /按照color存储的颜色绘制上底面的9个方块 f
5、or( i = 0; i 3; i+) for( j = 0; j = 360) m_xRotation -= 360;Ss m_yRotation += 90; if( m_yRotation m_yRotation -= 360;Qq m_xTranslation += 0.2; if( m_xTranslation = 1) m_xTranslation = 1;Ww m_xTranslation -= 0.2; if( m_xTranslation = -1) m_xTranslation =- 1; InvalidateRect( NULL, FALSE); CView:OnKeyD
6、own(nChar, nRepCnt, nFlags);4.保存魔方当前状态当用户终止游戏时,可保存当前魔方数据到数据文件中,下次打开应用程序后可以加载该数据,继续进行未完成的游戏。保存即将54个表面方块的颜色编号按顺序写入文件:ofstream fout(new.mf);for(int i=0;i6;i+) for(int j=0;j9; fout5.显示正确解法魔方初始时是根据随机数挑选层来逆时针旋转,这样产生了一个随机打乱的魔方,我们可以通过记录随机序列方式记下魔方被打乱的轨迹。将这种轨迹反过来分析,就是对应模仿的正确解法。保存轨迹:method.mf for(int i=0;num;
7、int face=rand()%3; int line=rand()%3; RotateMagicLeft(face,line);/ Foutface lineendl;获得正确解法并将结果显现出来:OnAnswer() ifstream fin( int face,line; vector m; char s20=yoz方向左层,yoz方向中层yoz方向右层xoy方向近层xoy方向中层xoy方向远层xoz方向底层xoz方向中层xoz方向顶层; CString str; for( ; finface&finline;) m.push_back(face*3+line); int i=m.siz
8、e()-1; while(i=0) /表示顺时针 str+=smi; str+=顺时针旋转n; i-; MessageBox(str);六、具体实现 (1)新建工程,选择“MFC应用程序”,程序类型为多文档方式,工程名为MagicCube。 (2)选择资源视图,添加菜单项。对菜单进行编辑,在菜单项空白处单击右键,选择“新插入”进行菜单项插入。在属性窗口将菜单项的Popup属性False,在修改Caption和ID属性为“保存”和“ID_SAVE”。按同样过程添加“加载”和“显示答案”菜单项。插入菜单项(3)为菜单项添加响应函数。在需要添加响应的菜单项上单击右键,选择“添加事件处理程序”为菜单项
9、添加事件处理程序弹出“事件处理程序向导”对话框,在向导的“类列表”中选择CMagicCubeView类,在“消息类型”中选择“COMMAND”,再单击“添加编辑”按钮。跳转到对应的代码区域。依次添加菜单项的事件响应函数。事件处理程序向导响应事件代码(4)添加其他系统消息响应函数。在属性窗口中选择“消息”标签。选择对应消息,添加响应函数。需要处理的消息函数包括:“WM_CREATE”、“WM_PAINT”、“WM_SIZE”、“WM_DESTROY”、“WM_KEYDOWN”、“WM_LBUTTONDOWN”、“WM_LBUTTONUP”、“WM_MOUSEMOVE”。属性窗口(5)在View类
10、的头文件中添加下列文件:#includegl/glu.hgl/glaux.h要使用OpenGL函数库还要链接相应的库文件。在“项目”菜单中选择“MagicCude属性”项打开项目属性选择“配置属性”“连接器”“输入”,在“附加依赖项”编辑框中,添加三个静态库openg132.lib、glu32.lib、glaux.lib,中间用空格隔开。修改附加依赖项(5)参照源代码在文件中加入各种声明、定义与成员函数等代码七、系统测试运行程序,运行结果如图。通过PageUp和PageDown可确定操作的层的方向,再通过光标“”和“”可选择某一层。可通过鼠标观察魔方整体旋转。程序运行结果单击“显示答案”按钮,
11、可获得魔方的正确解法。八、总结1 、缺点与不足开发基于OpenGL的应用程序,本设计采用库文件中的核心库(gl)、实用库(glu)、辅助库(glaux)等 。虽然顺利完成课程设计,但是还存在很多不同之处,有很多地方值得改进。魔方在旋转的过程中,要可以从不同的视角观察,这样使玩家更容易操纵魔方。本实验通过PageUp和PageDown确定操作的层的方向后,再通过光标“”和“”选择某一层,“”和“”来选择逆时针还是顺时针转动该层。感觉上交互不是很好。个人希望在键盘操作的同时可以通过鼠标来选择某一层的旋转。同时立体感做的不够好,没有转动的过程动作,这个有点抽象。也是游戏一个缺点之一。2、收获、心得这
12、次课程设计中,我们在添加部分函数时出现了一些状况,在实现魔方的交互手段时,出现了问题。当时魔方只能在xoy面上选择层,而不能通过PageUp和PageDown确定操作的层的方向。通过检查并修改函数终于解决了问题,魔方可以在xoy面、xoz面、yoz面上任意转换。还有就是加了旋转函数后遇到了一些问题,旋转过程中有时候会出现折叠和重叠现象,经过仔细的检查修改,发现原因是在调用旋转函数时,有部分子块的运动没有写入函数,于是问题得到了解决。这次课程设计,学到了很多。不仅巩固了先前学的MFC程序设计知识,而且也培养了我们的动手能力,更令我们的创造性思维得到了一定程度的拓展。此外,我们还复习了C语言知识,
13、也对编程及3D设计产生了一定的兴趣,分析问题和解决问题的能力也得到了不小的提高。并且,我们也学到了一些人生的道理。在做一件看似很难的事时,我们要有一个总体的框架,不要有畏难心理。静下心来,沉着的分析问题,问题总会迎刃而解的。因此,成功的关键在于你是否拥有这样的心理。九、参考文献1聂江武,杜娜,周峰 VisualC+.NET 2005基础与实践教程 2007年9月2孙鑫 VC+深入详解 第三版 北京 电子工业出版社 2007年 1-263杨柏林,陈根浪,徐静 OpenGL编程精粹 第三版 北京 机械工业出版社 2010年 1-1214周纯杰,刘正林,何顶新,周凯波 标准C语言程序设计及应用 第二
14、版 武汉 华中科技大学出版社 2008年 1-2635Dave Shreiner,The Khronons OpenGLARB Working Group OpenGL编程指南 第七版 北京 机械工业出版社 2010年 21-328十、源代码/ MagicCubeView.h : CMagicCubeView 类的接口#pragma onceclass CMagicCubeView : public CViewprotected: / 仅从序列化创建 CMagicCubeView(); DECLARE_DYNCREATE(CMagicCubeView)/ 属性public: CMagicCub
15、eDoc* GetDocument() const; /OpenGL绘图描述表 HGLRC m_hGLContext; /像素格式索引 int m_GLPixelIndex; / 记录鼠标左键是否按下 BOOL m_LeftButtonDown; /记录左键按下时,鼠标位置 CPoint m_LeftDownPos; /绕x轴旋转的弧度 float m_xRotation; /绕y轴旋转的弧度 float m_yRotation; /x轴方向的平移 float m_xTranslation; /y轴方向的平移 float m_yTranslation; /z轴方向的平移 float m_zTranslation; /x轴方向的缩放比例系数 float m_xScaling; /y轴方向的缩放比例系数 float m_yScaling; /z轴方向的缩放比例系数 float m_zScaling; /设置窗口像素格式 BOOL SetWindowPixelFormat(HDC hDC); /初始化参数 void Init (void); /绘制场景
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2