尹燕軍 java火柴游戲課程設計報告_第1頁
尹燕軍 java火柴游戲課程設計報告_第2頁
尹燕軍 java火柴游戲課程設計報告_第3頁
尹燕軍 java火柴游戲課程設計報告_第4頁
尹燕軍 java火柴游戲課程設計報告_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Java課程設計報告JAVA課程設計題目小游戲班級網(wǎng)絡工程11-1學號201101050627姓名尹燕軍指導老師趙建立

目錄需求分析概述技術(shù)原理概要設計詳細設計3.1程序類3.2主要代碼四、測試五、心得體會

需求分析1.1概述程序隨機產(chǎn)生20—50根火柴,由人與計算機輪流拿,每次拿的數(shù)量不超過3根,拿到最后一根為勝。(使用圖形界面)1.2技術(shù)原理該游戲程序設計的主要內(nèi)容是使用java中的各種組件與容器互相搭配來完成的一個小游戲。游戲設計中的主要的知識要點包括java的awt包中的顏色類,圖形類,圖像類,事件監(jiān)聽器類,和util包中的stack類,timer類,和timertask類的使用方法,以及swing包中的窗口類,按鈕類,標簽類,面板類,復選框類等一些常用組件的用法。通過這些組件來掌握事件監(jiān)聽器的用法,java中棧的用法,以及實現(xiàn)了Runnable類的TimerTask類的用法,通過這個類實現(xiàn)線程技術(shù),還有Graphics類中的主要方法的使用,學會運用這些方法來來繪制火柴,繪制圖片的目的。概要設計設置隨機數(shù)的范圍獲取隨機數(shù)設計出人性化的圖形界面給予不同的提示完成游戲詳細設計3.1程序類3.2主要代碼importjava.awt.Color;//引入顏色類importjava.awt.Component;//引入組件類importjava.awt.Dimension;//引入封裝單個對象中組件的寬度和高度(精確到整數(shù))的類importjava.awt.Graphics;//引入圖形類importjava.awt.Graphics2D;//引入二維圖形類importjava.awt.event.ActionEvent;//引入事件類importjava.awt.event.ActionListener;//引入事件監(jiān)聽器類importjava.awt.image.BufferedImage;//引入緩沖圖像類importjava.util.Stack;//引入棧類importjava.util.Timer;//引入計時器類importjava.util.TimerTask;//引入了實現(xiàn)Runnable接口的類,并具有了線程的功能importjavax.swing.JButton;//引入按鈕類importjavax.swing.JComboBox;//引入下拉列表框類importjavax.swing.JFrame;//引入主框架主窗口類importjavax.swing.JLabel;//引入標簽類importjavax.swing.JOptionPane;//引入選項面板類importjavax.swing.JPanel;//引入面板類publicclassha//定義一個公共的主類Test{ publicstaticvoidmain(String[]args)//定義主方法main { newha();//調(diào)用Test類的構(gòu)造方法Test() } privatestaticfinalintMIN_CNT=20;//定義一個常量,設置為最小火柴棍數(shù)量為20 privatestaticfinalintMAX_CNT=50;//定義一個常量,設置為最大火柴棍數(shù)量為50 privatestaticfinalintMAX_TAKE=3;//定義一個常量,設置為最大拿火柴數(shù)量為3 privatestaticfinalintDELAY=1000;//定義一個常量,設置為延遲時間為1000 privateJFramemainFrame;//定義主框架變量 privateMyPaintPanel[]paints;//定義我自己畫的面板數(shù)組變量 privateJButtonuserBtn;//定義我的按鈕屬性 privateJComboBoxuserNum;//定義我的下拉列表 privateJButtoncompBtn;//定義電腦按鈕屬性 privateJLabelcompTxt;//定義電腦標簽 privateTimertimer;//定義計時器的變量 privateha()//定義一個私有的構(gòu)造方法,來完成游戲的初始化動作 { mainFrame=newJFrame();//實例化一個主窗口 mainFrame.setResizable(false);//設置窗體大小不可調(diào)整 mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設置默認的關(guān)閉操作為關(guān)閉窗口 JPanelmainPanel=newJPanel();//實例化一個主面板對象 mainPanel.setLayout(null);//設置布局為空,即沒有任何布局 mainPanel.setPreferredSize(newDimension(600,400));//將組件的首選大小設置為常量值 mainFrame.add(mainPanel);//將主面板添加到框架(窗口)中 JLabellab11=newJLabel("電腦");//創(chuàng)建并設置標簽按鈕的內(nèi)容為電腦 lab11.setHorizontalAlignment(JLabel.CENTER);//設置標簽內(nèi)容沿X軸的對齊方式 lab11.setBounds(0,10,200,20);//設置該標簽顯示位置為坐標(0,10),寬200,高20 mainPanel.add(lab11);//將標簽加入主面板 JButtonbtn11=newJButton("Reset");//定義一個重新來的按鈕 btn11.addActionListener(newActionListener()//為“Reset”添加行為事件監(jiān)聽器,采用匿名類的方式 { @Override publicvoidactionPerformed(ActionEvente)//實現(xiàn)監(jiān)聽器中的方法 { init();//當單擊此按鈕時,調(diào)用該初始化方法 } }); btn11.setBounds(250,10,100,20);//設置重置按鈕的位置,左上角坐標為(250,10),大小為寬100,高20 mainPanel.add(btn11);//重來標簽添加到主面板上 JLabellab12=newJLabel("用戶");//定義用戶標簽 lab12.setHorizontalAlignment(JLabel.CENTER);//設置用戶水平方式為居中 lab12.setBounds(400,10,200,20);//設置用戶標簽的位置,左上角坐標為(400,10),大小為寬200,高20 mainPanel.add(lab12);//將用戶標簽添加到主面板上 compBtn=newJButton("ComputerFirst");//定義一個電腦首先拿的按鈕 compBtn.addActionListener(newActionListener()//為電腦開始按鈕定義行為事件監(jiān)聽器 { @Override publicvoidactionPerformed(ActionEvente)//行為監(jiān)聽器中的默認方法 { compTake();//當單擊電腦按鈕時,調(diào)用電腦拿方法 } }); compBtn.setBounds(10,40,180,20);//設置電腦按鈕的位置,左上角坐標為(10,40),大小為寬180,高20 mainPanel.add(compBtn);//按鈕添加到主面板上 compTxt=newJLabel();//定義一個空標簽 compTxt.setBounds(10,70,400,20);//設置空標簽的位置,左上角坐標為(10,70),大小為寬400,高20 mainPanel.add(compTxt);//將空標簽加到主面板上 userBtn=newJButton("Take");//定義用戶拿按鈕 userBtn.addActionListener(newActionListener()//為用戶按鈕定義行為事件監(jiān)聽器 { @Override publicvoidactionPerformed(ActionEvente) { userTake();//當單擊用戶拿按鈕時,調(diào)用用戶拿方法 } }); userBtn.setBounds(400,40,90,20);//設置用戶拿按鈕的位置,左上角的坐標為(400,40),大小為寬90,高20 mainPanel.add(userBtn);//用戶按鈕添加到主面板上 userNum=newJComboBox();//定義一個下拉列表框 for(inti=0;i<MAX_TAKE;i++)//定義一個拿最大的循環(huán) { userNum.addItem(i+1);//通過循環(huán)給列表框逐個添加選項 } userNum.setBounds(495,40,90,20);//設置下拉列表框中的位置,左上角的坐標為(495,40),大小為寬90,高20 mainPanel.add(userNum);//將列表框添加到主面板上 paints=newMyPaintPanel[3];//定義我畫的面板 for(inti=0;i<3;i++)//用3次循環(huán)來畫出三個面板 { paints[i]=newMyPaintPanel();//分別創(chuàng)建3個面板,并調(diào)用構(gòu)造方法初始化三個面板 paints[i].setBounds(5+200*i,110,190,285);//設置三個面板的位置和坐標,間距為5 mainPanel.add(paints[i]);//將三個面板分別添加到主面板上 } mainFrame.pack();//調(diào)整此窗口的大小,以適合其子組件的首選大小和布局。 mainFrame.setVisible(true);//設置當前主窗口的可見性 init();//調(diào)用初始化方法 } privatevoidinit()//定義初始化的方法 { if(timer!=null)//如果計時器不為空的話就執(zhí)行下面的語句 { timer.cancel();//快速終止計時器的任務執(zhí)行線程 } timer=newTimer();//實例化一個計時器的對象 compTxt.setText("");//設置空標簽的文本為空 compBtn.setEnabled(true);//設置是否啟用電腦按鈕組件,即電腦組件可用 userBtn.setEnabled(true);//設置是否啟用用戶按鈕組件,即用戶組件可用 paints[0].reset();//調(diào)用重置方法,來重新定義第一塊面板 paints[1].reset();//調(diào)用重置方法,來重新定義第二塊面板 paints[2].reset();//調(diào)用重置方法,來重新定義第三塊面板 intnum=MIN_CNT+(int)((MAX_CNT+1-MIN_CNT)*Math.random());//隨機產(chǎn)生一個大于20小于50的數(shù) for(inti=0;i<num;i++)//分別用for循環(huán)添加面板 { paints[1].add(i+1);//分別將產(chǎn)生的隨機數(shù)添加到第二塊面板 } } privatevoiduserTake()//定義一個用戶拿火柴棒的方法 { compBtn.setEnabled(false);//設置按鈕不可用 inttakeCnt=userNum.getSelectedIndex()+1;//定義用戶拿得火柴棍的數(shù)量 intrel=paints[1].getCnt();//將自定義的第二個面板中的火柴棍的數(shù)量賦給rel if(takeCnt>rel)//如果用戶拿火柴棍的數(shù)量比面板中的數(shù)量大的話,執(zhí)行下面的語句 { JOptionPane.showMessageDialog(mainFrame,"Thereisonly"+rel +"matches.");//用標準對話框類調(diào)用顯示”Thereisonlymachines“的對話框 return; } for(inti=0;i<takeCnt;i++)//定義一個將第二塊面板中的火柴棍的數(shù)量移動到用戶面板的循環(huán) { intindex=paints[1].remove();//將第二個面板要移除的火柴棍的數(shù)量給index變量 paints[2].add(index);//將index的值添加到用戶拿的面板上 } if(takeCnt==rel)//如果用戶拿的火柴棍的數(shù)量和第二個相等執(zhí)行下面的語句 { JOptionPane.showMessageDialog(mainFrame,"Youarethewinner.");//顯示”你勝利的對話框“ init();//并重新初始化 } else//如果不相等的話,執(zhí)行下面的語句, { compTake();//讓電腦接著拿火柴棍 } } privatevoidcompTake()//定義電腦拿的方法 { compBtn.setEnabled(false);//設置電腦按鈕的當前狀態(tài)為不可用 userBtn.setEnabled(false);//設置用戶按鈕的當前狀態(tài)為不可用 MyTasktask=newMyTask();//實例化一個MyTask的對象 timer.schedule(task,DELAY);//執(zhí)行線程,安排在指定延遲1秒后執(zhí)行指定的任務 } privateclassMyTaskextendsTimerTask//定義一個繼承了實現(xiàn)Runnable接口的類使自己也具有線程功能 { @Override publicvoidrun()//因為TimerTask實現(xiàn)了Runnable接口,重寫父類的run方法 { intrel=paints[1].getCnt();//將火柴棍面板中的火柴的數(shù)量賦給rel inttakeCnt=0;//設置當前拿火柴棍的數(shù)量為0 if(rel<=MAX_TAKE)//如果當前火柴棍的數(shù)量比最大拿火柴的數(shù)量小的話,執(zhí)行下面的語句 { takeCnt=rel;//將火柴棍的數(shù)量賦給電腦要拿的數(shù)量 } elseif(rel%(MAX_TAKE+1)>0)//如果面板中的火柴棍的數(shù)量對4取余大于0的話執(zhí)行下面的語句 { takeCnt=rel%(MAX_TAKE+1);//將面板中的火柴的數(shù)量對4取余之后賦給電腦要拿的火柴的數(shù)量 } else//否則面板中的火柴棍的數(shù)量對4取余小于或等于0的話執(zhí)行下面的語句 { takeCnt=1+(int)(MAX_TAKE*Math.random());//隨機產(chǎn)生一個小于4的數(shù),給電腦要拿的數(shù)量 } for(inti=0;i<takeCnt;i++) { intindex=paints[1].remove();//將火柴面板中的火柴移除并賦給index paints[0].add(index);//將移除的火柴添加到電腦拿的面板上 } compTxt.setText("Computertakes"+takeCnt+"matchesthistime.");//設置電腦顯示拿火柴的數(shù)量 if(takeCnt==rel)//如果和電腦那的數(shù)量和面板中的數(shù)量相等執(zhí)行下面的語句 { JOptionPane.showMessageDialog(mainFrame,//顯示信息對話框提示電腦勝利了! "Computeristhewinner."); init();//并重新初始化 } userBtn.setEnabled(true);//設置用戶按鈕重新可用 } } @SuppressWarnings("serial") privateclassMyPaintPanelextendsComponent//定義一個自定義的面板類并繼承了組件類 { privateBufferedImagebimg;//創(chuàng)建一個BufferedImage的變量bimg privateStack<Integer>data;//定義一個私有的棧類型的變量data privateMyPaintPanel()//構(gòu)造我的初始面板的方法 { bimg=newBufferedImage(190,285,BufferedImage.TYPE_3BYTE_BGR);//表示一個具有8位RGB顏色分量的圖像, Graphics2Dg2=bimg.createGraphics();//創(chuàng)建一個Graphics2D,并將它繪制到此BufferedImage中 g2.setColor(Color.WHITE);//設置要畫的顏色,即面板的顏色 g2.fillRect(0,0,190,285);//在坐標(0,0)處畫一個大小為寬190,高為285的白色矩形區(qū)域 g2.dispose();//釋放此圖形的上下文以及它使用的所有系統(tǒng)資源。調(diào)用dispose之后,就不能再使用Graphics對象。 data=newStack<Integer>();//在此面板中實例化一個具體的棧的對象 } publicvoidpaint(Graphicsg)//定義畫圖形的默認方法 { g.drawImage(bimg,0,0,null);//從坐標(0,0)出開始畫圖片 g.dispose();//釋放此圖形的上下文以及它使用的所有系統(tǒng)資源。調(diào)用dispose之后,就不能再使用Graphics對象。 } privatevoidadd(intnum)//添加火柴棍的方法 { Graphics2Dg2=bimg.createGraphics();//創(chuàng)建一個Graphics2D,并將它繪制到此BufferedImage中 intloc=data.size();//將當前棧的大小賦給變量loc //System.out.println("當前棧為"+data.size()); intoffX=loc%3*65;//動態(tài)的坐標 intoffY=loc/3*15;//動態(tài)的坐標 g2.setColor(Color.YELLOW);//設置火柴棒的顏色為黃色 g2.fillRect(offX+8,offY+5,50,6);//填充火柴棒的顏色區(qū)域 g2.setColor(Color.GREEN);//設置火柴棒頭的顏色為綠色 g2.fillArc(offX+50,offY+3,10,10,0,360);//設置火柴棒頭的坐標,大小為寬和高為10的360度的弧 g2.setColor(Color.BLACK);//設置當前火柴棒的根數(shù)的顏色 g2.drawString(String.valueOf(num),offX,offY +g2.getFont().getSize());//畫出數(shù)字 data.push(num);//把數(shù)字1壓入堆棧頂部 repaint();//重畫 g2.dispose();//釋放此圖形的上下文以及它使用的所有系統(tǒng)資源。調(diào)用dispose之后,就不能再使用Graphics對象 } privateintremove()//定義一個移除火柴棍的方法 { Graphics2Dg2=bimg.createGraphics();//創(chuàng)建一個Graphics2D,并將它繪制到此BufferedImage中 intloc=data.size()-1;//將當前棧的大小即火柴棍的數(shù)量減1 //System.out.println("當前棧為"+data.size()); intoffX=loc%3*65;//動態(tài)的獲取坐標 intoffY=loc/3*15;//動態(tài)的獲取坐標 g2.setColor(Color.WHITE);//設置移除填充顏色為白色 g2.fillRect(offX,offY,60,15);//畫出

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論