基于Java語言的俄羅斯方塊游戲程序設(shè)計 畢業(yè)論文_第1頁
基于Java語言的俄羅斯方塊游戲程序設(shè)計 畢業(yè)論文_第2頁
基于Java語言的俄羅斯方塊游戲程序設(shè)計 畢業(yè)論文_第3頁
基于Java語言的俄羅斯方塊游戲程序設(shè)計 畢業(yè)論文_第4頁
基于Java語言的俄羅斯方塊游戲程序設(shè)計 畢業(yè)論文_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、課程設(shè)計說明書 NO.1Java俄羅斯方塊游戲的設(shè)計一. 課程設(shè)計的目的 Java語言是當今流行的網(wǎng)絡(luò)編程語言,它具有面向?qū)ο蟆⒖缙脚_、分布應(yīng)用等特點。面向?qū)ο蟮拈_發(fā)方法是當今世界最流行的開發(fā)方法,它不僅具有更貼近自然的語義,而且有利于軟件的維護和繼承。為了進一步鞏固課堂上所學到的知識,深刻把握Java語言的重要概念及其面向?qū)ο蟮奶匦?,鍛煉學生熟練的應(yīng)用面向?qū)ο蟮乃枷牒驮O(shè)計方法解決實際問題的能力,開設(shè)了Java程序設(shè)計課程設(shè)計。通過此次課程設(shè)計,鞏固所學Java語言基本知識,增進Java語言編輯基本功,掌握JDK、Editplus、Eclipse、JCreator等開發(fā)工具的運用,拓寬常用類庫

2、的應(yīng)用。使學生通過該教學環(huán)節(jié)與手段,把所學課程及相關(guān)知識加以融會貫通,全面掌握Java語言的編程思想及面向?qū)ο蟪绦蛟O(shè)計的方法,為今后從事實際工作打下堅實的基礎(chǔ)。二. 設(shè)計方案論證 2.1 設(shè)計思路一個網(wǎng)絡(luò)俄羅斯方塊的游戲,玩家可以在網(wǎng)絡(luò)的任何地方互相對戰(zhàn)。運行這個應(yīng)用程序,需要安裝JRE(Java Runtime environment,java運行 環(huán)境),資源文件包括: play.bat,可以直接運行這個批處理文件來運行“網(wǎng)絡(luò)俄羅斯方塊”(請注意在同一目錄下是否存在matrix.jar文件) matrix.jar 打包的“網(wǎng)絡(luò)俄羅斯方塊”游戲,它把所有網(wǎng)絡(luò)俄羅斯方塊游戲的類和資源都集中到了

3、一起,運行時只要存在它就可以了。我們可以在控制臺下通過命令行“java -jar matrix.jar”來運行,也可以直接運行。play.bat 文件進入游戲。 matrix JBuilder的project文件 所有網(wǎng)絡(luò)俄羅斯方塊游戲的源碼和資源都在這個目錄下面。讀者可以用JBuilder來打開matrix.jpx文件。JavaDoc示例 一個關(guān)于javadoc命令使用的例子。 a.java 示例代碼 doc是由示例程序生成的文檔-java programming game series three guiding use a network of 57 games, Players can

4、 network anywhere mutual war. Note : to run this application, need to install the 課程設(shè)計說明書 NO.2JRE (Java Runtime environment, java runtime environment) of this chapter as a resource document include : play.bat readers can directly run this batch file to run "Network Russian box"(please note

5、 the the same directory existence matrix.jar) matrix.jar packed "Network Russia Slovakia box "game, it all network game of the Russian box category and resources are concentrated together. running as long as it can. We can console command "java-jar matrix.jar" Run, have direct ac

6、cess to documents play.bat running game. Matrix JBuilder project documents the Russian box all network games and FOSS resources.2.2程序結(jié)構(gòu)、思想和相關(guān)技術(shù)這個程序共包含了5個.JAVA源文件,有30個類文件,分別來控制游戲的主界面,控制面板,俄羅斯方塊的隨機產(chǎn)生,對俄羅斯方塊的保存,還能選擇他的前景色,背景色。ErsBlock類的實現(xiàn):這個類繼承線程類,由 4 * 4 個方格(ErsBox)構(gòu)成一個塊, 控制塊的移

7、動、下落、變形等,這是實現(xiàn)下路的方塊分別對應(yīng)對7種模型的28種狀態(tài) / 共28種狀態(tài)。   0x0f00, 0x4444, 0x0f00, 0x4444, / 長條型的四種狀態(tài)   0x04e0, 0x0464, 0x00e4, 0x04c4, / 'T'型的四種狀態(tài) 0x6220, 0x1700, 0x2230, 0x0740, / '7'型的四種狀態(tài) 

8、      0x6440, 0x0e20, 0x44c0, 0x8e00, / 反'7'型的四種狀態(tài)       0x0660, 0x0660, 0x0660, 0x0660, / 方塊的四種狀態(tài) 在這個類中用構(gòu)造方法來實現(xiàn)某個具體的方塊,方法中的參數(shù)有style,對應(yīng)那28中狀態(tài)中的一個,x,y控制起始位置level是游戲的等級也就是方塊下落的速度,

9、canvas就是方快出現(xiàn)的畫板。2.3俄羅斯方塊類的構(gòu)造方法public static void main(String argus) ERS_Block ers = new ERS_Block("俄羅斯方塊游戲 V1.0 Author:Vincent"); 課程設(shè)計說明書 NO.3WindowListener win_listener = new WinListener(); ers.addWindowListener(win_listener); /俄羅斯方塊類的構(gòu)造方法2.3 類、包及其描述java類的動態(tài)裝載是java語言能力動態(tài)性的根源;研究理解它是每一個java

10、設(shè)計和代碼人員不能忽視的特點,因為很多底層和問題和不理解的技術(shù)都來源于它;可以這么說它是熱插撥(plug and pay)的根本,是IOC(Sping/PicoContant)的技術(shù)最有力的支持,能善用它為設(shè)計和實現(xiàn)一個很好的框架必不可少的技術(shù)。對于其他技術(shù)(C/C+)沒有動態(tài)特性的語言來說,要運用底層的OS系統(tǒng)所提供的機制,設(shè)計人員必須多費一些功夫來編寫額外的程序代碼(例如Windows 平臺上需要使用LoadLibrary()與GetProcAddress()兩個Win32 API 來完成動態(tài)的需求),這些額外編寫的程序代碼也會因為平臺的不同而不同,畢竟這些額外的程序代碼本身的運作邏輯很少

11、關(guān)聯(lián),所以維護起來雖不算復(fù)雜,但仍有其難度。主要類RuntimeCode描述如主下,P050705052 Class ERS_Blockjava.lang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Frame P050705052.ERS_BlockAll Implemented Interfaces: javax.accessibility.Accessible, java.awt.image.ImageObserver, 沈 陽 大 學課程設(shè)計說明書 NO.4ava.awt.MenuConta

12、iner, java.io.Serializable public class ERS_Block extends java.awt.FrameSee Also: Serialized Form 圖1 fieslds summary 圖2 Fields inherited from class java.awt.Frame 沈 陽 大 學課程設(shè)計說明書 NO.5 圖3 Fields inherited from class java.awt.Component 圖4 Fields inherited from imter face java.image.ImageObserver 圖5 Met

13、hods inherited from class java.awt.Window 圖6 Method Summary 沈 陽 大 學課程設(shè)計說明書 NO.6 圖7 Methods inherited from class java.awt.Frame 圖8 Methods inherited from class java.awt.Component 沈 陽 大 學課程設(shè)計說明書 NO.7圖9 Methods inherited from class java.awt.Comtainer 圖10 Methods inherited from class java.lang.Object 圖1

14、1 Methods inherited from interface java.awt.MenuContainer 圖12 Methods inherited from class java.lang.Object 沈 陽 大 學課程設(shè)計說明書 NO.8圖13 基本參數(shù)截圖注釋:以上的圖1-13 為在設(shè)計過程中,基本設(shè)置的幾個參數(shù)變量,在設(shè)計的過程中對重要參數(shù)的截圖。三設(shè)計結(jié)果與分析 本游戲的操作流程非常簡單,用戶啟動游戲后,即進入游戲主畫面,屏幕開始顯示為歡迎畫面。用戶按下開始游戲按鈕后,就可以開始玩游戲了,當用戶想暫停時,再次按一下暫停游戲按鈕,游戲就暫停了,在暫停的情況下再按開始游戲按鈕

15、,游戲繼續(xù)運行。任何時候按退出游戲按鈕,游戲都會終止。如果用戶想要提高游戲的難度就可以按下提高級數(shù)按鈕。 沈 陽 大 學課程設(shè)計說明書 NO.9 本游戲包含幾種形狀的方塊。分別為長方型、T型、7型、反7型、方型、上型。每種形狀又有四種變換方式。如圖14 圖14 設(shè)計的方快形狀 在附錄中的代碼運行后,后出現(xiàn)運行的效果圖,具體效果如圖15所顯示。 圖15 開始界面右邊信息窗體的布局分別包括開始游戲、提高級數(shù)、降低級數(shù)、游戲暫停、退出游戲5個按鈕,使用者可以根據(jù)自己的需求選擇不同的按鈕。 沈 陽 大 學課程設(shè)計說明書 NO.10 游戲畫布類 :小方塊邊長 :final int 0unitSize =

16、 30正方格的行數(shù): int rowNum方格的列數(shù) :int columnNum允許有多少行未削 :int maxAllowRowNum新出現(xiàn)塊的起始行坐標 :int blockInitRow出現(xiàn)塊的起始列坐標: int blockInitCol屏幕數(shù)組: int scrArr對方快的引用:Block b以下幾個圖分別為在運行后的結(jié)果截圖。圖16為在開始后落下方塊的截圖;圖17為得分后的截圖;圖18為提高級數(shù)后的截圖;圖19為游戲方塊落滿后的截圖。圖16 開始后落下方塊 沈 陽 大 學課程設(shè)計說明書 NO.11圖16注釋:返回新塊的初始行坐標方法: public int getInitRow

17、()返回新塊的初始行坐標 :return(blockInitRow) 返回新塊的初始列坐標方法 :public int getInitCol()返回新塊的初始列坐標 :return(blockInitCol)圖17 得分后 圖17注釋:滿行刪除方法 :void deleteFullLine() 沈 陽 大 學課程設(shè)計說明書 NO.12圖18 提高級數(shù)后圖18的注釋:塊的模式號(0-6):int blockType塊的翻轉(zhuǎn)狀態(tài)(0-3):int turnState 塊的下落狀態(tài) :int blockState塊在畫布上的坐標:int row,col 沈 陽 大 學課程設(shè)計說明書 NO.13圖19

18、游戲方塊落滿四. 設(shè)計心得體會 通過這次課程設(shè)計,使我進一步鞏固和加深學生所學的專業(yè)理論知識,培養(yǎng)學生設(shè)計、計算、繪圖、計算機應(yīng)用、文獻查閱、報告撰寫等基本技能;培養(yǎng)學生獨立分析和解決實際問題的能力;培養(yǎng)學生的團隊協(xié)作精神、創(chuàng)新意識、嚴肅認真的治學態(tài)度和嚴謹求實的工作作風看通過該課程設(shè)計,全面系統(tǒng)的理解了編譯原理程序構(gòu)造的一般原理和基本實現(xiàn)方法。把死板的課本知識變得生動有趣,激發(fā)了學習的積極性。把學過的計算機編譯原理 沈 陽 大 學課程設(shè)計說明書 NO.14的知識強化,能夠把課堂上學的知識通過自己設(shè)計的程序表示出來,加深了對理論知識的理解。以前對與計算機操作系統(tǒng)的認識是模糊的,概念上的,現(xiàn)在通

19、過自己動手做實驗,從實踐上認識了Java是如何編寫命令的,如何協(xié)調(diào)計算機內(nèi)部各個部件運行,對計算機編譯原理的認識更加深刻。課程設(shè)計中程序比較復(fù)雜,在調(diào)試時應(yīng)該仔細,在程序調(diào)試時,注意構(gòu)造,將不必要的命令去除。深入的了解了JAVA語言的嚴謹性,了解了JAVA語言中AWT的使用,為以后學習打下良好的基礎(chǔ)。JAVA是一種面向?qū)ο蟮某绦蛘Z言。熟悉數(shù)據(jù)庫的基本知識及一種以上數(shù)據(jù)庫系統(tǒng)開發(fā)軟件。五參考文獻1 謝宋和, 甘 勇. 單片機模糊控制系統(tǒng)設(shè)計與應(yīng)用實例M. 北京: 電子工業(yè)出版社, 1999.5:20-252 范立南, 謝子殿. 單片機原理及應(yīng)用教程M. 北京: 北京大學出版社, 2006.1:1

20、23-1303 范立南, 韓曉微, 王忠石等. 基于多結(jié)構(gòu)元的噪聲污染灰度圖像邊緣檢測研究4. 武漢大學學報(工學版), 2003,49(3):45-49 沈 陽 大 學課程設(shè)計說明書 NO.15附錄:源代碼package P050705052;import java.awt.*; import java.awt.event.*; /俄羅斯方塊類 public class ERS_Block extends Frame public static boolean isPlay=false; public static int level=1,score=0; public static Tex

21、tField scoreField,levelField; public static MyTimer timer; GameCanvas gameScr; public static void main(String argus) ERS_Block ers = new ERS_Block("俄羅斯方塊游戲 V1.0 Author:Vincent"); WindowListener win_listener = new WinListener(); ers.addWindowListener(win_listener); /俄羅斯方塊類的構(gòu)造方法 ERS_Block(St

22、ring title) super(title);setSize(600,480); setLayout(new GridLayout(1,2); gameScr = new GameCanvas(); gameScr.addKeyListener(gameScr); timer = new MyTimer(gameScr); timer.setDaemon(true); timer.start(); timer.suspend(); add(gameScr);Panel rightScr = new Panel(); rightScr.setLayout(new GridLayout(2,1

23、,0,30); rightScr.setSize(120,500); add(rightScr); 沈 陽 大 學課程設(shè)計說明書 NO.16/ MyPanel infoScr = new MyPanel(); infoScr.setLayout(new GridLayout(4,1,0,5); infoScr.setSize(120,300); rightScr.add(infoScr); /定義標簽和初始值 Label scorep = new Label("分數(shù):",Label.LEFT); Label levelp = new Label("級數(shù):"

24、;,Label.LEFT); scoreField = new TextField(8); levelField = new TextField(8); scoreField.setEditable(false); levelField.setEditable(false); infoScr.add(scorep); infoScr.add(scoreField); infoScr.add(levelp); infoScr.add(levelField); scorep.setSize(new Dimension(20,60); scoreField.setSize(new Dimension

25、(20,60); levelp.setSize(new Dimension(20,60); levelField.setSize(new Dimension(20,60); scoreField.setText("0"); levelField.setText("1"); /右邊控制按鈕窗體的布局 MyPanel controlScr = new MyPanel(); controlScr.setLayout(new GridLayout(5,1,0,5); rightScr.add(controlScr); /定義按鈕play Button play_

26、b = new Button("開始游戲"); play_b.setSize(new Dimension(50,200); play_b.addActionListener(new Command(Command.button_play,gameScr);/定義按鈕Level UP Button level_up_b = new Button("提高級數(shù)"); level_up_b.setSize(new Dimension(50,200); level_up_b.addActionListener(new Command(Command.button_

27、levelup,gameScr); 沈 陽 大 學課程設(shè)計說明書 NO.17/定義按鈕Level Down Button level_down_b =new Button("降低級數(shù)"); level_down_b.setSize(new Dimension(50,200); level_down_b.addActionListener(new Command(Command.button_leveldown,gameScr); /定義按鈕Level Pause Button pause_b =new Button("游戲暫停"); pause_b.se

28、tSize(new Dimension(50,200); pause_b.addActionListener(new Command(Command.button_pause,gameScr); /定義按鈕Quit Button quit_b = new Button("退出游戲"); quit_b.setSize(new Dimension(50,200); quit_b.addActionListener(new Command(Command.button_quit,gameScr); controlScr.add(play_b); controlScr.add(le

29、vel_up_b); controlScr.add(level_down_b); controlScr.add(pause_b); controlScr.add(quit_b); setVisible(true); gameScr.requestFocus(); /重寫MyPanel類,使Panel的四周留空間 class MyPanel extends Panel public Insets getInsets() return new Insets(30,50,30,50); /游戲畫布類 class GameCanvas extends Canvas implements KeyList

30、ener final int unitSize = 30; /小方塊邊長 int rowNum; /正方格的行數(shù) int columnNum; /正方格的列數(shù) int maxAllowRowNum; /允許有多少行未削 沈 陽 大 學課程設(shè)計說明書 NO.18int blockInitRow; /新出現(xiàn)塊的起始行坐標 int blockInitCol; /新出現(xiàn)塊的起始列坐標 int scrArr; /屏幕數(shù)組 Block b; /對方快的引用 /畫布類的構(gòu)造方法 GameCanvas() rowNum = 15; columnNum = 10; maxAllowRowNum = rowNum

31、 - 2; b = new Block(this); blockInitRow = rowNum - 1; blockInitCol = columnNum/2 - 2; scrArr = new int 3232; /初始化屏幕,并將屏幕數(shù)組清零的方法 void initScr() for(int i=0;i<rowNum;i+) for (int j=0; j<columnNum;j+) scrArrij=0; b.reset(); repaint(); /重新刷新畫布方法 public void paint(Graphics g) for(int i = 0; i <

32、rowNum; i+) for(int j = 0; j < columnNum; j+) drawUnit(i,j,scrArrij); /畫方塊的方法 public void drawUnit(int row,int col,int type) scrArrrowcol = type; Graphics g = getGraphics(); switch(type) /表示畫方快的方法 沈 陽 大 學課程設(shè)計說明書 NO.19case 0: g.setColor(Color.black);break; /以背景為顏色畫 case 1: g.setColor(Color.blue);b

33、reak; /畫正在下落的方塊 case 2: g.setColor(Color.magenta);break; /畫已經(jīng)落下的方法 g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,unitSize,unitSize,true); g.dispose(); public Block getBlock() return b; /返回block實例的引用 /返回屏幕數(shù)組中(row,col)位置的屬性值 public int getScrArrXY(int row,int col) if (row < 0 | row &g

34、t;= rowNum | col < 0 | col >= columnNum) return(-1); else return(scrArrrowcol); /返回新塊的初始行坐標方法 public int getInitRow() return(blockInitRow); /返回新塊的初始行坐標 /返回新塊的初始列坐標方法 public int getInitCol() return(blockInitCol); /返回新塊的初始列坐標 /滿行刪除方法 void deleteFullLine() int full_line_num = 0; int k = 0; for (i

35、nt i=0;i<rowNum;i+) boolean isfull = true; L1:for(int j=0;j<columnNum;j+) 沈 陽 大 學課程設(shè)計說明書 NO.20if(scrArrij = 0) k+; isfull = false; break L1; if(isfull) full_line_num+; if(k!=0 && k-1!=i && !isfull) for(int j = 0; j < columnNum; j+) if (scrArrij = 0) drawUnit(k-1,j,0); else d

36、rawUnit(k-1,j,2); scrArrk-1j = scrArrij; for(int i = k-1 ;i < rowNum; i+) for(int j = 0; j < columnNum; j+) drawUnit(i,j,0); scrArrij=0; ERS_Block.score += full_line_num; ERS_Block.scoreField.setText(""+ERS_Block.score); /判斷游戲是否結(jié)束方法 boolean isGameEnd() for (int col = 0 ; col <colu

37、mnNum; col +) if(scrArrmaxAllowRowNumcol !=0) return true; return false; public void keyTyped(KeyEvent e) public void keyReleased(KeyEvent e) 沈 陽 大 學課程設(shè)計說明書 NO.21/處理鍵盤輸入的方法 public void keyPressed(KeyEvent e) if(!ERS_Block.isPlay) return; switch(e.getKeyCode() case KeyEvent.VK_DOWN:b.fallDown();break

38、; case KeyEvent.VK_LEFT:b.leftMove();break; case KeyEvent.VK_RIGHT:b.rightMove();break; case KeyEvent.VK_SPACE:b.leftTurn();break; /處理控制類 class Command implements ActionListener static final int button_play = 1; /給按鈕分配編號 static final int button_levelup = 2; static final int button_leveldown = 3; sta

39、tic final int button_quit = 4; static final int button_pause = 5; static boolean pause_resume = true; int curButton; /當前按鈕 GameCanvas scr; /控制按鈕類的構(gòu)造方法 Command(int button,GameCanvas scr) curButton = button; this.scr=scr; /按鈕執(zhí)行方法 public void actionPerformed (ActionEvent e) switch(curButton) case butto

40、n_play:if(!ERS_Block.isPlay) scr.initScr(); 沈 陽 大 學課程設(shè)計說明書 NO.22ERS_Block.isPlay = true; ERS_Block.score = 0; ERS_Block.scoreField.setText("0"); ERS_Block.timer.resume(); scr.requestFocus(); break; case button_levelup:if(ERS_Block.level < 10) ERS_Block.level+; ERS_Block.levelField.setTe

41、xt(""+ERS_Block.level); ERS_Block.score = 0; ERS_Block.scoreField.setText(""+ERS_Block.score); scr.requestFocus(); break; case button_leveldown:if(ERS_Block.level > 1) ERS_Block.level-; ERS_Block.levelField.setText(""+ERS_Block.level); ERS_Block.score = 0; ERS_Block.

42、scoreField.setText(""+ERS_Block.score); scr.requestFocus(); break; case button_pause:if(pause_resume) ERS_Block.timer.suspend(); pause_resume = false; else ERS_Block.timer.resume(); pause_resume = true; scr.requestFocus(); break; case button_quit:System.exit(0); /方塊類 class Block static int

43、 pattern = 沈 陽 大 學課程設(shè)計說明書 NO.230x0f00,0x4444,0x0f00,0x4444,/用十六進至表示,本行表示長條四種狀態(tài) 0x04e0,0x0464,0x00e4,0x04c4, 0x4620,0x6c00,0x4620,0x6c00, 0x2640,0xc600,0x2640,0xc600, 0x6220,0x1700,0x2230,0x0740, 0x6440,0x0e20,0x44c0,0x8e00, 0x0660,0x0660,0x0660,0x0660 ; int blockType; /塊的模式號(0-6) int turnState; /塊的翻

44、轉(zhuǎn)狀態(tài)(0-3) int blockState; /快的下落狀態(tài) int row,col; /塊在畫布上的坐標 GameCanvas scr; /塊類的構(gòu)造方法 Block(GameCanvas scr) this.scr = scr; blockType = (int)(Math.random() * 1000)%7; turnState = (int)(Math.random() * 1000)%4; blockState = 1; row = scr.getInitRow(); col = scr.getInitCol(); /重新初始化塊,并顯示新塊 public void reset

45、() blockType = (int)(Math.random() * 1000)%7; turnState = (int)(Math.random() * 1000)%4; blockState = 1; row = scr.getInitRow(); col = scr.getInitCol(); dispBlock(1); /實現(xiàn)“塊”翻轉(zhuǎn)的方法 public void leftTurn() if(assertValid(blockType,(turnState + 1)%4,row,col) dispBlock(0); turnState = (turnState + 1)%4; dis

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論