2048小游戏(一)程序介绍2048是一款益智小游戏,玩家需要在l6个格子中通过数字叠加的方法将最初的数字2凑成数字2048。
有16个格子,初始时会有两个格子上安放了两个数字2, 每次可以选择上下左右其中一个方向去滑动, 每滑动一次, 所有的数宇方块都会往滑动的方向靠拢外, 系统也会在空自的地方随即出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。
2o48是比较流行的一款数字游成a本课程设计通过设计与开发 JvM平台上的2048游戏,进一步掌握所学Java课程的知识, 体验 Java的跨平台性, 同时将 Java设计方面的知识拓展应用(二) 功能需求描述l、图形用户界面: 2048的最大特点就是玩家对图形界面里的数字进行操作, 也就是是玩家与游戏的互动2、当前分数 scoRE 与最高分数的显示:在我们设计的2048游戏中当前分数取了页面i内所有数字相加的值为分数, 对玩家玩游戏的进展有直接性、客观性的展现, 同时, 最高分数取了以往玩家退出游戏时所保存分数的最高分3、数字颜色‘游戏中数宇的颜色以2为首項的等比数列变化,即2、4、8、l6、32、“、128、256、5l2、l024、2048__.对应的数字卡片变色4、游戏的退出:游戏退出时,我们采用弹出对话框的确认玩家是否真的要退出游戏, 当然这样做更符合游戏人性化设计的观念。
(三)玩法技巧:1、最大数尽可能放在角落2、数字按顺序紧邻排列3、首先満足最大数和次大数在的那一列/行是满的4、时刻注意活动较大数旁边要有相近的数5、以大数所在的一行为主要移动方向6、不要急于“清理桌面”(四)程序说明一个类 Copy2048继承JFrame, 类中包括, 一个构造方法 Copy2048,构造方法中设定游戏界面的大小,背景颜色,边框,字体,标签,布局,位置,记录剩余空方块数目,记录分数,用于判断游成是否失败,用于判断游戏是否失败,设置字体类型和大小, 为最高分标签添加接键监听器, 一个 KeyEvent按键事件, 构造方法中创建游戏主面板,设置主面板位置尺寸,设置空布局,创建文本框二维数组,创建标签,调用时间处理方法, 一个Create2方法,是在随机位置产生一个2号方块的方法, ll到l4同时被键盘赋値为1说明任何方向键都不能产生新的数字2,那就说明游戏失败GAME OVER! 一个setColor方法,是为了产生2l:)48小游戏方块的颜色。
(五) 程序结构l.重新开始,若是初次运行游戏,则从文件中读入最高分void restart02.控制方法ptlblic void keyPtessed(KeyEvent e)3.结图方法public void paint(〔iraphics g)4.判断是否己经失败,若失败则返回true,否则返回falsepablic boolean judgeFai105.向下滑动,若各列均投有方块相相或移动,则返回false,否则返回true; public void moveDown06.向左滑动,若各行均投有方块相相或移动,则返回false,否则返回true; ptlblic void moveLeft07.向右滑动,若各行均投有方块相相或移动,则返回false,否则返回true, public void moveRight08.向上滑动,若各行均投有方块相消或移动,则返回false,否则返回true; Public void moveUp09.在游戏区空用处随机生成2public void generateRandom2 0(六)JAVA制作2048小游戏详细代码import ;import ;import ;impol1 ;import ;import ;import java.util. Random;import javax.swing_BorderFactory;import javax.swing_lcon;import javax.swing. lmagelcon;import javax.swing_JFrame;import ;import javax.swing_JPanel;import ;import java)(.swing_border.*;import java)(.swing.JTextField;public class Copy2048 extends JFrame{private JPanel scoresPane;private JPanel mainPane;private JLabel labelMaxScores;private JLabel labelScores;private JLabel tips;private JTextField textMa)(Scores; private JLabel textScores; private JLabel[] [] texts;privatelcorl icon2;private int times= 16;private int scores= 0;private int11 ,l2,l3,l4,l5;//提示操作t示签//-记录剩余空方块数目//-记最分数//用-]-'判断游戏是否失败Font font= new Font(”H, Font.BOLD,14); Font font2 = new Font(-', Font.BOLD,30); Random random= new Random0;/般置字体类型和大小//设置字体类型和大小//随机类实例化public static void main(StringI] args){EventOueue.invokeLater(new Runnable0{public void run0{try{Copy2048 ffame= new Copy20480;frame.setVisible(true);}catch(Exception e1){e1 .prlntStact(Trace0;}}});}public Copy20480{super0;setFiesizable(false);getContentPane0.setLayout(null);setBounds(500, 50, 500, 615);setDefaultC⊠oseOperation(J Frame. EX「「0N_CLOSE) ; setTltle("2048PC版") scoresPane= new JPanel0;scoresPane.setBackground(Color.green);scoresPane.setBounds(20, 20, 460, 40);scoresPane.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2,,Color.YELLOW)); getContentPane0.add(scoresPane);scoresPane.setLayout(null);labelMaxScores= new JLabel("最高分:"); labelMaxScores.setFont(font) ; labelMaxScores.setBounds(10, 5, 50, 30);scoresPane.add(labelMaxScores);textMaxScores= new JTextField(" ");textMaxScores.setBounds(60, 5, 150, 30);textMaxScores.setFont(font);textMaxScores.setEditable(false);scores Pane.add(textMaxScores) ;数面ili , 1 'labelScores= new JLabel(”得分:"); labelScores.setFont(font) ; labelScores.setBounds(240, 5, 50, 30); scoresPane.add(labelScores);textSoores= new JLabe1(String.valueOf(scores)); textSoores.setFont(font); textSoores.setBounds(290, 5, 150, 30);scores Pane.add(textScores) ;mainPane= new JPanel0;mainPane.setBounds(20, 70, 460, 500);;mainPane.setLayout(null); //设置空布用texts= new JLabel[4][4];for(int i= 0; i<4; i++){for(int j= 0; j<4; j++){texts[ilm= new JLabel0;texts[ilm.setFont(font2);//创建文本框二维数组//遍历数组//创建t示签texts[ilm. setHorizontalAlign me nt(SwingConstants.CENTE R) ; texts[ilm. setText(-) ;texts[ilm.setBounds(120* j, 120*i, 100, 100); //设置方块的大小位置setColor(l, j, "”);te),(ts[ilm. setOpaque(true) ;texts[ilm.setBorder(BorderFactory.createMatteBorder(2, 2, 2,,2, Color.green));//设置方決边框颜色main Pane.add(texts[ilm) ;文本框放在tips=newJLabel(Tips:使用上、下、左、右键或者W、S、A、D键控制H);tips.setFont(font);tips.setBounds(60,480,400,20)main Pane.add(tips) ;textMaxScores.add KeyListe:ner( new KeyAdapte r0{高分标签添加接键监所器publicvoid keyPressed( KeyEvente)(do_label_keyPressed(e) ;}});//调用时同处理方法Create20;Create20; }/t** 接键输入事件的处理方法@param e*/protected void do_label_keyPressed(fina] KeyEvent e){ int code= e.getKeyCode0;//获取接键代码inta;String str;Strirlg str1 ;int num;switch(oode)(case KeyEvent.VK_LEFT:case KeyEvent.VK_A:或者A键for(int i= 0; i<:4; i++){a=5;//a 的引入是为了防止上连加的情況出现//如果按键代码是左方向键for(int k= 0; k< 3; k++){for(int j= 1 ; j<4; j++){str= texts[ilm.getTe)(t0;//遍历1 6个方块//获取当前方块标签文本字符str1 =texts[i][j-1].getText0; //获取当前左1方块r(l00.」;Ca -一s al0本示:整文本字特if(pareTo(…') == 0){//如果左1方块文本为空字符texts[i][]-1 ].setText(str) ; setColor(i,,j-1 ,str);texts[ilm.setText("") ;//字符左移//当前方.映字符a-1 )){setColor(i, j,川');}else if((pareTo(str1) == 0) && 0l=a) && (j!=//如果当前方映和左1方块文本字fii:相等num =lnteger.parselnt(str);scores+= num;timeS十十;str= String.valueOf(2 num);texts[i][]-1].setText(str);setColor(i,,j-1 , str);texts[ilm.setTe)(t("”) ;//当前方」央字符l1=1;Create20; break;//用-]-'一判断游戏是否失败case KeyEvent.VK_RIGHT:case KeyEvent.VK_D:for(int i= 0; i<4; i++){a=5;for(int k , 0; k< 3; k++){for(int j=2; j>= 0; j--){str= texts[ilm.getTe)(t0;str1 = texts[i][j +1].getText0;if(pareTo(…')== 0){texts[i][j+ 1].setText(str);setC0lor(i, j十1, str);texts[i][n.setText(…') ;setColor(i, j,川');}elself(pareTo(str1)== 0&& j!=a&& j!= a+1){ num =lnteger.parselnt(str);scores+= num;timeS++;str= String.valueOf(2 num);texts[i]l] +1].setText(str);setC0lor(i, j十1 , str);texts[i]l]l.setTe)(t(…') ;setColor(i, j,'');a=j;}}}}l2=1;Create20;break;case KeyEvent.VK_llP:case KeyEvent.VK_W:for(int j= 0; j<4; j十十){a=5;for(int k= 0; k< 3; k++){for(int i= 1; i<4; i++){str = texts[ilm.getText0;str1 = texts[i- 1]m.getTe)(t0;if(pareTo(…') == 0){texts[i- 1]m.setText(str);setColor(i-1, j, str);texts[i][jl.setTe)(t(…') ;setColor(i, j,「);}else if(pareTo(str1) == 0&& i!= a&& i!= a-1){ num =lnteger.parselnt(str);scores+= num;times十十;str= String.valueO,f(2 num); texts[i- 1]m.setText(str); setColor(i-1, j, str);texts[i][jl.setTe)(t(…') ; setColor(i, j,-');a=i;}}}}l3 =1;Create20;break;case KeyEvent.VK_DOWN: case KeyEvent.VK_S:for(int j= 0; j<:4; j十十)(a= 5;for(int k= 0; k<: 5; k++){ for(int i=2; i>= 0; i--){str= texts[ilm.getTe)(t0;str1 =texts[i+1]m.getText0; if(pareTo("") == 0){ te)(ts[i+1]m.setText(str);setC0lor(i+1, j, str);te)(ts[i][n.setText(-') ;setColor(i, j,'');}else if(pareTo(str1)== 0&& i!= a&& il= a+1){ num ,lnteger.parselnt(str);scores+= num;timeS++;str= String.valueOf(2 num);texts[i+1]m.setText(str);setC0lor(i+1, j, str);texts[i][n.setText("”) ;setC olor(i, j,…');a=i;}}}}l4=1;Create20;break;default:break;}textScores.setTe)(t(Stri ng.valueOf (soores)) ;在随机位皆产生一个2 ',1,方」ji 的方法(fp'pa1-al1 i,j/public void Create20{int i,j;boolean r= false; String str;if(times:> 0){while(!r){i= random.ne)(tlnt(4);j= random.ne)(tlnt(4);str= texts[ilm.getText0;if((pareTo("”) == 0)){texts[ilm.setlcon(icon2) ;texts[ilm.setText(''2”) ;setColor(i, j, "2");times--;r= true;l1=i2=13=l4=0;}}}else if(l1 >0&& l2 >0&& l3 > 0&& l4 > 0){ //l1到l4同时被键盘賦值为1说明任何方向键都不能产生新的数字2, 说明游戏失败tips.setText(" GAME OVER! );/tt*设置标签颜色@param i, j,str */public void setCo1or(int i, int j, String str){if(str=="2")te)(ts[ilm.setBackground(Color.yellow) ;else if(str=="4")texts[ilm.setBackground(Color.red);else if(str==”8")texts[ilm.setBackground(Color.plnk);else if(str=="16”)texts[ilm.setBackground(Color.orange);else if(str=="32")texts[ilm. setBackg round(Color. magenta) ;else if(str=="64")texts[ilm.setBackgroun d(Color.LIGHT_GRAY); else if(str=="128”) texts[ilm. setBackg round(Color.green) ;else if(str=="256”)texts[i] m. setBackg rou nd(Color.gray) ;else if(str=="512”)texts[ilm. setBackg round(Color. DARK_GRAY) ; else if(str=="1024'') texts[i] m. setBackg rou nd(Color.cyan) ;else if(str=="2048'')texts[ilm.setEiackground(Color.blue);else if(str=="4096'')texts[i] m. setEiackg rou nd(Color.white) ;}(七)游戏测试截图(八)游戏测试1.测试的意义游戏测试是为了发现错误而执行程序的过程,成功的测试是发现了至今尚未发现的错误的测试。