如何使用Java实现经典游戏2048
如何使用Java实现经典游戏2048
这篇文章主要介绍如何使用Java实现经典游戏2048,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
主要设计
1、游戏面板生成显示
2、方块设计
3、键盘监听,方向键控制数字移动
4、数字移动逻辑算法处理
5、数字累加到2048,游戏胜利
功能截图
游戏开始
移动效果
代码实现
界面布局类
publicclassGame2048ViewimplementsActionListener{Block[]blocks;//方块JPanelmyJPanel;//主面板JPaneljp1,jp2;//子面板//intmoveFlag;//用于累计移动的次数booleannumFlag;//用于判断是否还能加入新的数字JLabelscroeValue;//显示分数publicGame2048View(JFramemyJFrame){blocks=newBlock[16];//moveFlag=0;numFlag=true;this.myJPanel=(JPanel)myJFrame.getContentPane();///获取内容面板setJp1();myJPanel.add(jp1,BorderLayout.NORTH);setJp2();myJPanel.add(jp2,BorderLayout.CENTER);myJFrame.addKeyListener(newGame2048Logic(this,myJFrame,blocks,numFlag,scroeValue));}publicvoidaddc(JPaneljp1,Componentcomponent,GridBagConstraintsgbc,intgridwidth,intgridheight,intweightx,intweighty,intgridx,intgridy){//此方法用来添加控件到容器中gbc.gridwidth=gridwidth;//该方法是设置组件水平所占用的格子数,如果为0,就说明该组件是该行的最后一个gbc.gridheight=gridheight;//该方法是设置组件垂直所占用的格子数gbc.weightx=weightx;//该方法设置组件水平的拉伸幅度,如果为0就说明不拉伸,不为0就随着窗口增大进行拉伸,0到1之间gbc.weighty=weighty;//该方法设置组件垂直的拉伸幅度,如果为0就说明不拉伸,不为0就随着窗口增大进行拉伸,0到1之间gbc.gridx=gridx;gbc.gridy=gridy;gbc.fill=GridBagConstraints.BOTH;jp1.add(component,gbc);}publicvoidsetJp1(){GridBagLayoutgbLayout=newGridBagLayout();jp1=newJPanel(gbLayout);JPanelJtitle=newJPanel();JLabeltitle=newJLabel("2048");title.setFont(newFont("font",Font.PLAIN,45));//类型、风格、大小title.setHorizontalAlignment(JLabel.LEFT);//jLabel的文本左右对齐属性设置方法,对齐方式Jtitle.add(title);jp1.add(Jtitle);JPanelJscroe=newJPanel(newGridLayout(2,1));//newGridLayout(2,1)为网格布局样式。其中的参数“2”“1”分别为网格的“行数”和“列数”。JLabelscroe=newJLabel("Scroe");scroe.setFont(newFont("font",Font.PLAIN,16));scroe.setHorizontalAlignment(JLabel.CENTER);scroeValue=newJLabel("0");scroeValue.setFont(newFont("font",Font.PLAIN,16));scroeValue.setHorizontalAlignment(JLabel.CENTER);Jscroe.add(scroe);Jscroe.add(scroeValue);jp1.add(Jscroe);JPanelJnoite=newJPanel();JLabelnoite=newJLabel("方向键移动数字累加至2048");noite.setFont(newFont("font",Font.PLAIN,14));noite.setHorizontalAlignment(JLabel.LEFT);Jnoite.add(noite);jp1.add(Jnoite);JPanelJnewGame=newJPanel();JButtonnewGame=newJButton("NewGame");newGame.setHorizontalAlignment(JButton.CENTER);newGame.addActionListener(this);JnewGame.add(newGame);jp1.add(JnewGame);GridBagConstraintsgbc=newGridBagConstraints();addc(jp1,Jtitle,gbc,3,2,60,60,0,0);addc(jp1,Jscroe,gbc,0,2,40,60,3,0);addc(jp1,Jnoite,gbc,3,1,60,40,0,2);addc(jp1,JnewGame,gbc,0,1,40,40,3,2);}publicvoidsetJp2(){addBlock();initBlock();initBlock();}/***添加方块*/publicvoidaddBlock(){jp2=newJPanel();/**setLayout是对当前组件设置为流式布局.组件在窗体中从左到右依次排列如果排到行的末尾换行排列*GridLayout(introws,intcols,inthgap,intvgap)创建具有指定行数和列数的网格布局。rows-该rows具有表示任意行数的值cols-该cols具有表示任意列数的值hgap-水平间距vgap-垂直间距*/jp2.setLayout(newGridLayout(4,4,5,5));for(inti=0;i publicclassGame2048LogicimplementsKeyListener{Block[]blocks;booleannumFlag;//用于判断是否还能加入新的数字JLabelscroeValue;//显示分数intblocksarr[]=newint[4];//保存一行/列方块中的数值JFramemyJFrame;intscroe=0;Game2048Viewgame2048View;//初始化键盘事件publicGame2048Logic(Game2048Viewgame2048View,JFramemyJFrame,Block[]blocks,booleannumFlag,JLabelscroeValue){//TODO自动生成的构造函数存根this.blocks=blocks;this.numFlag=numFlag;this.scroeValue=scroeValue;this.myJFrame=myJFrame;this.game2048View=game2048View;}//初始化按钮事件publicGame2048Logic(){//TODO自动生成的构造函数存根}publicbooleangetnumFlag(){returnnumFlag;}@OverridepublicvoidkeyPressed(KeyEvente){//TODO自动生成的方法存根int[]blocksarr=getBlock();switch(e.getKeyCode()){caseKeyEvent.VK_UP:colBlock("up");hasEmptyBlock();if(Arrays.equals(blocksarr,getBlock())){}else{refershBlock();}isGameFail("up");break;caseKeyEvent.VK_DOWN:colBlock("down");hasEmptyBlock();if(Arrays.equals(blocksarr,getBlock())){}else{refershBlock();}isGameFail("down");break;caseKeyEvent.VK_LEFT:rowBlock("left");hasEmptyBlock();if(Arrays.equals(blocksarr,getBlock())){}else{refershBlock();}isGameFail("left");break;caseKeyEvent.VK_RIGHT:rowBlock("right");hasEmptyBlock();if(Arrays.equals(blocksarr,getBlock())){}else{refershBlock();}isGameFail("right");break;default:break;}scroeValue.setText(""+scroe);win();}/***垂直方向方块移动处理函数*/publicvoidcolBlock(Stringdirection){inttmp1=0;inttmp2=0;intindex=0;for(inti=0;i<4;i++){for(intj=0;j<4;j++){if(blocks[tmp1].getText().trim().equals("")){tmp1+=4;if(tmp1>=16){break;}else{continue;}}else{blocksarr[index]=Integer.parseInt(blocks[tmp1].getText().trim());index+=1;tmp1+=4;if(tmp1>=16||index>=4){break;}else{continue;}}}switch(direction){case"up":blocksarr=handleBlocksarr(blocksarr);break;case"down":blocksarr=reverseArr(handleBlocksarr(reverseArr(blocksarr)));break;default:break;}for(intn=0;n 以上是“如何使用Java实现经典游戏2048”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注恰卡编程网行业资讯频道!业务逻辑类
推荐阅读
-
java fileinputstream中文乱码如何解决
javafileinputstream中文乱码如何解决今天小编给...
-
java实现点赞功能
-
java实现简单点赞功能
-
java实现收藏功能
-
java输入空行结束问题怎么解决
-
Java线程中常用的操作有哪些
-
java输入时怎么通过回车来结束输入
java输入时怎么通过回车来结束输入这篇文章主要介绍“java输入...
-
Java数据结构之线索化二叉树怎么实现
Java数据结构之线索化二叉树怎么实现这篇文章主要介绍“Java数...
-
Java中的泛型怎么理解
Java中的泛型怎么理解本篇内容介绍了“Java中的泛型怎么理解”...
-
Java字符串编码解码性能怎么提升
Java字符串编码解码性能怎么提升这篇“Java字符串编码解码性能...