Java制作2048游戏

本文介绍了如何使用Java实现2048游戏的核心功能,包括游戏规则(合并数字、计分系统)、游戏结束条件和移动操作。同时提到了可能的策略和未来扩展至排行榜的功能。
摘要由CSDN通过智能技术生成

        2048是什么? 2048 是一款流行的单人益智游戏,其目标是在网格上滑动编号的图块,合并具有相同数字的图块以达到 2048 及以上。

        我该如何玩2048? 您可以使用键盘上的箭头键或在支持触摸的设备上滑动,以四个方向滑动网格上的图块:上、下、左、右。 当两个相同数字的方块碰撞时,它们会合并成一个,并且它们的价值会加倍。 ...

        当我到达 2048 时会发生什么? 当您达到 2048 块时,您可以选择继续玩并瞄准更高的数字,或者您可以考虑游戏获胜并开始新游戏。

        有赢得2048的策略吗? 虽然没有保证每次都会获胜的策略,但一些技巧包括专注于合并更大的数字,为瓷砖移动创建清晰的路径,以及避免太快填满棋盘。

        这就是2048游戏~


        话不多说,直接启动,做一个略有简略但五脏俱全的小游戏版本

首先是我们的用户信息

public class UserInfo {
    private static int score;
    public String name;
    public UserInfo(String name) {
        this.name = name;
    }
    public static int getScore() {
        return score;
    }
    public static void setScore(int score) {
        UserInfo.score = score;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public static void addScore(int i){
        UserInfo.score+=i;
    }
}

很好,接下来我们应该摆出我们的胜利条件:

出现2048,然后我们会出现以下提示页面

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class winplay extends JFrame{
    public winplay(){
        UserInfo.addScore(5000);
        JOptionPane.showMessageDialog(null, 
        "游戏胜利,你的评分已出炉:"+UserInfo.getScore(),
        "胜利2048!",
        JOptionPane.INFORMATION_MESSAGE);
    }
}

接下来是我们的判断失败条件:

没有出现2048且每个方向上都无法移动

其中interplay这个类中包含了一个checkifvary方法,用来判断如果点击上下左右键,页面中方格布局是否会发生改变,如果不变,则移动无效。

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class overplay extends JFrame{
    public overplay(){
        JOptionPane.showMessageDialog(null, 
        "游戏结束,你的评分已出炉:"+UserInfo.getScore(),
        "结束啦",
        JOptionPane.INFORMATION_MESSAGE);
    }
    public static boolean finditOver(int[][] a){
        return (interplay.checkifvary(a,1)
        ||interplay.checkifvary(a,2)
        ||interplay.checkifvary(a,3)
        ||interplay.checkifvary(a,4));
    }
}

接下来是我们2048的主干部分,代码如下:

方法:

Ramdom2:随机生成2,如果方格已满,则游戏结束

isFull:判断是否已满

find2048:寻找是否已出现2048

phase1,2,3,4:分别对应上下左右的移动情形

checkifvary:移动是否为有效


public class interplay {
    int[][] a={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
    public static final int ROW=4;
    public static final int COLUMN=4;
    public static void Ramdom2(int[][] a){
        int count =0;
        int[] b=new int[16];
        for(int i=0;i<ROW;i++){
            for(int j=0;j<COLUMN;j++){
                if(a[i][j]==0){
                    b[count]=i*4+j;
                    count++;
                }
            }
        }
        long l = System.currentTimeMillis();
        int random = (int)l%(count);
        int therow=b[random]/4;
        int thecul=b[random]%4;
        a[therow][thecul]=2;
    }
    public static boolean ifFull(int [][] a){
        int num=0;
        for(int i=0;i<ROW;i++){
            for(int j=0;j<COLUMN;j++){
                if(a[i][j]==2048){
                    return false;
                }
                if(a[i][j]==0){
                    num++;
                }
            }
        }
        if(num==0){
            return false;
        }
        return true;
    }
    public static boolean find2048(int[][] a){
        for(int i=0;i<ROW;i++){
            for(int j=0;j<COLUMN;j++){
                if(a[i][j]==2048){
                    return true;
                }
            }
        }
        return false;
    }
    public static int[][] phase1(int[][] a){
        int[][] anew=new int[4][4];
        for(int j=0;j<COLUMN;j++){
            int[] d=new int[4];
            int k=0;
            for(int i=0;i<ROW;i++){
                if(a[i][j]!=0){
                d[k]=a[i][j];
                k++;
                }
            }
            for(int i=0;i<ROW-1;i++){
                if(d[i]==d[i+1]){
                    d[i]*=2;
                    d[i+1]=0;
                    UserInfo.addScore(d[i]);
                }
            }
            k=0;
            for(int i=0;i<ROW;i++){
                if(d[i]!=0){
                    anew[k][j]=d[i];
                    k++;
                }
            }
        }
        return anew;
    }
    public static int[][] phase2(int[][] a){
        int[][] anew=new int[4][4];
        for(int j=0;j<COLUMN;j++){
            int[] d=new int[4];
            int k=0;
            for(int i=ROW-1;i>=0;i--){
                if(a[i][j]!=0){
                d[k]=a[i][j];
                k++;
                }
            }
            for(int i=0;i<ROW-1;i++){
                if(d[i]==d[i+1]){
                    d[i]*=2;
                    d[i+1]=0;
                    UserInfo.addScore(d[i]);
                }
            }
            k=ROW-1;
            for(int i=0;i<ROW;i++){
                if(d[i]!=0){
                    anew[k][j]=d[i];
                    k--;
                }
            }
        }
        return anew;
    }
    public static int[][] phase3(int[][] a){
        int[][] anew=new int[4][4];
        for(int i=0;i<ROW;i++){
            int[] d=new int[4];
            int k=0;
            for(int j=0;j<COLUMN;j++){
                if(a[i][j]!=0){
                d[k]=a[i][j];
                k++;
                }
            }
            for(int j=0;j<COLUMN-1;j++){
                if(d[j]==d[j+1]){
                    d[j]*=2;
                    d[j+1]=0;
                    UserInfo.addScore(d[i]);
                }
            }
            k=0;
            for(int j=0;j<COLUMN;j++){
                if(d[j]!=0){
                    anew[i][k]=d[j];
                    k++;
                }
            }
        }
        return anew;
    }
    public static int[][] phase4(int[][] a){
        int[][] anew=new int[4][4];
        for(int i=0;i<ROW;i++){
            int[] d=new int[4];
            int k=0;
            for(int j=COLUMN-1;j>=0;j--){
                if(a[i][j]!=0){
                d[k]=a[i][j];
                k++;
                }
            }
            for(int j=0;j<COLUMN-1;j++){
                if(d[j]==d[j+1]){
                    d[j]*=2;
                    d[j+1]=0;
                    UserInfo.addScore(d[i]);
                }
            }
            k=COLUMN-1;
            for(int j=0;j<COLUMN;j++){
                if(d[j]!=0){
                    anew[i][k]=d[j];
                    k--;
                }
            }
        }
        return anew;
    }
    public static boolean checkifvary(int[][] a,int iv){
        int[][] b;
        if(iv==1){
            b=phase1(a);
        }else if(iv==2){
            b=phase2(a);
        }else if(iv==3){
            b=phase3(a);
        }else{
            b=phase4(a);
        }
        for(int i=0;i<ROW;i++){
            for(int j=0;j<COLUMN;j++){
                if(a[i][j]!=b[i][j]){
                    return true;
                }
            }
        }
        return false;
    }
    public static void main(String[] args) {
        int[][] a={{2,4,8,16},{0,8,8,0},{16,16,8,0},{16,2,8,32}};
        a=phase4(a);
        for(int i=0;i<4;i++){
           for(int j=0;j<4;j++){
            System.out.print(a[i][j]+" ");
        }
        System.out.println();
        }
    }
}

最后,我们把它录入到JFrame里面,就可以显示啦

给每个按钮添加动作监听,已经查看JLabel里的数字,从而设置数字当前颜色

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class panelplay extends JFrame{
    int[][] a0={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
    JPanel jPanel=new JPanel();
    JLabel[] jl=new JLabel[16];
    public panelplay(int a[][]){
        Container c=getContentPane();
        setTitle("2048  得分:"+UserInfo.getScore());
        setBounds(500, 300, 300, 250);
        JButton j1=new JButton("㊤");
        JButton j2=new JButton("㊦");
        JButton j3=new JButton("㊧");
        JButton j4=new JButton("㊨");
        jPanel=showpanel(a);
        j1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int[][] anew=new int[4][4];
                if(interplay.checkifvary(a,1)){
                    UserInfo.addScore(2);
                if(interplay.find2048(a)){
                    new winplay();
                    System.exit(0);
                }
                else if(interplay.ifFull(a)){
                    anew=interplay.phase1(a);
                    interplay.Ramdom2(anew);
                    jPanel=showpanel(anew);
                    dispose();
                }else if(overplay.finditOver(a)){
                    anew=interplay.phase1(a);
                    jPanel=showpanel(anew);
                    dispose();
                }else{
                    new overplay();
                    System.exit(0);
                }
                new panelplay(anew);
            }else{

            }
        }
        });
        j2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int[][] anew=new int[4][4];
                if(interplay.checkifvary(a, 2)){
                    UserInfo.addScore(2);
                if(interplay.find2048(a)){
                    new winplay();
                    System.exit(0);
                }
                else if(interplay.ifFull(a)){
                    anew=interplay.phase2(a);
                    interplay.Ramdom2(anew);
                    jPanel=showpanel(anew);
                    dispose();
                }else if(overplay.finditOver(a)){
                    anew=interplay.phase2(a);
                    jPanel=showpanel(anew);
                    dispose();
                }else{
                    new overplay();
                    System.exit(0);
                }
                new panelplay(anew);
            }else{

            }
        }
        });
        j3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int[][] anew=new int[4][4];
                if(interplay.checkifvary(a, 3)){
                    UserInfo.addScore(2);
                if(interplay.find2048(a)){
                    new winplay();
                    System.exit(0);
                }
                else if(interplay.ifFull(a)){
                    anew=interplay.phase3(a);
                    interplay.Ramdom2(anew);
                    jPanel=showpanel(anew);
                    dispose();
                }else if(overplay.finditOver(a)){
                    anew=interplay.phase3(a);
                    jPanel=showpanel(anew);
                    dispose();
                }else{
                    new overplay();
                    System.exit(0);
                }
                new panelplay(anew);
            }else{

            }
        }
        });
        j4.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int[][] anew=new int[4][4];
                if(!overplay.finditOver(a)){
                    new overplay();
                    System.exit(0);
                }
                else if(interplay.checkifvary(a, 4)){
                UserInfo.addScore(2);
                if(interplay.find2048(a)){
                    new winplay();
                    System.exit(0);
                }
                    anew=interplay.phase4(a);
                    interplay.Ramdom2(anew);
                    jPanel=showpanel(anew);
                    dispose();
                new panelplay(anew);
            }else{

            }
        }
        });
        c.add(jPanel,BorderLayout.CENTER);
        c.add(j1,BorderLayout.NORTH);
        c.add(j2,BorderLayout.SOUTH);
        c.add(j3,BorderLayout.WEST);
        c.add(j4,BorderLayout.EAST);
        setVisible(true);
    }
    public JPanel showpanel(int[][] a){
        jPanel.setLayout(new GridLayout(4,4));
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                String s="   "+a[i][j];
                jl[i*4+j]=new JLabel(s);
            }
        }
        for(int i=0;i<16;i++){
            if(jl[i].getText().equals("   0")){
                jl[i].setForeground(Color.WHITE);
            }
            else if(jl[i].getText().equals("   2")){
                jl[i].setForeground(Color.GRAY);
            }
            else if(jl[i].getText().equals("   4")){
                jl[i].setForeground(Color.GRAY);
            }
            else if(jl[i].getText().equals("   8")){
                jl[i].setForeground(Color.DARK_GRAY);
            }
            else if(jl[i].getText().equals("   16")){
                jl[i].setForeground(Color.BLACK);
            }
            else if(jl[i].getText().equals("   32")){
                jl[i].setForeground(Color.BLACK);
            }
            else if(jl[i].getText().equals("   64")){
                jl[i].setForeground(Color.BLUE);
            }
            else if(jl[i].getText().equals("   128")){
                jl[i].setForeground(Color.MAGENTA);
            }
            else if(jl[i].getText().equals("   256")){
                jl[i].setForeground(Color.RED);
            }
            else if(jl[i].getText().equals("   512")){
                jl[i].setForeground(Color.ORANGE);
            }
            else if(jl[i].getText().equals("   1024")){
                jl[i].setForeground(Color.YELLOW);
            }
            else if(jl[i].getText().equals("   2048")){
                jl[i].setForeground(Color.PINK);
            }else{
                jl[i].setForeground(Color.BLACK);
            }
            jPanel.add(jl[i]);
        }
        return jPanel;
    }
    public static void main(String[] args) {
        UserInfo.setScore(0);
        int[][] a={{2,4,8,16},{16,8,4,128},{32,256,1024,0},{2,16,512,32}};
        int[][] a0={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
        interplay.Ramdom2(a0);
        new panelplay(a0);
    }
}

最后生成的运行结果图:(当时还没加颜色,这是我唯一一次2048成功图)


当然这个是可以做出一个排行榜的,下次我会附上用MySQL做的排行榜的代码

挺有意思 ~

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值