JAVA课程设计说明书模板_第1页
JAVA课程设计说明书模板_第2页
JAVA课程设计说明书模板_第3页
JAVA课程设计说明书模板_第4页
JAVA课程设计说明书模板_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目 录1. 摘要12. 概述22.1课程设计目的22.2课程设计内容和要求33. 系统需求分析33.1 系统目标33.2 主体功能34.系统总体设计34.1 系统的功能模块划分35.主要工作原理和关键技术介绍45.1 魔方旋转原理技术介绍45.2关键问题解决思路55.2.1 三维魔方的描述问题的解决方法55.2.2 魔方整体旋转问题的解决办法56 .代码调试67总结18参考文献19塔里木大学课程设计网页魔方块游戏1. 摘要随着科技发展和社会进步,尤其是计算机大范围的普及,计算机应用逐渐由大规模计算的海量数据处理转向大规模的事物处理和对工作流的管理,这就产生一台式计算机为核心的管理系统。在80年

2、代成为一种流行的游戏,在中国把这游戏叫魔方块游戏。真正的魔方块总是让人不停地钻研,人们通过旋转魔方,开发自己的思想,可是有时候买一个魔方还是一件很麻烦的事情,很多人有自己的电脑,他们有时候也想能否在电脑上就能体验一下玩魔方的感觉。很多人都有自己的电脑,他们有时候也想能否在电脑上就能体验一下玩魔方的感觉。Java高级程序设计课程设计是计算机科学与技术专业的主要时实践性教学环节。解决具有一定规模的,具有实际意义的应用题,实现理论课所要求掌握的java解决实际问题。提高进行工程设计的基本技能及分析,解决实际问题的能力,为毕业设计和以后的工程实践打下良好的基础。解决具有一定规模的,具有实际意义的应用题

3、,实现理论课所要求掌握的java解决实际问题。2. 概述2.1课程设计目的1.真实的魔方总是让人不停地钻研,人们通过旋转魔方,开发自己的思维,可是有时候买一个魔方还是一件很麻烦的事情,很多人都有自己的电脑,他们有时候也想能否在电脑上就能体验一下玩魔方的感觉。2知道魔方的发明和流行历史。3知道魔方的流行玩法。4知道三阶魔方的结构。 5提高学生科技论文写作能力,规范完成课程设计报告。2.2课程设计内容和要求魔方,Rubliks Cube又叫魔术方块,也称鲁比克方块。是匈牙利布达佩斯建筑学院厄尔诺.鲁比克教授在1974年发明的。1.三阶魔方核心是一个轴,并由26个小正方体组成。包括中心方块6个,固定

4、不动,只一面有颜色。边角方块8个(3面有色)(角块)可移动 。边缘方块12个(2面有色)(棱块)亦可转动。2对魔方的应用也乐此不疲,数学与计算机方面,研究工作者以魔方为原型和工具,研究代数学,计算机图形图像,加密算法理论等等。3.在电脑上最好能都简单的通过鼠标控制魔方游戏使其操作更简单。4.当用户按要求排列好方块后,程序弹出对话框,提示用户成功的消息。5.绘制三维仿真魔方:绘制一个六面体,是一个3*3*3形式的魔方。6. 通过引进开发包DirectX基于C#,来实现绘制三维的仿真实的九宫格虚拟魔方,并且通过鼠标控制其整体的旋转,和各个层的旋转。3.系统需求分析3.1 系统目标使用所学知识制作一

5、个基于java的魔方游戏。3.2 主体功能这个程序定义了一些组件,工具栏按钮,文本区和菜单。魔板游戏程序设计通过绘制三维仿真魔方 等类来实现魔方游戏的整体功能。4.系统总体设计4.1 系统的功能模块划分魔方游戏所用到的一些重要的类以及之间的组合关系如下图。 5主要工作原理和关键技术介绍5.1 魔方旋转原理技术介绍魔方的旋转主要是通过算法记录旋转前各个小块的颜色,旋转后重新对其着色。对图形不停地进行渲染。 图 1-1 魔方块外面图魔方6面正方体。核心是一个轴,并由26小正方体组成包括中心方块有6个,固定不动只有一面有颜色。边角方块8个可转动。5.2关键问题解决思路5.2.1 三维魔方的描述问题的

6、解决方法定义了一个Block类,用来表示一个小的六面体,以及它所在的位置的世界坐标,和给它的每个面着色的实现。5.2.2 魔方整体旋转问题的解决办法通过鼠标点击拖动,控制魔方的整体旋转。定义了一个鼠标监听函数,鼠标移动后,坐标的改变将引起视图显示的角度的变化,然后视觉上给人以不同的效果。5.2.3魔方每一层旋转和打乱问题的解决方法每一层的旋转,定义了一个旋转函数,每次指定旋转层,根据其中心块的表面颜色,来执行函数。旋转函数通过改变块的颜色,视觉上给人以旋转后的效果,即重新对魔方的部分要求被改变的小块进行着色。5.3 魔方的打乱 魔方的打乱只是多次随机调用魔方的层旋转函数。系统实现 6.代码调试

7、import java.applet.*;import java.awt.*;import java.awt.event.*;import java.awt.image.*;import java.awt.geom.*;import static java.awt.RenderingHints.*;import javax.swing.Timer;public class m extends Applet implements ActionListener,MouseListener,MouseMotionListenerprivate int xyz; /4个坐标构成的面private do

8、uble x,y,z; /原始点private double x1,y1,z1; / 旋转后的点private double mxy=1,0,0,0,1,0,0,0,1; /旋转矩阵private int time=0;private int colors=0x70e33e,0x65f0e4,0xf20f2f,0xffff00,0x454545,0xaaaaaa; /六面色privateint 数量=4; /在此设置是(4*4)的魔方private int 视距=800; /越大越远private int 鼠标点=-1; /装的是点击后得到的方块在xyz里的索引private int 鼠标点击

9、=-1,-1; /点击时的鼠标坐标private int 鼠标移动=-1,-1;private double nou;/旋转矩阵private double 段号;private int 取轴;private BufferedImage bi;private Graphics2D big;/定时器public void actionPerformed(ActionEvent e)if(time>0)for(int i=0;i<数量*数量*6;i+)if(get轴(i)for(int u=0;u<4;u+)double hh=xxyziu,yxyziu,zxyziu;doubl

10、e hjh=setMxy(hh,nou);xxyziu=hjh0;yxyziu=hjh1;zxyziu=hjh2;time-;repaint();/Download by /初始化数据public void init()double 临时点=new double3;int i1,i2,i3,i4;int 直径=100;int 边距=8;int 中心点=(直径+边距)*数量-边距)/2;x=new double数量*数量*数量<<3;y=new double数量*数量*数量<<3;z=new double数量*数量*数量<<3;x1=new double数量*

11、数量*数量<<3;y1=new double数量*数量*数量<<3;z1=new double数量*数量*数量<<3;xyz=new int数量*数量*数量<<14;double X轴矩阵=1,0,0,0,0,1,0,-1,0;double Y轴矩阵=0,0,1,0,1,0,-1,0,0;for(i1=0;i1<数量;i1+)i4=i1<<2;xi4+3=xi4=i1*(直径+边距)-中心点;xi4+1=xi4+2=xi4+直径;yi4+1=yi4=中心点;yi4+2=yi4+3=yi4-直径;zi4=zi4+1=zi4+2=z

12、i4+3=中心点;for(i2=1;i2<数量;i2+)for(i1=0;i1<数量*4;i1+)xi2*数量*4+i1=xi1;zi2*数量*4+i1=zi1;yi2*数量*4+i1=yi1-i2*(直径+边距);for(i2=0;i2<3;i2+)for(i1=0;i1<数量*数量*4;i1+)临时点0=xi2*数量*数量*4+i1;临时点1=yi2*数量*数量*4+i1;临时点2=zi2*数量*数量*4+i1;临时点=setMxy(临时点,X轴矩阵);x(i2+1)*数量*数量*4+i1=临时点0;y(i2+1)*数量*数量*4+i1=临时点1;z(i2+1)*数

13、量*数量*4+i1=临时点2;for(i1=0;i1<数量*数量*4;i1+)临时点0=xi1;临时点1=yi1;临时点2=zi1;double sy=setMxy(临时点,Y轴矩阵);x数量*数量*16+i1=sy0;y数量*数量*16+i1=sy1;z数量*数量*16+i1=sy2;double kj=getMxy(getMxy(Y轴矩阵,Y轴矩阵),Y轴矩阵);sy=setMxy(临时点,kj);x数量*数量*20+i1=sy0;y数量*数量*20+i1=sy1;z数量*数量*20+i1=sy2;for(i1=0;i1<数量*数量*6;i1+)for(i2=0;i2<4

14、;i2+)xyzi1i2=i1*4+i2;addMouseMotionListener(this);addMouseListener(this);Timer t=new Timer(40,this);setBackground(new Color(0x00ff00);bi= new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);big = bi.createGraphics();t.start();/生成图像public void paint(Graphics g)int i,u,o;Graphics2D g2=(Graphics2D)

15、g;big.setColor(new Color(0x000000);big.fillRect(0,0,800,600);double xx1=new double3;for(i=0;i<数量*数量*24;i+)xx10=xi;xx11=yi;xx12=zi;xx1=setMxy(xx1,mxy);x1i=xx10;y1i=xx11;z1i=xx12;for(i=0;i<数量*数量*6;i+)int lx1=new int4;int ly1=new int4;int lz1=new int4;for(u=0;u<4;u+)lz1u=(int)(z1xyziu)-视距;lx1u

16、=(int)(x1xyziu)*400/-lz1u+400;ly1u=(int)(y1xyziu)*400/-lz1u+300;big.setColor(new Color(colorsi/数量/数量);if(getabc(lx10,ly10,lx11,ly11,lx13,ly13)big.fillPolygon(lx1,ly1,4);g2.drawImage(bi,0,0,null);public boolean get轴(int i)if(取轴=0)return (xxyzi0>段号-2 && xxyzi0<段号+2)|(xxyzi1>段号-2 &

17、& xxyzi1<段号+2) | (xxyzi2>段号-2 && xxyzi2<段号+2);else if(取轴=1)return (yxyzi0>段号-2 && yxyzi0<段号+2) | (yxyzi1>段号-2 && yxyzi1<段号+2) | (yxyzi2>段号-2 && yxyzi2<段号+2);elsereturn (zxyzi0>段号-2 && zxyzi0<段号+2) | (zxyzi1>段号-2 &&am

18、p; zxyzi1<段号+2) | (zxyzi2>段号-2 && zxyzi2<段号+2);/坐标旋转public double setMxy(double l,double m)double xx2=0,0,0;for(int u=0;u<3;u+)for(int o=0;o<3;o+)xx2u+=lo*mou;return xx2;/矩阵乘法public double getMxy(double xx,double yy) int i=0,u=0,o=0;double xx1=0,0,0,0,0,0,0,0,0;for(i=0;i<3;

19、i+)for(u=0;u<3;u+)for(o=0;o<3;o+)xx1iu+=xxio*yyou;return xx1;/判断是否是顺时针方向排列public boolean getabc(double ax,double ay,double bx,double by,double cx,double cy) double cax=cx-ax;double cay=cy-ay;double bcx=bx-cx;double bcy=by-cy;return cax*bcy>cay*bcx;public void mouseClicked(MouseEvent e)publi

20、c void mouseEntered(MouseEvent e)public void mouseExited(MouseEvent e)/鼠标按下时的动作public void mousePressed(MouseEvent e)if(e.getButton()=1)鼠标点=getf(e.getX(),e.getY();鼠标点击0=e.getX();鼠标点击1=e.getY();else if(e.getButton()=3)鼠标移动0=e.getX();鼠标移动1=e.getY();public double 取点(int n,double o)double li=oxyzn0;if(l

21、i>0)for(int i=1;i<4;i+)li=(li>oxyzni)?li:oxyzni;elsefor(int i=1;i<4;i+)li=(li<oxyzni)?li:oxyzni;return li;/鼠标放开时的动作public void mouseReleased(MouseEvent e)if(e.getButton()=1 && time=0 && 鼠标点!=-1)double 点=new double2;鼠标点击0=e.getX()-鼠标点击0;鼠标点击1=e.getY()-鼠标点击1;if(Math.abs(

22、鼠标点击0)>Math.abs(鼠标点击1)鼠标点击1=0;else鼠标点击0=0;double cos1=Math.cos(2*Math.PI/180);double sin1=Math.sin(2*Math.PI/180);if( (zxyz鼠标点0>zxyz鼠标点2-10 &&zxyz鼠标点0<zxyz鼠标点1+10) && (zxyz鼠标点1>zxyz鼠标点2-10 &&zxyz鼠标点1<zxyz鼠标点2+10) )double hu=Math.atan2(mxy01,mxy00);点0=鼠标点击0*Math

23、.cos(hu)+鼠标点击1*Math.sin(hu);点1=鼠标点击1*Math.cos(hu)-鼠标点击0*Math.sin(hu);if(Math.abs(点0)>Math.abs(点1)int l=(点0>0)?-1:1;if(zxyz鼠标点0<0)l*=-1;double anou=cos1,0,sin1*l,0,1,0,-sin1*l,0,cos1;nou=anou;段号=取点(鼠标点,y);取轴=1;elseint l=(点1>0)?-1:1;double anou=1,0,0,0,cos1,sin1*l,0,-sin1*l,cos1;nou=anou;段

24、号=取点(鼠标点,x);取轴=0;else if( (xxyz鼠标点0>xxyz鼠标点2-10 &&xxyz鼠标点0<xxyz鼠标点1+10) && (xxyz鼠标点1>xxyz鼠标点2-10 &&xxyz鼠标点1<xxyz鼠标点2+10) )double hu=Math.atan2(mxy21,mxy20);点0=鼠标点击0*Math.cos(hu)+鼠标点击1*Math.sin(hu);点1=鼠标点击1*Math.cos(hu)-鼠标点击0*Math.sin(hu);if(Math.abs(点0)>Math.ab

25、s(点1)int l=(点0>0)?-1:1;if(xxyz鼠标点0>0)l*=-1;double anou=cos1,0,sin1*l,0,1,0,-sin1*l,0,cos1;nou=anou;段号=取点(鼠标点,y);取轴=1;elseint l=(点1>0)?-1:1;double anou=cos1,sin1*l,0,-sin1*l,cos1,0,0,0,1;nou=anou;段号=取点(鼠标点,z);取轴=2;elsedouble hu=Math.atan2(mxy01,mxy00);点0=鼠标点击0*Math.cos(hu)+鼠标点击1*Math.sin(hu)

26、;点1=鼠标点击1*Math.cos(hu)-鼠标点击0*Math.sin(hu);if(Math.abs(点0)>Math.abs(点1)int l=(点1>0)?-1:1;System.out.println(yxyz鼠标点0);if(yxyz鼠标点0<0)l*=-1;double anou=cos1,sin1*l,0,-sin1*l,cos1,0,0,0,1;nou=anou;段号=取点(鼠标点,z);取轴=2;Elseint l=(点1>0)?-1:1;double anou=1,0,0,0,cos1,sin1*l,0,-sin1*l,cos1;nou=anou

27、;段号=取点(鼠标点,x);取轴=0;time=45;/System.out.println(hu*180/Math.PI);鼠标点=-1;鼠标移动0=鼠标移动1=-1;/鼠标按下移动时的动作public void mouseDragged(MouseEvent e)if(鼠标移动0!=-1&&鼠标移动1!=-1)double oix=(鼠标移动0-e.getX()*Math.PI/720;double oiy=(鼠标移动1-e.getY()*Math.PI/720;double fff=1,0,0,0,1,0,0,0,1;fff00=fff22=Math.cos(oix);f

28、ff02=Math.sin(oix);fff20=-fff02;double fff1=1,0,0,0,1,0,0,0,1;fff111=fff122=Math.cos(oiy);fff112=Math.sin(oiy);fff121=-fff112;mxy=getMxy(mxy,fff);mxy=getMxy(mxy,fff1);鼠标移动0=e.getX();鼠标移动1=e.getY();public void mouseMoved(MouseEvent e)/判断鼠标点是在哪个方块上public int getf(int xx,int yy)boolean t1=new boolean4;

29、double x4,y4,z4,x5,y5,z5;for(int i=0;i<数量*数量*6;i+)for(int j=0;j<4;j+)int l=(j=3)?0:j+1;z4=z1xyzij-视距;x4=x1xyzij*400/-z4+400;y4=y1xyzij*400/-z4+300;z5=z1xyzil-视距;x5=x1xyzil*400/-z5+400;y5=y1xyzil*400/-z5+300;t1j=getabc(x4,y4,x5,y5,xx,yy);if(t10&&t11&&t12&&t13)return i;return -1; 图 1-2 魔方块后面旋转运行旋转的方块是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论