您的位置:首页 > 编程语言 > Java开发

Java-2048

2015-10-21 01:04 477 查看


首先,先写出一个界面,以上就是我做的一个界面。做界面中有一个问题要提出来,就是按钮问题,当然也可以用Jlable来代替按钮,效果都差不多,在这里就用按钮举例,自然按钮个数比较多,所以最好用一个二维数组来添加,并设置按钮内容为“”,再然后就是按钮移动了,也许受玩原版2048的错觉影响,我们的第一想法是:当按下上移或其他按钮时,按钮就会产生相应的移动。其实做到后面就会发现,如果按照那种思路,当按下按钮时,屏幕就会闪一下,当然这个问题可以解决,但按钮移动时按钮旁边的线条被檫掉却很难解决或解决不了。所以我们的第一想法是错误的,其实按钮移动只是错觉,在我们按下一个键时按钮并没移动,而是对按钮里面的内容做了相应改变。下面就是我写的判断移动的算法:

public void MoveUp1(){

int flag1=5,flag2=5,num=0;

na=false;

for(int i=0;i<4;i++){

for(int k=0;k<4;k++){

for(int j=1;j<4;j++){

String str=array[i][j].getText();

String str1=array[i][j-1].getText();

if(!(array[i][j].getText().equals(""))){

if(flag1!=i&&flag2!=j-1&&array[i][j-1].getText().equals(array[i][j].getText())){

num=Integer.parseInt(str1);

setColor(i, j-1, 2*num);

jtf1.setText((Integer.parseInt(jtf1.getText())+2*num)+"");

array[i][j-1].setText(2*num+"");

array[i][j].setText("");

flag1=i;flag2=j-1;

array[i][j].setBackground(new Color(170,170,170));

na=true;

}else if(array[i][j-1].getText().equals("")){

num=Integer.parseInt(str);

setColor(i, j-1, num);

array[i][j-1].setText(num+"");

array[i][j].setText("");

array[i][j].setBackground(new Color(170,170,170));

na=true;

}

}

}

}

flag1=5;flag2=5;

}

}

该算法中用了三个循环,其中的检测机制是按列来的,先在第一列找到按钮内容不为“”的按钮,在判断该按钮的上一个按钮是否为空或者相同,如果为空则该按钮向上移动,如果相同则该按钮内容赋为“”,上一个按钮赋为该数字的两倍,倘若不为空且不相同则不作处理,按该方式该列循环三次,循环完后再换下一列依次循环,这样的话按钮就可以移动了,但还是会有一个问题,就是同一列的按钮会连加,那么如何解决这个问题呢?

注意代码中的flag1和flag2,这两个标识符就可以解决这个问题,这样,连加问题也解决了。接下来就是判断输赢:

//判断输赢

public boolean Judge1(){

int count=0;

for(int i=0;i<jf.array.length;i++)

for(int j=0;j<jf.array[i].length;j++)

if(!(jf.array[i][j].getText().equals("")))

count++;

if(count!=16)

return true;

else

return false;

}

public boolean Judge2(){

int k=0;

if(!Judge1()){

for(int m=1;m<3;m++)

for(int n=1;n<3;n++)

if(!(jf.array[m]
.getText().equals(jf.array[m-1]
.getText()))&&!(jf.array[m]
.getText().equals(jf.array[m+1]
.getText()))&&!(jf.array[m]
.getText().equals(jf.array[m][n-1].getText()))&&!(jf.array[m]
.getText().equals(jf.array[m][n+1].getText()))&&!(jf.array[0][0].getText().equals(jf.array[0][1].getText()))&&!(jf.array[0][0].getText().equals(jf.array[1][0].getText()))&&!(jf.array[3][0].getText().equals(jf.array[2][0].getText()))&&!(jf.array[3][0].getText().equals(jf.array[3][1].getText()))&&!(jf.array[0][3].getText().equals(jf.array[0][2].getText()))&&!(jf.array[0][3].getText().equals(jf.array[1][3].getText()))&&!(jf.array[3][3].getText().equals(jf.array[3][2].getText()))&&!(jf.array[3][3].getText().equals(jf.array[2][3].getText()))){

k++;

}

}

if(k==4)

return true;

else

return false;

}

}

judge1是用来判断按钮是否已添加满,judge2是在按钮已添加满的基础上再进行判断是否有相同的相邻按钮,用这两个方法就可以用来判断输赢啦!做到这,再加上分数文本框,2048就基本完成了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: