java課程設(shè)計(jì)2048_第1頁(yè)
java課程設(shè)計(jì)2048_第2頁(yè)
java課程設(shè)計(jì)2048_第3頁(yè)
java課程設(shè)計(jì)2048_第4頁(yè)
java課程設(shè)計(jì)2048_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 Java語(yǔ)言程序設(shè)計(jì)課程設(shè)計(jì)題 目 2048游戲的設(shè)計(jì)與實(shí)現(xiàn) 學(xué) 院 數(shù)信學(xué)院 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 班 級(jí) 計(jì)科121 學(xué) 號(hào) 201259225131 學(xué)生姓名 鄭帥兵 指導(dǎo)教師 趙利平 編寫日期 2014-7-8 目 錄1.需求分析32.系統(tǒng)運(yùn)行環(huán)境33.功能需求描述34.總體設(shè)計(jì)35.程序模塊設(shè)計(jì)36.總結(jié)3一、 需求分析2048是比較流行的一款數(shù)字游戲。原版2048首先在github上發(fā)布,原作者是Gabriele Cirulli。它是基于1024和小3傳奇的玩法開發(fā)而成的新型數(shù)字游戲1 。隨后2048便出現(xiàn)各種版本,走各大平臺(tái)。由Ketchapp公司移植到IOS的版

2、本最為火熱,現(xiàn)在約有1000萬(wàn)下載,其名字跟原版一模一樣。衍生版中最 出名的是2048六邊形版本,先后在全球81個(gè)國(guó)家中的board game中排進(jìn)了前200。安卓版非常火爆的有挑戰(zhàn)2048,其2.0.0版以后還加入了雙人對(duì)戰(zhàn)。其次比較特別的有2048中國(guó)朝代版。更有 2048自定義版,可以自己定義文字和圖片。2048是IOS中流行的一款。本課程設(shè)計(jì)通過設(shè)計(jì)與開發(fā)JVM平臺(tái)上的2048游戲,進(jìn)一步掌握所學(xué)Java課程的知識(shí),體驗(yàn)Java的跨平臺(tái)性,同時(shí)將Java設(shè)計(jì)方面的知識(shí)拓展應(yīng)用二、 系統(tǒng)運(yùn)行環(huán)境1、硬件環(huán)境:2、軟件環(huán)境:操作系統(tǒng):WindowsXP/Windows7 軟件:集成開發(fā)環(huán)境

3、Eclipse 三、 功能需求描述1、圖形用戶界面:2048的最大特點(diǎn)就是玩家對(duì)圖形界面里的數(shù)字進(jìn)行操作,也就是是玩家與游戲的互動(dòng)2、當(dāng)前分?jǐn)?shù)SCORE與最高分?jǐn)?shù)的顯示:在我們?cè)O(shè)計(jì)的2048游戲中當(dāng)前分?jǐn)?shù)取了頁(yè)面內(nèi)所有數(shù)字相加的值為分?jǐn)?shù),對(duì)玩家玩游戲的進(jìn)展有直接性、客觀性的展現(xiàn);同時(shí),最高分?jǐn)?shù)取了以往玩家退出游戲時(shí)所保存分?jǐn)?shù)的最高分3、數(shù)字顏色:游戲中數(shù)字的顏色以2為首項(xiàng)的等比數(shù)列變化,即2、4、8、16、32、64、128、256、512、1024、2048.對(duì)應(yīng)的數(shù)字卡片變色4、游戲的退出:游戲退出時(shí),我們采用彈出對(duì)話框的確認(rèn)玩家是否真的要退出游戲,當(dāng)然這樣做更符合游戲人性化設(shè)計(jì)的觀念。功

4、能圖如下:四、 總體設(shè)計(jì)簡(jiǎn)要設(shè)計(jì)流程:程序結(jié)構(gòu)說明:/重新開始,若是初次運(yùn)行游戲,則從文件中讀入最高分void restart()/控制方法public void keyPressed(KeyEvent e)/繪圖方法public void paint(Graphics g)/判斷是否已經(jīng)失敗,若失敗則返回true,否則返回falsepublic boolean judgeFail()/向下滑動(dòng),若各列均沒有方塊相消或移動(dòng),則返回false,否則返回true;public void moveDown()/向左滑動(dòng),若各行均沒有方塊相消或移動(dòng),則返回false,否則返回true;public v

5、oid moveLeft()/向右滑動(dòng),若各行均沒有方塊相消或移動(dòng),則返回false,否則返回true;public void moveRight()/向上滑動(dòng),若各行均沒有方塊相消或移動(dòng),則返回false,否則返回true; Public void moveUp()/在游戲區(qū)空閑處隨機(jī)生成2或4public void generateRandom2or4()五、 程序模塊設(shè)計(jì)源碼如下:Main類:import javax.swing.JFrame;public class Main public static void main(String args)JFrame frame=new Ja

6、va2048();frame.setTitle("Java2048");frame.setSize(455,610);frame.setLocationRelativeTo(null);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );frame.setVisible(true);Java2048類:import java.awt.*;import java.awt.event.*;import java.io.*;import java.util.*;import javax.swing.*;public clas

7、s Java2048 extends JFrame implements KeyListenerprivate static final long serialVersionUID = 1L;Color background = new Color(190, 173, 160);/ 背景色Color foreground = new Color(204, 192, 178);/ 前景色Color wordColor = new Color(232, 216, 203);/ 單詞色Font wordFont = new Font("微軟雅黑", Font.PLAIN, 20)

8、;/ 單詞字體Font numberFont = new Font("微軟雅黑", Font.BOLD, 40);/ 數(shù)字字體Random random=new Random();/隨機(jī)數(shù)發(fā)生器int array;/游戲用2維數(shù)組/逐行或逐列處理數(shù)組,第一個(gè)參數(shù)為實(shí)際數(shù)字,第二個(gè)為判斷值,用來判斷是否應(yīng)該消除相同的數(shù)字intprocess=new int 42;int score;/分?jǐn)?shù),初始化為零int highestScore;/游戲中最高分int highestScore2=0;/文件中最高分int biggestNumber=0;boolean ifGenerate

9、2or4;int rd=new int16;/生成隨機(jī)2或4的位置private Graphics gBuffer;/構(gòu)造方法public Java2048()addKeyListener(this);addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)if(JOptionPane.showConfirmDialog(null, "確定退出?", "提示", JOptionPane.YES_NO_OPTION)=JOptionPane.YES_NO_OP

10、TION)if(highestScore>highestScore2)/若在本次游戲中破了紀(jì)錄,則更新文件中的最高分highestScore2=highestScore;File file=new File("Java2048beta1.txt");BufferedWriter bw;trybw=new BufferedWriter(new FileWriter(file);bw.write(String.valueOf(highestScore2),0,String.valueOf(highestScore2).length();bw.close();catch(E

11、xception e1)JOptionPane.showMessageDialog(null,"找不到同目錄下Java2048beta1.txt文件或文件已損壞!", "提示", JOptionPane.INFORMATION_MESSAGE);System.exit(0); );restart();void restart()/重新開始/若是初次運(yùn)行游戲,則從文件中讀入最高分if(highestScore=0)File file=new File("Java2048beta1.txt");BufferedReader br;tryb

12、r=new BufferedReader(new FileReader(file);highestScore2=Integer.valueOf(br.readLine();br.close();catch(Exception e)JOptionPane.showMessageDialog(this,"找不到同目錄下Java2048beta1.txt文件或文件已損壞!", "提示", JOptionPane.INFORMATION_MESSAGE);System.exit(0);highestScore=highestScore2;array=new in

13、t44;/清空游戲用2維數(shù)組score=0;/重置分?jǐn)?shù)為零biggestNumber=0;/重置最大數(shù)字為零/在游戲區(qū)隨機(jī)生成兩個(gè)2或4generateRandom2or4();generateRandom2or4();/繪圖方法public void paint(Graphics g) gBuffer=g;gBuffer.setColor(background);gBuffer.drawRoundRect(30, 40, 185, 90, 20, 20);/ 畫分?jǐn)?shù)顯示區(qū)gBuffer.fillRoundRect(30, 40, 185, 90, 20, 20);gBuffer.drawRo

14、undRect(245, 40, 185, 90, 20, 20);/ 畫最高分顯示區(qū)gBuffer.fillRoundRect(245, 40, 185, 90, 20, 20);gBuffer.drawRoundRect(0, 150, 454, 460, 10, 10);/ 畫主游戲區(qū)gBuffer.fillRoundRect(0, 150, 454, 460, 10, 10);gBuffer.setFont(wordFont);gBuffer.setColor(wordColor);gBuffer.drawString("SCORE", 90, 70);/ 畫SCO

15、REgBuffer.drawString("BEST", 315, 70); / 畫BESTgBuffer.setFont(numberFont);gBuffer.setColor(Color.white);if(score<10)gBuffer.drawString(String.valueOf(score), 110, 115);/畫分?jǐn)?shù)數(shù)字else if(score<100)gBuffer.drawString(String.valueOf(score), 100, 115);/畫分?jǐn)?shù)數(shù)字else if(score<1000)gBuffer.draw

16、String(String.valueOf(score), 85, 115);/畫分?jǐn)?shù)數(shù)字else if(score<10000)gBuffer.drawString(String.valueOf(score), 73, 115);/畫分?jǐn)?shù)數(shù)字else if(score<100000)gBuffer.drawString(String.valueOf(score), 60, 115);/畫分?jǐn)?shù)數(shù)字else if(score<1000000)gBuffer.drawString(String.valueOf(score), 50, 115);/畫分?jǐn)?shù)數(shù)字elsegBuffer.

17、drawString(String.valueOf(score), 37, 115);/畫分?jǐn)?shù)數(shù)字if(highestScore<10)gBuffer.drawString(String.valueOf(highestScore), 325, 115);/畫分?jǐn)?shù)數(shù)字else if(highestScore<100)gBuffer.drawString(String.valueOf(highestScore), 315, 115);/畫分?jǐn)?shù)數(shù)字else if(highestScore<1000) gBuffer.drawString(String.valueOf(highest

18、Score), 300, 115);/畫分?jǐn)?shù)數(shù)字else if(highestScore<10000)gBuffer.drawString(String.valueOf(highestScore), 288, 115);/畫分?jǐn)?shù)數(shù)字else if(highestScore<100000)gBuffer.drawString(String.valueOf(highestScore), 275, 115);/畫分?jǐn)?shù)數(shù)字else if(highestScore<1000000)gBuffer.drawString(String.valueOf(highestScore), 265,

19、 115);/畫分?jǐn)?shù)數(shù)字elsegBuffer.drawString(String.valueOf(highestScore), 252, 115);/畫分?jǐn)?shù)數(shù)字gBuffer.setColor(foreground);for (int i = 0; i < 4; i+) for (int j = 0; j < 4; j+) gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10); gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100,

20、 10, 10);for(int i=0;i<4;i+)for(int j=0;j<4;j+)switch (arrayij) case 2: gBuffer.setColor(new Color(238, 228, 218);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(122, 113, 104);

21、 gBuffer.setFont(new Font("微軟雅黑", Font.BOLD, 50);gBuffer.drawString("2", 45 + j * 112, 230 + i * 113);break;case 4: gBuffer.setColor(new Color(236, 224, 200);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 10

22、0, 100, 10, 10);gBuffer.setColor(new Color(119, 110, 103);gBuffer.setFont(new Font("微軟雅黑", Font.BOLD, 50);gBuffer.drawString("4", 45 + j * 112, 230 + i * 113);break;case 8: gBuffer.setColor(new Color(242, 177, 121);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10,

23、10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(250, 248, 235);gBuffer.setFont(new Font("微軟雅黑", Font.BOLD, 50);gBuffer.drawString("8", 45 + j * 112, 230 + i * 113); break;case 16: gBuffer.setColor(new Color(245, 149, 101);gBuffe

24、r.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(252, 244, 242);gBuffer.setFont(new Font("微軟雅黑", Font.BOLD, 45);gBuffer.drawString("16", 33 + j * 112, 230 + i * 111); bre

25、ak;case 32: gBuffer.setColor(new Color(245, 124, 95);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(255, 241, 249);gBuffer.setFont(new Font("微軟雅黑", Font.BOLD, 45);gBuffer.d

26、rawString("32", 33 + j * 112, 230 + i * 111);break;case 64: gBuffer.setColor(new Color(246, 93, 59);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(247, 249, 235);gBuffer.se

27、tFont(new Font("微軟雅黑", Font.BOLD, 45);gBuffer.drawString("64", 33 + j * 112, 230 + i * 111);break;case 128: gBuffer.setColor(new Color(237, 206, 113);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100,

28、10, 10);gBuffer.setColor(new Color(248, 246, 255);gBuffer.setFont(new Font("微軟雅黑", Font.BOLD, 40);gBuffer.drawString("128", 23 + j * 112, 228 + i * 111);break;case 256: gBuffer.setColor(new Color(237, 204, 97);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);g

29、Buffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(245, 244, 249);gBuffer.setFont(new Font("微軟雅黑", Font.BOLD, 40);gBuffer.drawString("256", 23 + j * 112, 228 + i * 111);break;case 512: gBuffer.setColor(new Color(235, 201, 78);gBuffer.dr

30、awRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(255, 241, 248);gBuffer.setFont(new Font("微軟雅黑", Font.BOLD, 40);gBuffer.drawString("512", 23 + j * 112, 228 +i * 111);break;ca

31、se 1024: gBuffer.setColor(new Color(237, 197, 63);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(240, 246, 244);gBuffer.setFont(new Font("微軟雅黑", Font.BOLD, 35);gBuffer.draw

32、String("1024", 17 + j * 112, 225 + i * 113);break;case 2048: gBuffer.setColor(new Color(238, 194, 46);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(250, 249, 255);gBuffer.

33、setFont(new Font("微軟雅黑", Font.BOLD, 35);gBuffer.drawString("2048", 17 + j * 112, 225 + i * 113);break;case 4096: gBuffer.setColor(new Color(242, 193, 28);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 1

34、00, 10, 10);gBuffer.setColor(new Color(248, 246, 255);gBuffer.setFont(new Font("微軟雅黑", Font.BOLD, 35);gBuffer.drawString("4096", 17 + j * 112, 225 + i * 113);break;case 8192: gBuffer.setColor(new Color(236, 173, 57);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10,

35、 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(248, 246, 255);gBuffer.setFont(new Font("微軟雅黑", Font.BOLD, 35);gBuffer.drawString("8192", 17 + j * 112, 225 + i * 113);break;default: gBuffer.setColor(foreground);gBuffer.drawRoun

36、dRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);public void keyPressed(KeyEvent e) if(e.getKeyCode()=KeyEvent.VK_UP)moveUp();else if(e.getKeyCode()=KeyEvent.VK_DOWN)moveDown();else if(e.getKeyCode()=KeyEvent.VK_LEFT)moveLeft()

37、;else if(e.getKeyCode()=KeyEvent.VK_RIGHT)moveRight();if(biggestNumber>1024)switch(biggestNumber)case 2048:if(JOptionPane.showConfirmDialog(this, "挑戰(zhàn)2048成功!n是否繼續(xù)挑戰(zhàn)?", "提示", JOptionPane.YES_NO_OPTION)=JOptionPane.YES_OPTION)biggestNumber+;/防止2048重復(fù)判斷elserestart();repaint();brea

38、k;case 4096:if(JOptionPane.showConfirmDialog(this, "挑戰(zhàn)4096成功!n是否繼續(xù)挑戰(zhàn)?", "提示", JOptionPane.YES_NO_OPTION)=JOptionPane.YES_OPTION)biggestNumber+;/防止4096重復(fù)判斷elserestart();repaint();break;case 8192:if(JOptionPane.showConfirmDialog(this, "挑戰(zhàn)8192成功!n是否繼續(xù)挑戰(zhàn)?", "提示",

39、JOptionPane.YES_NO_OPTION)=JOptionPane.YES_OPTION)biggestNumber+;/防止8192重復(fù)判斷elserestart();repaint();break;default:;if(judgeFail()JOptionPane.showMessageDialog(this,"挑戰(zhàn)失敗!", "提示", JOptionPane.INFORMATION_MESSAGE);restart();repaint();Overridepublic void keyReleased(KeyEvent e) Over

40、ridepublic void keyTyped(KeyEvent e) /判斷是否已經(jīng)失敗,若失敗則返回true,否則返回falsepublic boolean judgeFail()for(int j=0;j<4;j+)for(int i=0;i<4;i+)processi0=arrayij;processi1=1;for(int i=1;i<4;i+)int k=i;while(k>0)if(processk0=0)return false;else if(processk-10=0)return false;else if(processk-10=process

41、k0)return false;elsebreak;for(int j=0;j<4;j+)for(int i=3;i>-1;i-)process3-i0=arrayij;process3-i1=1;for(int i=1;i<4;i+)int k=i;while(k>0)if(processk0=0)return false;else if(processk-10=0)return false;else if(processk-10=processk0)return false;elsebreak;for(int i=0;i<4;i+)for(int j=0;j&

42、lt;4;j+)processj0=arrayij;processj1=1;for(int l=1;l<4;l+)int k=l;while(k>0)if(processk0=0)return false;else if(processk-10=0)return false;else if(processk-10=processk0)return false;elsebreak;for(int i=0;i<4;i+)for(int j=3;j>-1;j-)process3-j0=arrayij;process3-j1=1;for(int l=1;l<4;l+)in

43、t k=l;while(k>0)if(processk0=0)return false;else if(processk-10=0)return false;else if(processk-10=processk0)return false;elsebreak;for(int i=0;i<4;i+)for(int j=0;j<4;j+)if(arrayij=0)return false;return true;public void moveUp()ifGenerate2or4=false;for(int j=0;j<4;j+)for(int i=0;i<4;i

44、+)processi0=arrayij;processi1=1;processProcess();for(int i=0;i<4;i+)arrayij=processi0;if(ifGenerate2or4)generateRandom2or4();repaint();/向下滑動(dòng),若各列均沒有方塊相消或移動(dòng),則返回false,否則返回true;public void moveDown()ifGenerate2or4=false;for(int j=0;j<4;j+)for(int i=3;i>-1;i-)process3-i0=arrayij;process3-i1=1;pr

45、ocessProcess();for(int i=3;i>-1;i-)arrayij=process3-i0;if(ifGenerate2or4)generateRandom2or4();repaint();/向左滑動(dòng),若各行均沒有方塊相消或移動(dòng),則返回false,否則返回true;public void moveLeft()ifGenerate2or4=false;for(int i=0;i<4;i+)for(int j=0;j<4;j+)processj0=arrayij;processj1=1;processProcess();for(int j=0;j<4;j+)arrayij=processj0;if(ifGenerate2or4)generateRandom2or4();repaint();/向右滑動(dòng),若各行均沒有方塊相消或移動(dòng),則返

溫馨提示

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

評(píng)論

0/150

提交評(píng)論