Java完美实现2048小游戏
完美地模仿了2048游戏,是根据网友的一个2048改的。
Block.java
importjavax.swing.*; importjava.awt.*; publicclassBlockextendsJLabel { privateintvalue; publicBlock() { value=0;//初始化值为0 setFont(newFont("font",Font.PLAIN,40));//设定字体 setBackground(Color.gray);//设定初始颜色为灰色 } publicintgetValue()//获取值 { returnvalue; } publicvoidsetValue(intvalue) { this.value=value; Stringtext=String.valueOf(value); if(value!=0) setText(text); else setText("");//如果值为0则不显示 setColor(); } publicvoidsetColor()//根据值的不同设定不同的背景颜色、label字体 { switch(value) { case0: setBackground(Color.gray); break; case2: setBackground(newColor(238,228,218)); break; case4: setBackground(newColor(238,224,198)); break; case8: setBackground(newColor(243,177,116)); break; case16: setBackground(newColor(243,177,116)); break; case32: setBackground(newColor(248,149,90)); break; case64: setBackground(newColor(249,94,50)); break; case128: setBackground(newColor(239,207,108)); break; case256: setBackground(newColor(239,207,99)); break; case512: setBackground(newColor(239,203,82)); break; case1024: setBackground(newColor(239,199,57)); break; case2048: setBackground(newColor(239,195,41)); break; case4096: setBackground(newColor(255,60,57)); break; } } }
My2048.java
importjava.awt.*; importjavax.swing.*; publicclassMy2048extendsJFrame { publicMy2048()//构造函数 { setTitle("2048");//设置标题 setSize(400,400);//设定窗口大小 setLocation(500,200);//设定窗口起始位置 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(newGridLayout(4,4,5,5));//设定布局方式为GridLayout型 newOperation(this); this.setVisible(true);//设为可视 } publicstaticvoidmain(Stringargs[])//程序入口点 { try { UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceRavenGraphiteLookAndFeel");//设定UI }//接受抛出的异常 catch(ClassNotFoundException|InstantiationException|IllegalAccessException|UnsupportedLookAndFeelExceptione) { e.printStackTrace(); } JFrame.setDefaultLookAndFeelDecorated(true);//设定Frame的缺省外观 newMy2048(); } }
Operation.java
importjava.awt.event.*; importjavax.swing.*; publicclassOperationimplementsKeyListener { Block[]block;//用于储存16个数据 JPanelpanel; publicbooleanup,down,left,right; intmoveFlag;//用于累计移动的次数 booleannumFlag;//用于判断是否还能加入新的数字 publicOperation(JFrameframe) { this.panel=(JPanel)frame.getContentPane();//构造出panel block=newBlock[16];//构造出长度为16的数组 numFlag=true;//初始化 moveFlag=0; up=true;down=true;left=true;right=true; addBlock(); for(inti=0;i<2;i++) appearBlock(); frame.addKeyListener(this); } privatevoidaddBlock() { for(inti=0;i<16;i++)//往panel里加入block { block[i]=newBlock(); block[i].setHorizontalAlignment(JLabel.CENTER);//不透明的标签 block[i].setOpaque(true); panel.add(block[i]); } } publicvoidappearBlock() { while(numFlag)//当还能加入随机的一个新的值得时候 { intindex=(int)(Math.random()*16);//取一个0到15的随机整数,这个数作为随机加入盘中的2或4的位置 if(block[index].getValue()==0)//如果这个数所在的block数组中值为0,即在为空的时候,加入一个2或4的数字 { if(Math.random()<0.5) { block[index].setValue(2); } else { block[index].setValue(4); } break;//跳出while } } } publicvoidjudgeAppear()//统计block数组中是否含有值为0的元素,若没有,则numFlag变为false { intsum=0; for(inti=0;i<16;i++) { if(block[i].getValue()!=0) { sum++; } } if(sum==16) numFlag=false; } publicintFind(inti,intj,inta,intb) { while(i<b&&i>=a) { if(block[i].getValue()!=0) { returni; } i=i+j; } return-1; } publicvoidupBlock() { inti=0,j=0;intt=0;intvalueJ=0;intvalueI=0;intindex=0; for(i=0;i<4;i++) { index=i; for(j=i+4;j<16;j+=4) { valueJ=0;valueI=0; if(block[index].getValue()==0) { t=Find(index,4,0,16); if(t!=-1) { block[index].setValue(block[t].getValue()); block[t].setValue(0); } else { break; } } valueI=block[index].getValue(); if(block[j].getValue()==0) { t=Find(j,4,0,16); if(t!=-1) { block[j].setValue(block[t].getValue()); block[t].setValue(0); } else { break; } } valueJ=block[j].getValue(); if(valueI==valueJ&&valueI!=0&&valueJ!=0) { block[index].setValue(valueI+valueJ); block[j].setValue(0); numFlag=true; } index=j; } } } publicvoiddownBlock(){ inti=0,j=0;intt=0;intvalueJ=0;intvalueI=0;intindex=0; for(i=12;i<16;i++) { index=i; for(j=i-4;j>=0;j-=4) { valueJ=0;valueI=0; if(block[index].getValue()==0) { t=Find(index,-4,0,16); if(t!=-1) { block[index].setValue(block[t].getValue()); block[t].setValue(0); } else { break; } } valueI=block[index].getValue(); if(block[j].getValue()==0) { t=Find(j,-4,0,16); if(t!=-1) { block[j].setValue(block[t].getValue()); block[t].setValue(0); } else { break; } } valueJ=block[j].getValue(); if(valueI==valueJ&&valueI!=0&&valueJ!=0) { block[index].setValue(valueI+valueJ); block[j].setValue(0); numFlag=true; } index=j; } } } publicvoidrightBlock() { inti=0,j=0;intt=0;intvalueJ=0;intvalueI=0;intindex=0; for(i=3;i<16;i+=4) { index=i; for(j=i-1;j>i-4;j--) { valueJ=0;valueI=0; if(block[index].getValue()==0) { t=Find(index,-1,i-3,index+1); if(t!=-1) { block[index].setValue(block[t].getValue()); block[t].setValue(0); } else { break; } } valueI=block[index].getValue(); if(block[j].getValue()==0) { t=Find(j,-1,i-3,j+1); if(t!=-1) { block[j].setValue(block[t].getValue()); block[t].setValue(0); } else { break; } } valueJ=block[j].getValue(); if(valueI==valueJ&&valueI!=0&&valueJ!=0) { block[index].setValue(valueI+valueJ); block[j].setValue(0); numFlag=true; } index=j; } } } publicvoidleftBlock() { inti=0,j=0;intt=0;intvalueJ=0;intvalueI=0;intindex=0; for(i=0;i<16;i+=4) { index=i; for(j=i+1;j<i+4;j++) { valueJ=0;valueI=0; if(block[index].getValue()==0) { t=Find(index,1,index,i+4); if(t!=-1) { block[index].setValue(block[t].getValue()); block[t].setValue(0); } else { break; } } valueI=block[index].getValue(); if(block[j].getValue()==0) { t=Find(j,1,j,i+4); if(t!=-1) { block[j].setValue(block[t].getValue()); block[t].setValue(0); } else { break; } } valueJ=block[j].getValue(); if(valueI==valueJ&&valueI!=0&&valueJ!=0) { block[index].setValue(valueI+valueJ); block[j].setValue(0); numFlag=true; } index=j; } } } publicvoidover() { if(numFlag==false&&up==false&&down==false&&left==false&&right==false)//当不能添加元素,并且不可移动的步数超过36就输了,输了的时候在盘中央显示GAMEOVER { block[4].setText("G"); block[5].setText("A"); block[6].setText("M"); block[7].setText("E"); block[8].setText("O"); block[9].setText("V"); block[10].setText("E"); block[11].setText("R"); block[11].addMouseListener(newMouseAdapter(){publicvoidmousePressed(MouseEvente){reStart();}}); } } publicvoidwin()//同OVER { block[0].setText("Y"); block[1].setText("O"); block[2].setText("U"); block[13].setText("W"); block[14].setText("I"); block[15].setText("N"); block[15].addMouseListener(newMouseAdapter(){ publicvoidmousePressed(MouseEvente){ reStart(); } }); } publicvoidreStart()//重启游戏,和构造函数类似,不在累述 { numFlag=true; moveFlag=0; up=true;down=true;left=true;right=true; for(inti=0;i<16;i++) block[i].setValue(0); for(inti=0;i<2;i++) appearBlock(); } publicvoidkeyPressed(KeyEvente)//判断按的上下左右键,并依次调用移动函数、判断函数、添加函数、判断是否输掉的函数 { switch(e.getKeyCode()){ caseKeyEvent.VK_UP: if(up){ upBlock();} judgeAppear(); appearBlock(); over(); if(numFlag==false) { up=false; } else { up=true;down=true;left=true;right=true; } break; caseKeyEvent.VK_DOWN: if(down){ downBlock();} judgeAppear(); appearBlock(); over(); if(numFlag==false) { down=false; } else { up=true;down=true;left=true;right=true; } break; caseKeyEvent.VK_LEFT: if(left){ leftBlock();} judgeAppear(); appearBlock(); over(); if(numFlag==false) { left=false; } else { up=true;down=true;left=true;right=true; } break; caseKeyEvent.VK_RIGHT: if(right){ rightBlock();} judgeAppear(); appearBlock(); over(); if(numFlag==false) { right=false; } else { up=true;down=true;left=true;right=true; } break; } } publicvoidkeyTyped(KeyEvente){ } publicvoidkeyReleased(KeyEvente){ } }
以上所述就是本文给大家分享的关于java完美实现2048小游戏的全部代码了,希望对大家学习java能够有所帮助。