Java版2048游戏实现代码详解编程语言

Frame.java ~ 9KB         

package Java_2048; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 
import javax.swing.*; 
@SuppressWarnings("serial") 
public class Frame extends JFrame{ 
/** 
* @param args 
*/ 
Container thisContainer;  
JLabel label; 
JPanel panel1,panel2,panel3; 
//	JPanel panel3 = new JPanel(); 
JButton numBtn[][]=new JButton[4][4]; 
JButton controlBtn[]=new JButton[4]; 
JButton playAgainButton,exitButton; 
int grid[][]=new int[4][4],score=0; 
Action_2048 act=new Action_2048(); 
public void Init(){ 
this.setBounds(280,100,500,450); 
this.setTitle("Java版2048"); 
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
label=new JLabel("Score:"); 
label.setForeground(Color.red); 
thisContainer=this.getContentPane(); 
panel1=new JPanel(); 
panel2=new JPanel(); 
panel3=new JPanel(); 
thisContainer.add(panel1,BorderLayout.NORTH);  
thisContainer.add(panel2,BorderLayout.CENTER); 
thisContainer.add(panel3,BorderLayout.SOUTH); 
panel1.setLayout(new FlowLayout()); 
panel1.add(label); 
//对数组面板panel2布局 
panel2.setLayout(new GridLayout(4,4)); 
for(int i=0;i<4;i++){ 
for(int j=0;j<4;j++){ 
numBtn[i][j]=new JButton(); 
grid[i][j]=0; 
numBtn[i][j]=new JButton(String.valueOf(grid[i][j])); 
numBtn[i][j].setFont(new java.awt.Font("Segoe UI Symbol",1, 25)); 
//				设置背景色 
numBtn[i][j].setBackground(Color.CYAN); 
//				设置按钮不要边框 
//				numBtn[i][j].setBorderPainted(false); 
//设置凸起来的按钮,很多其他的swing也可用此方法 
numBtn[i][j].setBorder(BorderFactory.createRaisedBevelBorder()); 
//				设置凹起来的按钮,很多其他的swing也可用此方法 
//				numBtn[i][j].setBorder(BorderFactory.createLoweredBevelBorder()); 
panel2.add(numBtn[i][j]); 
} 
} 
int k=(int)Math.round(Math.random()*15); 
int i=k/4; 
int j=k%4; 
grid[i][j]=2; 
numBtn[i][j].setText(String.valueOf(grid[i][j])); 
//对方向控制按钮进行布局以及对"退出"、"再来一局"进行布局 
panel3.setLayout(new FlowLayout()); 
controlBtn[0] = new JButton("↑"); 
controlBtn[1] = new JButton("↓"); 
controlBtn[2] = new JButton("←"); 
controlBtn[3] = new JButton("→"); 
for(i=0;i<4;i++){ 
controlBtn[i].addActionListener(act); 
panel3.add(controlBtn[i]); 
} 
playAgainButton=new JButton("再来一局");  
exitButton=new JButton("退出"); 
playAgainButton.addActionListener(act); 
exitButton.addActionListener(act); 
panel3.add(exitButton); 
panel3.add(playAgainButton); 
this.setVisible(true); 
} 
class Action_2048 implements ActionListener{ 
@Override 
public void actionPerformed(ActionEvent e) { 
// TODO Auto-generated method stub 
int f=0,TongGuanF=0; 
//"↑"————controlBtn[0] 
if(e.getSource()==controlBtn[0]){ 
int i=0,j=0,n,t[]={0,0,0,0}; 
int b[][]=new int[4][4]; 
for(i=0;i<4;i++) 
{ 
n=0; 
for(j=0;j<4;j++) 
{ 
b[j][i]=grid[j][i]; 
if(grid[j][i]!=0) 
{ 
t[n++]=grid[j][i]; 
} 
} 
for(j=0;j<4;j++) 
{ 
grid[j][i]=t[j]; 
numBtn[j][i].setText(String.valueOf(grid[j][i])); 
t[j]=0;		//避免下一列受上一列的影响 
} 
} 
for(i=0;i<4;i++) 
{ 
for(j=0;j<4;j++) 
{ 
if(grid[i][j]!=b[i][j]) 
{ 
f=1; 
break; 
} 
} 
if(f==1) 
break; 
} 
for(i=0;i<4;i++) 
{ 
for(j=0;j<3;j++) 
{ 
if((grid[j][i]==grid[j+1][i])&&(grid[j][i]!=0)) 
{ 
f=1; 
grid[j][i]=2*grid[j][i]; 
numBtn[j][i].setText(String.valueOf(grid[j][i])); 
score+=grid[j][i]; 
for(n=j+1;n<3;n++) 
{ 
grid[n][i]=grid[n+1][i]; 
numBtn[n][i].setText(String.valueOf(grid[n][i])); 
} 
grid[n][i]=0; 
numBtn[n][i].setText(String.valueOf(grid[n][i])); 
} 
} 
} 
} 
if(e.getSource()==controlBtn[1]){ 
int i=0,j=0,n,t[]={0,0,0,0}; 
int b[][]=new int[4][4]; 
for(i=0;i<4;i++) 
{ 
n=0; 
for(j=0;j<4;j++) 
{ 
b[j][i]=grid[j][i]; 
if(grid[j][i]!=0) 
{ 
t[n++]=grid[j][i]; 
} 
} 
for(j=3;j>=0;j--) 
{ 
if(n>0) 
{ 
grid[j][i]=t[n-1]; 
numBtn[j][i].setText(String.valueOf(grid[j][i])); 
n--; 
}else{ 
grid[j][i]=0;		//避免下一列受上一列的影响 
numBtn[j][i].setText(String.valueOf(grid[j][i])); 
} 
} 
} 
for(i=0;i<4;i++) 
{ 
for(j=0;j<4;j++) 
{ 
if(grid[i][j]!=b[i][j]) 
{ 
f=1; 
break; 
} 
} 
if(f==1) 
break; 
} 
for(i=0;i<4;i++) 
{ 
for(j=3;j>0;j--) 
{ 
if((grid[j][i]==grid[j-1][i])&&(grid[j][i]!=0)) 
{ 
f=1; 
grid[j][i]=2*grid[j][i]; 
numBtn[j][i].setText(String.valueOf(grid[j][i])); 
score+=grid[j][i]; 
for(n=j-1;n>0;n--) 
{ 
grid[n][i]=grid[n-1][i]; 
numBtn[n][i].setText(String.valueOf(grid[n][i])); 
} 
grid[n][i]=0; 
numBtn[n][i].setText(String.valueOf(grid[n][i])); 
} 
} 
} 
} 
if(e.getSource()==controlBtn[2]){ 
int i=0,j=0,n,t[]={0,0,0,0}; 
int b[][]=new int[4][4]; 
for(i=0;i<4;i++) 
{ 
n=0; 
for(j=0;j<4;j++) 
{ 
b[i][j]=grid[i][j]; 
if(grid[i][j]!=0) 
{ 
t[n++]=grid[i][j]; 
} 
} 
for(j=0;j<4;j++) 
{ 
grid[i][j]=t[j]; 
numBtn[i][j].setText(String.valueOf(grid[i][j])); 
t[j]=0;		//避免下一行受上一行的影响 
} 
} 
for(i=0;i<4;i++) 
{ 
for(j=0;j<4;j++) 
{ 
if(grid[i][j]!=b[i][j]) 
{ 
f=1; 
break; 
} 
} 
if(f==1) 
break; 
} 
for(i=0;i<4;i++) 
{ 
for(j=0;j<3;j++) 
{ 
if((grid[i][j]==grid[i][j+1])&&(grid[i][j]!=0)) 
{ 
f=1; 
grid[i][j]=grid[i][j]*2; 
numBtn[i][j].setText(String.valueOf(grid[i][j])); 
score+=grid[i][j]; 
for(n=j+1;n<3;n++) 
{ 
grid[i][n]=grid[i][n+1]; 
numBtn[i][n].setText(String.valueOf(grid[i][n])); 
} 
grid[i][n]=0; 
numBtn[i][n].setText(String.valueOf(grid[i][n])); 
} 
} 
} 
} 
if(e.getSource()==controlBtn[3]){ 
int i=0,j=0,n,t[]={0,0,0,0}; 
int b[][]=new int[4][4]; 
for(i=0;i<4;i++) 
{ 
n=0; 
for(j=0;j<4;j++) 
{ 
b[i][j]=grid[i][j]; 
if(grid[i][j]!=0) 
{ 
t[n++]=grid[i][j]; 
} 
} 
for(j=3;j>=0;j--) 
{ 
if(n>0) 
{ 
grid[i][j]=t[n-1]; 
n--; 
t[n]=0; 
numBtn[i][j].setText(String.valueOf(grid[i][j])); 
}else{ 
grid[i][j]=0; 
numBtn[i][j].setText(String.valueOf(grid[i][j])); 
} 
//避免下一行受上一行的影响 
} 
} 
for(i=0;i<4;i++) 
{ 
for(j=0;j<4;j++) 
{ 
if(grid[i][j]!=b[i][j]) 
{ 
f=1; 
break; 
} 
} 
if(f==1) 
break; 
} 
for(i=0;i<4;i++) 
{ 
for(j=3;j>0;j--) 
{ 
if((grid[i][j]==grid[i][j-1])&&(grid[i][j]!=0)) 
{ 
f=1; 
grid[i][j]=grid[i][j]*2; 
numBtn[i][j].setText(String.valueOf(grid[i][j])); 
score+=grid[i][j]; 
for(n=j-1;n>0;n--) 
{ 
grid[i][n]=grid[i][n-1]; 
numBtn[i][n].setText(String.valueOf(grid[i][n])); 
} 
grid[i][n]=0; 
numBtn[i][n].setText(String.valueOf(grid[i][n])); 
} 
} 
} 
} 
if(e.getSource()==playAgainButton){ 
for(int i=0;i<4;i++){ 
for(int j=0;j<4;j++){ 
grid[i][j]=0; 
numBtn[i][j].setText(String.valueOf(grid[i][j])); 
} 
} 
int k=(int)Math.round(Math.random()*15); 
int i=k/4; 
int j=k%4; 
grid[i][j]=2; 
numBtn[i][j].setText(String.valueOf(grid[i][j])); 
} 
if(e.getSource()==exitButton){ 
System.exit(0); 
} 
//产生新数2、4 
if(f==1){ 
int r[]=new int[16]; 
int n=0,i,j; 
for(i=0;i<4;i++) 
{ 
for(j=0;j<4;j++) 
{ 
if((grid[i][j]==0)) 
{ 
r[n]=i*4+j; 
n++; 
} 
} 
} 
Random rd=new Random(); 
int k=rd.nextInt(n); 
i=r[k]/4; 
j=r[k]%4; 
if((i+j)%5!=0) 
{ 
grid[i][j]=2; 
} 
else{ 
grid[i][j]=4; 
} 
numBtn[i][j].setText(String.valueOf(grid[i][j])); 
if(score>5000){ 
for(i=0;i<4;i++){ 
for(j=0;j<4;j++){ 
if(grid[i][j]==2048) 
TongGuanF=1; 
} 
} 
} 
if(TongGuanF==1) 
label.setText("恭喜过关!"); 
else 
label.setText("Score:  "+String.valueOf(score)+"分");  
} 
} 
} 
public static void main(String[] args) { 
// TODO Auto-generated method stub 
Frame f=new Frame(); 
f.Init(); 
} 
} 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/10295.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论