Java版2048游戲實現代碼

xs8044 8年前發布 | 9K 次閱讀 Java

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();
    }

}
 本文由用戶 xs8044 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!