




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
基于JAVA的掃雷小游戲引言本次課程設計目的在于設計開發一個類似windows自帶掃雷游戲的小游戲,實現基本的掃雷面板及掃雷的游戲功能、游戲數據存儲、游戲計時等功能。設計采用Windows下的eclipse開發工具由本人獨立完成。系統設計本游戲采用快速原型模型的軟件開發方法設計,總共經歷了八個版本的修改最終完成設計要求。在第一個版本中,實現如下功能:基于JFrame的掃雷框架的建立:使用JFrame建立起如圖的所示的程序框架,雷區為12*12,添加JPanel和JButton,采用setBounds的布局方式而非內置的布局方法。基于Random方法的虛擬雷盤的建立和動態修改:通過Random產生出一個14*14的數組,其中,二維數組邊緣對應邊框標記值為2,產生的雷點標記為1,普通點標記為0。再次建立一個12*12的數組對應實際的游戲面板,初始值為0,遍歷14*14的數組中非邊緣的元素,將每個格子周圍的地雷數目賦值給對應的12*12數組,地雷仍然用-1來表示,最后遍歷12*12的數組同時把數組中非0非-1的數繪制到JPanel上,值為-1的元素向面板對應位置添加一個地雷的圖片(注:地雷圖片來自Windows7自帶掃雷游戲的截圖)。基于Button的雷區覆蓋面板建立以及虛擬雷盤的ActionListener的連接:將生成好的底板覆蓋上12*12的Button并且為每個Button添加ActionListener,實現點擊后隱藏對應的Button功能。結果如下圖:重新開始及其按鍵功能的實現:通過“重新開始”按鍵重新生成雷區以及重新覆蓋Button到所有格子。關于按鍵及其功能:通過“關于”按鍵彈出一個MessageDialog。在第二個版本中,實現如下功能:新增利用遞歸算法實現的一次點開一片區域功能:通過數據結構中的走迷宮算法在按鍵監聽中加入了連鎖點亮的算法,點亮該格,然后依次遍歷12*12表的周圍9格,發現為空格即遞歸調用遍歷算法,發現數字即點亮該格并return,初步實現了如圖所示的功能:新增虛擬訪問判定表的建立和刷新及修改:即通過查找已標記的正確的雷并且計數,如果達到了設定了雷的最大值即執行游戲結束的方法。新增失敗提示框和自動刷新功能:即點亮了地雷的區域后,自動彈出對話框提示失敗并且執行游戲結束的方法。對原boom表進行了改動,解決了虛擬表和實際表的下標錯位問題將原12*12的數組擴充到14*14。在第三個版本中,實現如下功能:修復了一個導致重新開始后第一行雷點位置不變的BUG:重寫游戲結束的算法,改變循環的起始點,使其可以正確生成虛擬的雷點。新增了右鍵標記、取消雷點的功能:為每個Button添加了MouseListener從而實現了當點擊鼠標右鍵時可以修改Button上文字,顯示為雷,并且當該Button已經顯示了雷的時候再次右鍵該Button可以取消文字顯示。在第四個版本中,實現如下功能:調整了按鍵監聽的點亮區域算法,當且僅當點擊處周圍沒有地雷時才會觸發openButton()算法,否則僅顯示當前區域,提高了游戲性:重寫了Button的ActionListener,按條件區分是否執行遞歸點亮算法,當且僅當單擊區域為空的時候才執行點亮算法,否則僅點亮該區域。新增了基于System.currentTimeMillis()的計時器功能,計時器與重新開始游戲對應同步更新:通過在游戲開始時獲取一個currentTimeMillis()以及實時監控并刷新計時器窗口的值為當前時間減去初始時間除以1000,為節約內存,單獨為計時器開辟了一個線程,每工作一次該線程休息0.5秒。在第五個版本中,實現如下功能:更改了獲勝和失敗后的提示信息:將本次游戲時間加入了游戲結束時的提示窗口。新增了“記錄”窗體的框架和面板:增加了一個新的JFrame,對應“記錄”按鈕。在第六個版本中,實現如下功能:再次改進了按鍵監聽的點亮區域算法:進行遞歸遍歷時將正相鄰和斜相鄰兩種情況分開,使斜相鄰的地雷值為0的格子不再會被自動點亮,提高了游戲性,至此版本為止,該算法已經完全符合預期要求。游戲后臺新加入了recordlist類,用來存儲和處理光榮榜的數據:該類擁有10條記錄以及插入新數據到對應位置的功能。對記錄窗體的改動:通過取消設定recordFrame類的mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);以及設定recFrame.hide();方法解決了關閉窗口時導致的程序異常終止的錯誤。在第七個版本中,實現如下功能:記錄的讀取與存儲:通過ObjectOutputStream和ObjectInputStream成功實現了對光榮榜文件的存取功能。并且重新定義了上一版本的光榮榜信息控件,增加了獲勝時修改光榮榜并且自動保存文件的功能,同時新增nameInput窗口類到游戲結束時并且成績足以進入光榮榜時調用的方法中,用于輸入獲取進入光榮榜的玩家信息。在最終版本中,實現如下功能:記錄與游戲的同步措施:通過更改FileOutputStream的實現位置到nameInputer中的actionListener中并且將recordlist和usedTime以參數形式通過構造函數傳入nameInputer類中成功實現了光榮榜數據文件的存取。系統實現Sweeper類:importjava.awt.event.*;importjavax.swing.*;importjava.awt.*;importjava.util.Random;importjava.io.*;publicclasssweeper{Buttonboom[][]=newButton[14][14]; intvisualBoom[][]=newint[14][14]; intvisitTest[][]=newint[14][14]; intnumOfBoom=0; LabeltimeLabel=newLabel(); timeRunnablerunnable=newtimeRunnable(); ThreadtimeThread=newThread(runnable); longstartTime; longusedTime; JFramemainframe; myPanelpanel; ImageboomImage=newImageIcon("boom.jpg").getImage(); recordlistlist=newrecordlist(); JButtonstartButton; JButtonaboutButton; JButtonrecordButton; //類的屬性 voidcreateWindow(){ //創建基礎框架 mainframe=newJFrame("掃雷"); panel=newmyPanel(); //框架及面板 startButton=newJButton(); startButton.setText("重新開始"); startButton.setFont(newFont("楷書",Font.ITALIC,15)); startButton.setFocusPainted(false); startButton.addActionListener(newstartListener()); aboutButton=newJButton(); aboutButton.setText("關于"); aboutButton.setFont(newFont("楷書",Font.ITALIC,15)); aboutButton.setFocusPainted(false); aboutButton.addActionListener(newaboutListener()); recordButton=newJButton(); recordButton.setText("記錄"); recordButton.setFont(newFont("楷書",Font.ITALIC,15)); recordButton.addActionListener(newrecordListener()); recordButton.setFocusPainted(false); //按鈕 timeLabel.setBounds(350,220,30,30); timeLabel.setBackground(Color.white); startTime=System.currentTimeMillis(); timeThread.start(); panel.setLayout(null); panel.setBackground(Color.BLACK); startButton.setBounds(320,40,100,30); panel.add(startButton); recordButton.setBounds(320,100,100,30); panel.add(recordButton); aboutButton.setBounds(320,160,100,30); panel.add(aboutButton); panel.add(timeLabel); mainframe.setSize(450,340); mainframe.setVisible(true); mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainframe.add(panel); //框架布局 } voidsetBoom() //生成虛擬雷盤的雷區 { for(introw=0;row<14;row++) for(intcol=0;col<14;col++) { boom[row][col]=newButton(); visualBoom[row][col]=0; } //初始化雷區 for(inti=0;i<14;i++) { visualBoom[0][i]=-2; visualBoom[i][0]=-2; visualBoom[i][13]=-2; visualBoom[13][i]=-2; } //虛擬雷盤封邊 intx,y; Randomr=newRandom(); for(intcount=0;count<16;) { x=r.nextInt(12); y=r.nextInt(12); if(visualBoom[x+1][y+1]==0) { visualBoom[x+1][y+1]=-1; count++; } } } //生成地雷,邊緣:-2雷點:-1正常點:0 voidhandleBoom(){ //炸彈信息轉化 inttemp[][]=newint[14][14]; for(introw=0;row<14;row++) for(intcol=0;col<14;col++) { temp[row][col]=visualBoom[row][col]; } for(introw=1;row<13;row++) for(intcol=1;col<13;col++) { temp[row][col]=countBoom(row,col); } numOfBoom=0; visualBoom=temp; } intcountBoom(intx,inty){ //周圍炸彈計數器 intcount=0; if(visualBoom[x][y]!=-1) { if(visualBoom[x-1][y-1]==-1) count++; if(visualBoom[x][y-1]==-1) count++; if(visualBoom[x+1][y-1]==-1) count++; if(visualBoom[x+1][y]==-1) count++; if(visualBoom[x+1][y+1]==-1) count++; if(visualBoom[x][y+1]==-1) count++; if(visualBoom[x-1][y+1]==-1) count++; if(visualBoom[x-1][y]==-1) count++; }else count=-1; returncount; } //雷:-1雷數:(int) voidshowButton() //加入雷區按鈕到面板上 { for(introw=1;row<13;row++) for(intcol=1;col<13;col++) { boom[row][col].setBounds((row-1)*25,(col-1)*25,25,25); boom[row][col].setFocusable(false); boom[row][col].addActionListener(newbuttomListener(row,col)); boom[row][col].addMouseListener(newrightClick(row,col)); panel.add(boom[row][col]); } } classmyPanelextendsJPanel{ //面板內部類 publicvoidpaintComponent(Graphicsg) { g.setColor(Color.gray); g.fillRect(0,0,300,300); g.setColor(Color.black); for(intline=0;line<=300;line+=25) g.drawLine(line,0,line,300); for(introw=0;row<=300;row+=25) g.drawLine(0,row,300,row); //繪制基本格 g.setFont(newFont("楷書",Font.ITALIC,13)); g.drawString("MineSweeperVer3.0",305,20); //繪制版本信息 g.drawString("時間",310,240); for(introw=1;row<13;row++) for(intcol=1;col<13;col++) { if(visualBoom[row][col]!=-1&&visualBoom[row][col]!=0) g.drawString(Integer.toString(visualBoom[row][col]),(row-1)*25+8,(col-1)*25+20); elseif(visualBoom[row][col]==-1) { g.drawImage(boomImage,(row-1)*25,(col-1)*25,25,25,this); } } } } //面板繪圖 classbuttomListenerimplementsActionListener{ //各種監聽器 introw,col; buttomListener(intx,inty) { row=x; col=y; } publicvoidactionPerformed(ActionEvente){ if(visualBoom[row][col]==0) { refreshVisitTest(); openButton(row,col); }elseif(visualBoom[row][col]!=-1) { boom[row][col].setVisible(false); }else { boom[row][col].setVisible(false); gameOver(0); } numOfBoom=0; for(introw=1;row<13;row++) for(intcol=1;col<13;col++) if(boom[row][col].getLabel()=="雷") numOfBoom++; if(numOfBoom==16) gameOver(1); } } classrightClickimplementsMouseListener{ introw,col; rightClick(intx,inty) { row=x; col=y; } @Override publicvoidmouseClicked(MouseEvente){ //TODOAuto-generatedmethodstub if(e.getButton()==MouseEvent.BUTTON3) { if(boom[row][col].getLabel()!="雷") { boom[row][col].setLabel("雷"); numOfBoom=0; for(introw=1;row<13;row++) for(intcol=1;col<13;col++) if(boom[row][col].getLabel()=="雷") numOfBoom++; if(numOfBoom==16) gameOver(1); } else boom[row][col].setLabel(""); } } @Override publicvoidmouseEntered(MouseEvente){ //TODOAuto-generatedmethodstub } @Override publicvoidmouseExited(MouseEvente){ //TODOAuto-generatedmethodstub } @Override publicvoidmousePressed(MouseEvente){ //TODOAuto-generatedmethodstub } @Override publicvoidmouseReleased(MouseEvente){ //TODOAuto-generatedmethodstub } } voidrefreshVisitTest(){ //重置訪問標記表 for(introw=1;row<13;row++) for(intcol=1;col<13;col++) { visitTest[row][col]=0; } //訪問標記置0 for(inti=0;i<14;i++) { visualBoom[0][i]=1; visualBoom[i][0]=1; visualBoom[i][13]=1; visualBoom[13][i]=1; } //邊緣訪問標記置1 } classstartListenerimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ for(introw=1;row<13;row++) for(intcol=1;col<13;col++) { boom[row][col].setVisible(true); boom[row][col].setLabel(""); visualBoom[row][col]=0; } intx,y; Randomr=newRandom(); for(intcount=0;count<16;) { x=r.nextInt(12); y=r.nextInt(12); if(visualBoom[x+1][y+1]==0) { visualBoom[x+1][y+1]=-1; count++; } } handleBoom(); startTime=System.currentTimeMillis(); panel.repaint(); System.out.println(""); System.out.println(""); System.out.println(""); System.out.println(""); for(introw=1;row<13;row++) { System.out.println(""); for(intcol=1;col<13;col++) { if(visualBoom[col][row]!=-1) System.out.print(visualBoom[col][row]+""); else System.out.print("*"); } } } } classrecordListenerimplementsActionListener{ @Override publicvoidactionPerformed(ActionEventarg0){ recordFramerec=newrecordFrame(); rec.createWindow(); } } classaboutListenerimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ JOptionPane.showMessageDialog(mainframe.getContentPane(),"制作人:濱江學院2021級軟件工程1班王琢","關于",JOptionPane.INFORMATION_MESSAGE); } } voidopenButton(intx,inty){ //響應鼠標事件 visitTest[x][y]=1; //訪問標記置1 boom[x][y].setVisible(false); if(visualBoom[x][y]!=-1) { if(visualBoom[x-1][y-1]!=-1) boom[x-1][y-1].setVisible(false); if(visualBoom[x][y-1]==0&&visitTest[x][y-1]==0) openButton(x,y-1); elseif(visualBoom[x][y-1]!=-1) boom[x][y-1].setVisible(false); if(visualBoom[x+1][y-1]!=-1) boom[x+1][y-1].setVisible(false); if(visualBoom[x+1][y]==0&&visitTest[x+1][y]==0) openButton(x+1,y); elseif(visualBoom[x+1][y]!=-1) boom[x+1][y].setVisible(false); if(visualBoom[x+1][y+1]!=-1) boom[x+1][y+1].setVisible(false); if(visualBoom[x][y+1]==0&&visitTest[x][y+1]==0) openButton(x,y+1); elseif(visualBoom[x][y+1]!=-1) boom[x][y+1].setVisible(false); if(visualBoom[x-1][y+1]!=-1) boom[x-1][y+1].setVisible(false); if(visualBoom[x-1][y]==0&&visitTest[x-1][y]==0) openButton(x-1,y); elseif(visualBoom[x-1][y]!=-1) boom[x-1][y].setVisible(false); }else{ gameOver(0); } } classtimeRunnableimplementsRunnable{ //計時器專用線程 @Override publicvoidrun(){ while(true) { timeLabel.setText(Long.toString((System.currentTimeMillis()-startTime)/1000)); usedTime=(System.currentTimeMillis()-startTime)/1000+1; try{ Thread.sleep(500); }catch(Exceptionex){ } } } } voidgameOver(intisWin){ //游戲結束 if(isWin==0) { JOptionPane.showMessageDialog(mainframe.getContentPane(),"勝敗乃兵家常事,大俠請重新來過!\n本次游戲用時:"+usedTime+"秒","YouLose!",JOptionPane.INFORMATION_MESSAGE); startButton.doClick(); }else{ JOptionPane.showMessageDialog(mainframe.getContentPane(),"恭喜您!沒有什么地雷能逃過您的火眼金睛\n本次游戲用時:"+usedTime+"秒","YouWin!",JOptionPane.INFORMATION_MESSAGE); try { ObjectInputStreamin=newObjectInputStream(newFileInputStream("record.wz")); list=(recordlist)in.readObject(); in.close(); if(usedTime<=list.getLowestScore()); nameInputernameinputer=newnameInputer(list,usedTime); }catch(Exceptione) { } startButton.doClick(); } } publicstaticvoidmain(String[]args){ sweepermain=newsweeper(); main.setBoom(); main.handleBoom(); main.createWindow(); main.showButton(); for(introw=1;row<13;row++) { System.out.println(""); for(intcol=1;col<13;col++) { if(main.visualBoom[col][row]!=-1) System.out.print(main.visualBoom[col][row]+""); else System.out.print("*"); } } }}recordFrame類:importjava.awt.Graphics;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.*;importjavax.swing.*;publicclassrecordFrameimplementsSerializable{ JFramerecFrame; recPanelrecpanel; JButtonclose=newJButton("關閉"); recordlistlist; voidcreateWindow(){ recFrame=newJFrame("光榮榜"); recpanel=newrecPanel(); recpanel.setLayout(null); close.addActionListener(newcloseListener()); close.setBounds(50,230,80,20); recpanel.add(close); recFrame.setSize(200,300); recFrame.setVisible(true); recFrame.add(recpanel); } classcloseListenerimplementsActionListener{ @Override publicvoidactionPerformed(ActionEventarg0){ recFrame.hide(); } } classrecPanelextendsJPanel{ publicvoidpaintComponent(Graphicsg){ g.drawString("姓名",25,20); g.drawString("耗時",125,20); try{ ObjectInputStreamin=newObjectInputStream(newFileInputStream("record.wz")); list=(recordlist)in.readObject(); in.close(); for(intpos=0;pos<10;pos++) { g.drawString([pos],25,20*(pos+2)); g.drawString(Long.toString(list.score[pos]),125,20*(pos+2)); } }catch(Exceptione){ e.printStackTrace(); } } }}recordList類:importjava.io.*;publicclassrecordlistimplementsSerializable{ //光榮榜存儲類 publicStringname[]; publiclongscore[]; publicrecordlist(){ //構造函數 name=newString[10]; score=newlong[10]; for(inti=0;i<10;i++) { name[i]="王琢"; score[i]=999; } } longgetLowestScore(){ //返回榜內最長時間 returnscore[9]; } longgetHighestScore(){ returnscore[0]; } voidinsertValue(Stringn,longs){ //插入新元素 inti=0; longtemp; Stringntemp; while(s>score[i]){ i++; } do{ temp=score[i]; ntemp=name[i]; score[i]=s; name[i]=n; s=temp; n=ntemp; i++; }while(i<10); }}nameInputer類:importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.FileOutputStream;importjava.io.ObjectOutputStream;importjavax.swing.*;publicclassnameInputer{ JFrameframe; JPanelpanel; JTextFieldtext; JButtonbutton; JLabellabel; Stringname; recordlistmylist; longusedtime; nameInputer(recordlistlist,longtime){ frame=newJFrame("新紀錄"); frame.setSize(300,180); panel=newJPanel(); text=newJTextField(); text.setBounds(145,30,60,20); button=newJButton("確定"); button.addActionListener(newbuttonlistener()); button.setBounds(80,70,100,20); label=newJLabel("請留下您的尊姓大名:"); label.setBounds(20,30,120,20); panel.setLayout(null); panel.add(text); panel.add(button); panel.add(label); frame.add(panel); frame.setVisible(true); mylist=list; usedtime=time; } StringgetName(){ return; } recordlistgetList(recordlistlist){ returnlist; } classbuttonlistenerimplementsActionListener{publicvoidactionPerformed(ActionEvente) { name=text.getText(); mylist.insertValue(name,usedtime); try{ ObjectOutputStreamout=newObjectOutputStream(newFileOutputStream("record.wz")); out.writeObject(mylist); out.close(); }catch(Exceptionex){ } frame.hide(); } }}軟件截圖:結束語經過了近一周的不斷努力和改進,終于完成了這個掃雷的小游戲,通過這次程序設計我深切體會了JAVA相對于C語言的便捷性以及多態與封裝的優越性,同時也深深體會到軟件工程基礎知識對軟件開發的重要性,親身體會了一次從策劃到初步實施到不斷完善的開發程序過程,為今后的程序開發積累的寶貴的經驗。另外,我也深深體會到數據結構的重要性,一個好的數據結構可以提高算法效率,節省大量寶貴的資源,提升程序運行效率。這次課程設計提高了我對程序開發的興趣,體會到了在開發過程中發現問題,解決問題的樂趣,為今后的學習樹立了信心。
教師見習報告總結期待已久的見習已經結束了,在龍巖三中高中部見習聽課,雖然只是短短的兩個星期,但感觸還是蠻深的,以前作為一名學生坐在課室聽課,和現在作為一名準教師坐在課室聽課是完全不同的感受,感覺自己學到了一些在平時課堂上學不到的東西。在這里,我獲得的不僅是經驗上的收獲,更多是教學管理,課堂教學等的理念,以及他們帶給我的種種思考。教育見習實踐過程:聽課。教育見習的主要目的是讓學生在指導教師的引導下,觀摩教師上課方法、技巧等。聽課是教育見習的主要內容。我院規定在一周的見習中需完成至少6課的見習任務。我在教師的安排指導下,分別對高一、高二物理專業課型為主,其他課型齊頭的方式,積極主動的完成了聽課任務,收到良好的效果。我聽的第一節課是高二(8)班,這是一個平衡班,水平不如實驗班高。在上課前。科任老師已經跟我說了這個班的紀律是比較差的,而且成績也不是很好。在我聽課期間,確實有幾個學生在課堂上說話,但是我發現了一個有趣的現象,這個現象我在往后的幾個班都發現了,就是絕大部分的學生的學習熱情都好高漲,積極舉手發言,積極參與課堂活動。我跟老師們提起這個現象的時候,科任老師就跟我說,一個班里不可能所有的學生都能HYPERLINK"/search?word=%E5%85%A8%E7%A5%9E%E8%B4%AF%E6%B3%A8&fr=qb_search_ex
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國雷公藤紅素市場營銷策略調研及投資建議研究報告
- 2025-2030中國鐵路集裝箱市場需求規模與競爭格局展望報告
- 2025-2030中國金融倉儲行業競爭態勢與應用領域發展格局報告
- 2025-2030中國苯駢三氮唑市場供求風險與企業經營形勢分析報告
- 個人查擺情況及整改措施
- 2025-2030中國亞麻女式短袖衫行業市場發展分析及競爭格局與投資發展研究報告
- 2025-2030中國主題酒店行業現狀供需分析及市場深度研究發展前景及規劃可行性分析研究報告
- 2025-2030中國PC隔音板行業發展分析及投資風險預測研究報告
- 高層救援滅火措施方案
- 環保混凝土方案
- 創新創業大賽項目商業計劃書模板
- 2025年1月國家開放大學漢語言文學本科《心理學》期末紙質考試試題及答案
- 糖尿病酮癥酸中毒疑難病例護理
- 居民生活垃圾轉運投標方案(技術方案)
- 《智慧園藝》課程教學大綱
- 2025年上半年工作總結及下半年工作計劃簡單版(2篇)
- 企業道路交通安全宣傳
- 635MPa級熱軋帶肋高強鋼筋應用技術規程
- 中專《電工基礎》課程標準
- 他汀不耐受的臨床診斷與處理中國專家共識(2024)解讀課件
- 2024年7月國家開放大學法學本科《知識產權法》期末考試試題及答案
評論
0/150
提交評論