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

提交評論