做任何产品之前首先先想好要这款游戏能实现什么功能?对界面有什么要求?当有了大概的一个想法之后就可以按想法去一点一点实现它了。首先说一下我做2048的想法,首先功能要实现,其次是界面。在做这个游戏之前我自己玩的时候就觉得好无聊,所以在游戏进行的时候加入了节奏很欢快的歌曲。上下移动时由键盘控制,所以要加一个键盘监听器。
先写界面:
public void init(){
this.setTitle("2048");
this.setLayout(null);
this.setDefaultCloseOperation(3);
this.setSize(510,700);
MyListener my=new MyListener(this);
this.setResizable(false);
this.addKeyListener(my);
this.setLocationRelativeTo(null);
this.setFocusable(true);
this.getContentPane().setBackground(Color.WHITE);
jt=new JTextField("当前分数");
jt.setBounds(61,580,102,66);
jt.setFont(new Font("宋体", 1, 20));
this.add(jt);
jt1=new JTextField("0");
jt1.setBounds(247,583,165,66);
jt1.setFont(new Font("宋体", 1, 40));
this.add(jt1);
jt1.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.BLACK));
jt.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.BLACK));
mainPane = new JPanel();//创建游戏主面板
mainPane.setBounds(20, 70, 460, 500);//设置主面板位置尺寸
this.getContentPane().add(mainPane);
mainPane.setLayout(null);//设置空布局
texts = new JLabel[4][4];//创建文本框二维数组
for(int i = 0; i < 4; i++){//遍历数组
for(int j = 0; j < 4; j++){
aa[i][j]=1;
texts[i][j] = new JLabel();//创建标签
texts[i][j].setBackground(Color.PINK);
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].setFont(new Font("宋体", 1, 40)); //设置字体颜色
texts[i][j].setForeground(Color.black);
texts[i][j].setOpaque(true);//透明
texts[i][j].setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.BLACK));//设置方块边框颜色
mainPane.add(texts[i][j]);//将创建的文本框放在游戏主面板上
}
}
int i=ra.nextInt(4); //首先界面上出现一个2!!!!
int j=ra.nextInt(4);
int suijishu = ra.nextInt(2);
str = texts[i][j].getText();
setColor(i, j, 2);
texts[i][j].setText("2");
shixian();
this.setVisible(true);
g=(Graphics2D)this.getGraphics();
g.setStroke(new BasicStroke(6.0f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL));
g.setColor(Color.PINK);
}
!!!! 其次是让界面随机出现两个数。
public void shixian (){
int i=ra.nextInt(4);
int j=ra.nextInt(4);
int suijishu = ra.nextInt(2);
str = texts[i][j].getText();
if(str.equals("")){
if(suijishu==1){
// setColor(i, j, 2);
texts[i][j].setText("2");
// setColor(x, y, z)
}
else{
texts[i][j].setText("4");
// setColor(i, j, 4);
}
}
else{
int count = 0;
for(int n=0;n<4;n++ ){
for(int m=0;m<4;m++){
if(texts[n][m].getText().equals("")){
count++;
}
}
}
if(count != 0)
shixian() ;
}
}
再次,实现2048的功能,两个相同的数字相加的功能。可以上下左右移动相加,最要注意的是不要让它三连加!下面只写一个移动的方法!
public void shangyi(){
//实际是shang移的算法
for(int k=0;k<3;k++)
for(int y=0;y<4;y++){
for(int x=1;x<4;x++){
if(!(texts[x][y].getText().equals(""))){ //判断上面文本框不为空
String str=texts[x][y].getText();
String str1=texts[x-1][y].getText();
///!!!!!!!!!!
if(aa[x-1][y]==1&&aa[x][y]==1){ //加之前判断标志
if(str.equals(str1)){
int num=Integer.parseInt(str);//把字符转换成数字
jt1.setText((Integer.parseInt(jt1.getText())+2*num)+"");
texts[x-1][y].setText(2*num+"");
texts[x][y].setText("");
aa[x-1][y]=0;
}
else
if(str1.equals("")){
int num=Integer.parseInt(str);
texts[x-1][y].setText(num+"");
texts[x][y].setText("");
aa[x-1][y]=aa[x][y];
}
}
}
}
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
aa[i][j]=1;
}
}
shixian() ;
}