目录1.前言..................................................................错误!未定义书签。2.需求分析............................................................................23.概要设计..........................................................错误!未定义书签。4.详细设计............................................................................55.测试..................................................................错误!未定义书签。6.总结.....................................................................................6参考文献...............................................................错误!未定义书签。附录.......................................................................错误!未定义书签。一、前言最近以来,移动手游越来越成为当下游戏产业中重要的一环,市场也在加大对这一产业的投入,涌现出了愤怒的小鸟,水果忍者,flappybird,2048等诸多优秀的手游,然而任何一款手游能够风靡,主要还是依靠其简单的操作性,因此本次java课设我选择其中的典型2048PC版作为本次课设的课题。二、需求分析1、界面一款的好的游戏其界面必须友好,简洁已经成为当今UI设计的主流,简单易上手才能得到玩家的青睐。这是本次游戏的界面,界面上方是游戏分数面板,中间是游戏主面板,当游戏失败时可通过本按钮重置游戏。最下方是本次游戏的提示。2、操作性游戏的体验是衡量一款游戏的关键,本游戏通过键盘w,s,a,d以及方向键来控制方块的移动,左右手都可以操作~充分考虑便捷性。三、概要设计//按键输入事件的处理方法protectedvoiddo_label_keyPressed(finalKeyEvente){intcode=e.getKeyCode();//获取按键代码inta;//a的引入是为了防止连加的情况出现Stringstr;Stringstr1;intnum;switch(code){caseKeyEvent.VK_LEFT:caseKeyEvent.VK_A://如果按键代码是左方向键或者A键for(inti=0;i4;i++){a=5;for(intk=0;k3;k++){for(intj=1;j4;j++){//遍历16个方块str=texts[i][j].getText();//获取当前方块标签文本字符str1=texts[i][j-1].getText();//获取当前左1方块标签文本字符if(str1.compareTo()==0){//如果左1方块文本为空字符texts[i][j-1].setText(str);//字符左移setColor(i,j-1,str);texts[i][j].setText();//当前游戏界面游戏主面板得分面板重置按钮游戏提示通过上下左右滑动将分数加入得分面板,同时记录最高分点击重置方块字符置空setColor(i,j,);}elseif((str.compareTo(str1)==0)&&(j!=a)&&(j!=a-1)){//如果当前方块和左1方块文本字符相等num=Integer.parseInt(str);scores+=num;times++;str=String.valueOf(2*num);texts[i][j-1].setText(str);//左1方块文本字符变为两方块之和setColor(i,j-1,str);texts[i][j].setText();//当前方块字符置空setColor(i,j,);a=j;}}}}//通过按键事件的处理,监视滑块的移动四、详细设计分别构建mainPane,scoresPane两大模块放入游戏窗体getContentPane(),其中scoresPane包含得分以及最高分,当得分超过最高分时,将得分存入工程文件夹下的score.txt,覆盖最高分,同时在最高分显示最新score.txt的内容。通过Create2方法随机显示2号方块,通过setColor方法设置每个数字代表的方块颜色,通过initMap遍历数组(方块是用二维数组存贮的)RESET按钮是通过设计的图片覆盖,同时消掉按钮的边框达到的,保持了游戏的美观性。五、测试当方块都无法移动,出现GameOver,游戏结束!六、总结七、源代码清单importjava.awt.Color;importjava.awt.EventQueue;importjava.awt.BorderLayout;importjava.awt.FlowLayout;importjava.awt.Font;importjava.awt.event.*;importjava.util.Random;importjavax.swing.BorderFactory;importjavax.swing.Icon;importjavax.swing.ImageIcon;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.SwingConstants;importjavax.swing.border.*;importjavax.swing.JTextField;publicclassCopy2048extendsJFrame{privateJPanelscoresPane;privateJPanelmainPane;privateJLabellabelMaxScores;privateJLabellabelScores;privateJLabeltips;//提示操作标签privateJTextFieldtextMaxScores;privateJLabeltextScores;privateJLabel[][]texts;privateIconicon2;privateinttimes=16;//记录剩余空方块数目privateintscores=0;//记录分数privateintl1,l2,l3,l4,l5;//用于判断游戏是否失败Fontfont=newFont(,Font.BOLD,14);//设置字体类型和大小Fontfont2=newFont(,Font.BOLD,30);Randomrandom=newRandom();publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{Copy2048frame=newCopy2048();frame.setVisible(true);//Threadthread=newThread(frame);//thread.start();}catch(Exceptione1){e1.printStackTrace();}}});}/***构造方法*/publicCopy2048(){super();setResizable(false);//禁止调整窗体大小getContentPane().setLayout(null);//设置空布局setBounds(500,50,500,615);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setTitle(2048);//设置窗体标题scoresPane=newJPanel();//创建分数显示面板scoresPane.setBackground(Color.green);//设置分数显示面板的背景色scoresPane.setBounds(20,20,460,40);scoresPane.setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.YELLOW));//设置得分面板的边框getContentPane().add(scoresPane);//将得分面板添加到窗体scoresPane.setLayout(null);//设置面板空布局labelMaxScores=newJLabel(最高分:);//最高分标签labelMaxScores.setFont(font);//设置字体类型和大小labelMaxScores.setBounds(10,5,50,30);//设置最懂啊分标签的位置尺寸scoresPane.add(labelMaxScores);//将最高分标签添加到得分容器中textMaxScores=newJTextField(暂不可用);//得分标签textMaxScores.setBounds(60,5,150,30);textMaxScores.setFont(font);textMaxScores.setEditable(false);scoresPane.add(textMaxScores);//将得分标签添加到分数面板中labelScores=newJLabel(得分:);labelScores.setFont(font);//设置字体类型和大小labelScores.setBounds(240,5,50,30);scoresPane.add(labelScores);textScores=newJLabel(String.valueOf(scores));textScores.setFont(font);textScores.setBounds(290,5,150,30);scoresPane.add(textScores);mainPane=newJPanel();//创建游戏主面板mainPane.setBounds(20,70,460,500);//设置主面板位置尺寸this.getContentPane().add(mainPane);mainPane.setLayout(null);//设置空布局texts=newJLabel[4][4];//创建文本框二维数组for(inti=0;i4;i++){//遍历数组for(intj=0;j4;j++){texts[i][j]=newJLabel();//创建标签texts[i][j].setFont(font2);texts[i][j].setHorizontalAlignment(SwingConstants.CENTER);texts[i][j].setText();texts[i][j].setBounds(120*j,120*i,100,100);//设置方块的大小位置setColor(i,j,);texts[i][j].setOpaque(true);texts[i][j].setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.green));//设置方块边框颜色mainPane.add(texts[i][j]);//将创建的文本框放在}}tips=newJLabel(Tips:使用上、下、左、右键或者W、S、A、D键控制);tips.setFont(font);tips.setBounds(60,480,400,20);mainP