java项目---2048

简介: 《2048》 是一款比较流行的数字游戏,最早于2014年3月20日发行。原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台。

目录


游戏介绍


游戏玩法


全代码


(1)Main类:


(2)GamePanel类


(3)Card类


(4)GameFrame类


项目设计思路


1.绘制一个窗口


2.创建菜单


3.创建所有空白卡片


(1)我们先写一个(Card)类定义卡片


(2)然后再创建卡片


4.随机创建一个卡片 (2或者4)


5.键盘事件监听 (上、下、左、右键监听)


6.根据键盘的方向,处理数字的移动合并


7.加入成功、失败判定


游戏介绍

《2048》  是一款比较流行的数字游戏,最早于2014年3月20日发行。原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台。


游戏玩法

每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。不断的叠加最终拼凑出2048这个数字就算成功。

5215d7a93ee67edb8b3a2da3daf10728_4fc4d68390fc47c0be1dbafdf3d5bf41.png

全代码

(1)Main类:

public class Main {
    public static void main(String[] args) {
        GameFrame frame = new GameFrame();
        GamePanel panel = new GamePanel(frame);
        frame.add(panel);
        frame.setVisible(true);
    }
}

(2)GamePanel类

import com.sun.rowset.internal.Row;
import javax.swing.*;
import javax.swing.plaf.FontUIResource;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;
public class GamePanel extends JPanel implements ActionListener {
    private JFrame frame = null;
    private GamePanel panel = null;
    private static final int RowS = 4;
    private static final int COLS = 4;
    private Card[][] cards = new Card[RowS][COLS];
    private String gameFalg = "start";
    public GamePanel(JFrame frame){
        this.setLayout(null);
        this.setOpaque(false);
        this.frame = frame;
        this.panel = this;
        //创建菜单
        createMenu();
        //创建卡片
        createCard();
        //随机一个卡片
        createRandomNum();
        //创建键盘监听
        createKeyLinsener();
    }
    //创建键盘监听
    private void createKeyLinsener() {
        KeyAdapter keyAdapter = new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(!"start".equals(gameFalg)) {
                    return;
                }
                int key = e.getKeyCode();
                switch (key){
                    //上
                    case KeyEvent.VK_UP:
                    case KeyEvent.VK_W:
                        moveCard(1);
                        break;
                    //友
                    case KeyEvent.VK_RIGHT:
                    case KeyEvent.VK_D:
                        moveCard(2);
                        break;
                    //下
                    case KeyEvent.VK_DOWN:
                    case KeyEvent.VK_S:
                        moveCard(3);
                        break;
                    //左
                    case KeyEvent.VK_LEFT:
                    case KeyEvent.VK_A:
                        moveCard(4);
                        break;
                }
            }
        };
        frame.addKeyListener(keyAdapter);
    }
    //按方向移动卡片
    private void moveCard(int i) {
        //清理卡片的合并标记
        clearCard();
        if(i == 1) {
            moveCardTop();
        }else if(i == 2) {
            moveCardRight();
        }else if(i == 3) {
            moveCardBotton();
        }else if(i == 4) {
            moveCardLeft();
        }
        //新创建卡片
        createRandomNum();
        //重绘画布
        repaint();
        //判断游戏是否结束
        gameOverNot();
    }
    //判断游戏是否结束
    private void gameOverNot() {
        if(isWin()) {
            gameWin();
        }else if(cardIsFull()) {
            //位置满
            //if(moveCardTop(false)|| moveCardBotton(false) || moveCardLeft(false) || moveCardRight(false)) {
            //    return;
            //}else {
                //游戏失败
            gameOver();
            //}
        }
    }
    private void gameWin() {
        gameFalg = "end";
        UIManager.put("Optionpane.buttonFont",new FontUIResource(new Font("思源宋体",Font.ITALIC,18)));
        UIManager.put("Optionpane.buttonFont",new FontUIResource(new Font("思源宋体",Font.ITALIC,18)));
        JOptionPane.showMessageDialog(frame,"你成功了,太棒啦!");
    }
    private void gameOver() {
        gameFalg = "end";
        UIManager.put("Optionpane.buttonFont",new FontUIResource(new Font("思源宋体",Font.ITALIC,18)));
        UIManager.put("Optionpane.buttonFont",new FontUIResource(new Font("思源宋体",Font.ITALIC,18)));
        JOptionPane.showMessageDialog(frame,"失败了,再接再厉!");
    }
    private boolean isWin() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = 0; j < COLS; j++) {
                card = cards[i][j];
                if(card.getNum() == 64) {
                    return true;
                }
            }
        }
        return false;
    }
    //清理卡片的合并标记
    private void clearCard() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = 0; j < COLS; j++) {
                card = cards[i][j];
                card.setMerge(false);
            }
        }
    }
    private void moveCardTop() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = 0; j < COLS; j++) {
                card = cards[i][j];
                if(card.getNum() != 0) {
                    //不是空白就移动
                    card.moveTop(cards);
                }
            }
        }
    }
    private void moveCardBotton() {
        Card card;
        for (int i = RowS-2; i >= 0; i--) {
            for (int j = 0; j < COLS; j++) {
                card = cards[i][j];
                if(card.getNum() != 0) {
                    //不是空白就移动
                    card.moveDown(cards);
                }
            }
        }
    }
    private void moveCardLeft() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = 1; j < COLS; j++) {
                card = cards[i][j];
                if(card.getNum() != 0) {
                    //不是空白就移动
                    card.moveLeft(cards);
                }
            }
        }
    }
    private void moveCardRight() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = COLS-2; j >= 0; j--) {
                card = cards[i][j];
                if(card.getNum() != 0) {
                    //不是空白就移动
                    card.moveRight(cards);
                }
            }
        }
    }
    //随机一个卡片
    private void createRandomNum() {
        int num = 0;
        Random random = new Random();
        int index = random.nextInt(5)+1;
        if(index == 1) {
            num = 4;
        }else {
            num = 2;
        }
        //如果格子满了,不取了
        if(cardIsFull()) {
            return;
        }
        //取到卡片
        Card card = getRandomCard(random);
        //设置卡片数字
        if(card != null) {
            card.setNum(num);
        }
    }
    private boolean cardIsFull() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = 0; j < COLS; j++) {
                card = cards[i][j];
                if(card.getNum() == 0) {
                    return false;
                }
            }
        }
        return true;
    }
    private Card getRandomCard(Random random) {
        int i = random.nextInt(RowS);
        int j = random.nextInt(COLS);
        Card card = cards[i][j];
        if(card.getNum() == 0) {
            //空卡片返回
            return card;
        }
        //没找到递归,继续找
        return getRandomCard(random);
    }
    //创建卡片
    private void createCard() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = 0; j < COLS; j++) {
                card = new Card(i, j);
                cards[i][j] = card;
            }
        }
    }
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        //绘制卡片
        drawCard(g);
    }
    //绘制卡片
    private void drawCard(Graphics g) {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = 0; j < COLS; j++) {
                card = cards[i][j];
                card.draw(g);
            }
        }
    }
    //创建字体
    private Font createFont() {
        return new Font("思源宋体",Font.BOLD,18);
    }
    //创建菜单
    private void createMenu() {
        //创建JMenuBar
        JMenuBar jmb = new JMenuBar();
        //创建字体
        Font font = createFont();
        JMenu jMenu1 = new JMenu("游戏");
        //创建子项
        JMenuItem jMenuItem1 = new JMenuItem("新游戏");
        JMenuItem jMenuItem2 = new JMenuItem("退出");
        //添加子项
        jMenu1.add(jMenuItem1);
        jMenu1.add(jMenuItem2);
        //使用上面的字体
        jMenu1.setFont(font);
        jMenuItem1.setFont(font);
        jMenuItem2.setFont(font);
        JMenu jMenu2 = new JMenu("帮助");
        //创建子项
        JMenuItem jMenuItem3 = new JMenuItem("操作帮助");
        JMenuItem jMenuItem4 = new JMenuItem("胜利条件");
        //添加子项
        jMenu2.add(jMenuItem3);
        jMenu2.add(jMenuItem4);
        //使用上面的字体
        jMenu2.setFont(font);
        jMenuItem3.setFont(font);
        jMenuItem4.setFont(font);
        jmb.add(jMenu1);
        jmb.add(jMenu2);
        frame.setJMenuBar(jmb);
        //添加时间鉴定
        jMenuItem1.addActionListener(this);
        jMenuItem2.addActionListener(this);
        jMenuItem3.addActionListener(this);
        jMenuItem4.addActionListener(this);
        //设置指令
        jMenuItem1.setActionCommand("restart");
        jMenuItem2.setActionCommand("exit");
        jMenuItem3.setActionCommand("help");
        jMenuItem4.setActionCommand("win");
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        if("restart".equals(command)) {
            System.out.println("新游戏");
            restart();
        }else if("exit".equals(command)) {
            System.out.println("退出");
            Object[] optioons = {"确定","取消"};
            int ret = JOptionPane.showConfirmDialog(this,"你确定要退出游戏吗?",
                    "", JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE,null);
            System.exit(ret);
        }else if("help".equals(command)) {
            System.out.println("帮助");
            JOptionPane.showConfirmDialog(null,"通过键盘上下左右来移动,相同数字会合并!!!",
                    "提示", JOptionPane.INFORMATION_MESSAGE);
        }else if("win".equals(command)) {
            System.out.println("胜利");
            JOptionPane.showConfirmDialog(null,"数字到2048会胜利,当没有空位时则失败!!!",
                    "提示", JOptionPane.INFORMATION_MESSAGE);
        }
    }
    private void restart() {
    }
}

(3)Card类

import java.awt.*;
public class Card {
    private int x = 0;//x坐标
    private int y = 0;//y坐标
    private int high = 85;//高
    private int width = 85;//宽
    private int i = 0;//下标
    private int j = 0;//下标
    private int start = 0;//偏移量
    private int num = 0;//数字
    private boolean merge = false;//是否合并
    Card(int i, int j) {
        this.i = i;
        this.j = j;
        cal();
    }
    private void cal() {
        this.x = start + j*width + (j+1)*5;
        this.y = start + i*high + (i+1)*5;
    }
    //卡片的绘制
    public void draw(Graphics g) {
        Color color = getColor();
        Color oColor = g.getColor();
        //设置新颜色
        g.setColor(color);
        g.fillRoundRect(x, y, width, high, 4, 4);
        //绘制数字
        if(num != 0) {
            g.setColor(new Color(125,78,51));
            Font font = new Font("思源宋体",Font.BOLD,35);
            g.setFont(font);
            String text = num + "";
            int textLen = getWordWidth(font,text,g);
            int tx = x + (width-textLen)/2;
            int ty = y + 50;
            g.drawString(text,tx,ty);
        }
        //还原颜色
        g.setColor(oColor);
    }
    //得到字体字符串长度
    public static int getWordWidth(Font font, String conten, Graphics g) {
        FontMetrics metrics = g.getFontMetrics(font);
        int width = 0;
        for (int i = 0; i < conten.length(); i++) {
            //width += metrics.charsWidth(conten.charAt(i));
        }
        return width;
    }
    //获取颜色
    private Color getColor(){
        Color color = null;
        //根据num设置颜色
        switch (num) {
            case 2:
                color = new Color(238,244,234);
                break;
            case 4:
                color = new Color(222,236,200);
                break;
            case 8:
                color = new Color(174,231,130);
                break;
            case 16:
                color = new Color(142,201,75);
                break;
            case 32:
                color = new Color(111,148,48);
                break;
            case 64:
                color = new Color(76,174,124);
                break;
            default:
                color = new Color(92,151,117);
                break;
        }
        return color;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public int getNum() {
        return this.num;
    }
    public void setMerge(boolean merge) {
        this.merge = merge;
    }
    //向上移动
    public void moveTop(Card[][] cards) {
        //设定递归退出条件
        if(i == 0) {
            return;
        }
        //上一个卡片
        Card prev = cards[i-1][j];
        if(prev.getNum() == 0) {
            //交换上去
            prev.num = this.num;
            this.num = 0;
            //移到最上
            prev.moveTop(cards);
        }else if(prev.getNum() == num && !prev.merge){
            //合并
            prev.merge = true;
            prev.num = this.num * 2;
            this.num = 0;
        }
    }
    //向下移动
    public void moveDown(Card[][] cards) {
        //设定递归退出条件
        if(i == 3) {
            return;
        }
        //上一个卡片
        Card prev = cards[i+1][j];
        if(prev.getNum() == 0) {
            //交换上去
            prev.num = this.num;
            this.num = 0;
            //移到最上
            prev.moveDown(cards);
        }else if(prev.getNum() == num && !prev.merge){
            //合并
            prev.merge = true;
            prev.num = this.num * 2;
            this.num = 0;
        }
    }
    //向左移动
    public void moveLeft(Card[][] cards) {
        //设定递归退出条件
        if(j == 0) {
            return;
        }
        //上一个卡片
        Card prev = cards[i][j-1];
        if(prev.getNum() == 0) {
            //交换上去
            prev.num = this.num;
            this.num = 0;
            //移到最上
            prev.moveLeft(cards);
        }else if(prev.getNum() == num && !prev.merge){
            //合并
            prev.merge = true;
            prev.num = this.num * 2;
            this.num = 0;
        }
    }
    //向右移动
    public void moveRight(Card[][] cards) {
        //设定递归退出条件
        if(j == 3) {
            return;
        }
        //上一个卡片
        Card prev = cards[i][j+1];
        if(prev.getNum() == 0) {
            //交换上去
            prev.num = this.num;
            this.num = 0;
            //移到最上
            prev.moveRight(cards);
        }else if(prev.getNum() == num && !prev.merge){
            //合并
            prev.merge = true;
            prev.num = this.num * 2;
            this.num = 0;
        }
    }
}

(4)GameFrame类

import javax.swing.*;
import java.awt.*;
public class GameFrame extends JFrame {
    public GameFrame(){
        setTitle("2028");
        setSize(370,420);
        getContentPane().setBackground(new Color(66, 136, 83));//设置窗口背景
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭后进程退出
        setLocationRelativeTo(null);//居中
        setResizable(false);//大小不可变
    }
}

项目设计思路

1.绘制一个窗口

我们可以先给这个项目一个默认的窗口,小编的供大家参考,大家可以根据爱好自行设计


我们java中绘制窗口的时候要用到Jframe,以便利用和main函数代码简洁,这里 我们写一个类专门用来绘制窗口GameFrame(继承与JFrame)

import javax.swing.*;
import java.awt.*;
public class GameFrame extends JFrame {
    public GameFrame(){
        setTitle("2028");
        setSize(370,420);
        getContentPane().setBackground(new Color(66, 136, 83));//设置窗口背景
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭后进程退出
        setLocationRelativeTo(null);//居中
        setResizable(false);//大小不可变
    }
}


2.创建菜单

创建菜单的时候要用到JPanel,在这里我们专门写一个类GamePanel用来创建菜单(可以参考上面的总代买进行参考)


从下面图片可知 我们菜单主要有 游戏(中有新游戏和退出) 和 帮助(中有操作帮助和胜利条件) 。

bd106fea6493e2bf36584ede8886feb3_daf11bdee2a14935826fcb13dc533920.png

99d27418e6dcd7cab4b16a3e87e746c7_95c9e8b6db684b59b1473d21ec2b4312.png

//创建字体
    private Font createFont() {
        return new Font("思源宋体",Font.BOLD,18);
    }
    //创建菜单
    private void createMenu() {
        //创建JMenuBar
        JMenuBar jmb = new JMenuBar();
        //创建字体
        Font font = createFont();
        JMenu jMenu1 = new JMenu("游戏");
        //创建子项
        JMenuItem jMenuItem1 = new JMenuItem("新游戏");
        JMenuItem jMenuItem2 = new JMenuItem("退出");
        //添加子项
        jMenu1.add(jMenuItem1);
        jMenu1.add(jMenuItem2);
        //使用上面的字体
        jMenu1.setFont(font);
        jMenuItem1.setFont(font);
        jMenuItem2.setFont(font);
        JMenu jMenu2 = new JMenu("帮助");
        //创建子项
        JMenuItem jMenuItem3 = new JMenuItem("操作帮助");
        JMenuItem jMenuItem4 = new JMenuItem("胜利条件");
        //添加子项
        jMenu2.add(jMenuItem3);
        jMenu2.add(jMenuItem4);
        //使用上面的字体
        jMenu2.setFont(font);
        jMenuItem3.setFont(font);
        jMenuItem4.setFont(font);
        jmb.add(jMenu1);
        jmb.add(jMenu2);
        frame.setJMenuBar(jmb);
        //添加时间鉴定
        jMenuItem1.addActionListener(this);
        jMenuItem2.addActionListener(this);
        jMenuItem3.addActionListener(this);
        jMenuItem4.addActionListener(this);
        //设置指令
        jMenuItem1.setActionCommand("restart");
        jMenuItem2.setActionCommand("exit");
        jMenuItem3.setActionCommand("help");
        jMenuItem4.setActionCommand("win");
    }
3.创建所有空白卡片 
(1)我们先写一个(Card)类定义卡片
public class Card {
    private int x = 0;//x坐标
    private int y = 0;//y坐标
    private int high = 85;//高
    private int width = 85;//宽
    private int i = 0;//下标
    private int j = 0;//下标
    private int start = 0;//偏移量
    private int num = 0;//数字
    private boolean merge = false;//是否合并
    Card(int i, int j) {
        this.i = i;
        this.j = j;
        cal();
    }
    private void cal() {
        this.x = start + j*width + (j+1)*5;
        this.y = start + i*high + (i+1)*5;
    }
    //卡片的绘制
    public void draw(Graphics g) {
        Color color = getColor();
        Color oColor = g.getColor();
        //设置新颜色
        g.setColor(color);
        g.fillRoundRect(x, y, width, high, 4, 4);
        //绘制数字
        if(num != 0) {
            g.setColor(new Color(125,78,51));
            Font font = new Font("思源宋体",Font.BOLD,35);
            g.setFont(font);
            String text = num + "";
            int textLen = getWordWidth(font,text,g);
            int tx = x + (width-textLen)/2;
            int ty = y + 50;
            g.drawString(text,tx,ty);
        }
        //还原颜色
        g.setColor(oColor);
    }
    //得到字体字符串长度
    public static int getWordWidth(Font font, String conten, Graphics g) {
        FontMetrics metrics = g.getFontMetrics(font);
        int width = 0;
        for (int i = 0; i < conten.length(); i++) {
            //width += metrics.charsWidth(conten.charAt(i));
        }
        return width;
    }
    //获取颜色
    private Color getColor(){
        Color color = null;
        //根据num设置颜色
        switch (num) {
            case 2:
                color = new Color(238,244,234);
                break;
            case 4:
                color = new Color(222,236,200);
                break;
            case 8:
                color = new Color(174,231,130);
                break;
            case 16:
                color = new Color(142,201,75);
                break;
            case 32:
                color = new Color(111,148,48);
                break;
            case 64:
                color = new Color(76,174,124);
                break;
            default:
                color = new Color(92,151,117);
                break;
        }
        return color;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public int getNum() {
        return this.num;
    }
    public void setMerge(boolean merge) {
        this.merge = merge;
    }
}

(2)然后再创建卡片

//创建卡片
    private void createCard() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = 0; j < COLS; j++) {
                card = new Card(i, j);
                cards[i][j] = card;
            }
        }
    }

4.随机创建一个卡片 (2或者4)

在窗口中创建卡片后,我们想让卡片上生成2,4随机数字

    //随机一个卡片
    private void createRandomNum() {
        int num = 0;
        Random random = new Random();
        int index = random.nextInt(5)+1;
        if(index == 1) {
            num = 4;
        }else {
            num = 2;
        }
        //如果格子满了,不取了
        if(cardIsFull()) {
            return;
        }
        //取到卡片
        Card card = getRandomCard(random);
        //设置卡片数字
        if(card != null) {
            card.setNum(num);
        }
    }
    private boolean cardIsFull() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = 0; j < COLS; j++) {
                card = cards[i][j];
                if(card.getNum() == 0) {
                    return false;
                }
            }
        }
        return true;
    }
    private Card getRandomCard(Random random) {
        int i = random.nextInt(RowS);
        int j = random.nextInt(COLS);
        Card card = cards[i][j];
        if(card.getNum() == 0) {
            //空卡片返回
            return card;
        }
        //没找到递归,继续找
        return getRandomCard(random);
    }

5.键盘事件监听 (上、下、左、右键监听)

//创建键盘监听
    private void createKeyLinsener() {
        KeyAdapter keyAdapter = new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(!"start".equals(gameFalg)) {
                    return;
                }
                int key = e.getKeyCode();
                switch (key){
                    //上
                    case KeyEvent.VK_UP:
                    case KeyEvent.VK_W:
                        moveCard(1);
                        break;
                    //友
                    case KeyEvent.VK_RIGHT:
                    case KeyEvent.VK_D:
                        moveCard(2);
                        break;
                    //下
                    case KeyEvent.VK_DOWN:
                    case KeyEvent.VK_S:
                        moveCard(3);
                        break;
                    //左
                    case KeyEvent.VK_LEFT:
                    case KeyEvent.VK_A:
                        moveCard(4);
                        break;
                }
            }
        };
        frame.addKeyListener(keyAdapter);
    }

6.根据键盘的方向,处理数字的移动合并

 

//按方向移动卡片
    private void moveCard(int i) {
        //清理卡片的合并标记
        clearCard();
        if(i == 1) {
            moveCardTop();
        }else if(i == 2) {
            moveCardRight();
        }else if(i == 3) {
            moveCardBotton();
        }else if(i == 4) {
            moveCardLeft();
        }
    }
    private void moveCardTop() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = 0; j < COLS; j++) {
                card = cards[i][j];
                if(card.getNum() != 0) {
                    //不是空白就移动
                    card.moveTop(cards);
                }
            }
        }
    }
    private void moveCardBotton() {
        Card card;
        for (int i = RowS-2; i >= 0; i--) {
            for (int j = 0; j < COLS; j++) {
                card = cards[i][j];
                if(card.getNum() != 0) {
                    //不是空白就移动
                    card.moveDown(cards);
                }
            }
        }
    }
    private void moveCardLeft() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = 1; j < COLS; j++) {
                card = cards[i][j];
                if(card.getNum() != 0) {
                    //不是空白就移动
                    card.moveLeft(cards);
                }
            }
        }
    }
    private void moveCardRight() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = COLS-2; j >= 0; j--) {
                card = cards[i][j];
                if(card.getNum() != 0) {
                    //不是空白就移动
                    card.moveRight(cards);
                }
            }
        }
    }

7.加入成功、失败判定

 

//判断游戏是否结束
    private void gameOverNot() {
        if(isWin()) {
            gameWin();
        }else if(cardIsFull()) {
            //位置满
            //if(moveCardTop(false)|| moveCardBotton(false) || moveCardLeft(false) || moveCardRight(false)) {
            //    return;
            //}else {
                //游戏失败
            gameOver();
            //}
        }
    }
    private void gameWin() {
        gameFalg = "end";
        UIManager.put("Optionpane.buttonFont",new FontUIResource(new Font("思源宋体",Font.ITALIC,18)));
        UIManager.put("Optionpane.buttonFont",new FontUIResource(new Font("思源宋体",Font.ITALIC,18)));
        JOptionPane.showMessageDialog(frame,"你成功了,太棒啦!");
    }
    private void gameOver() {
        gameFalg = "end";
        UIManager.put("Optionpane.buttonFont",new FontUIResource(new Font("思源宋体",Font.ITALIC,18)));
        UIManager.put("Optionpane.buttonFont",new FontUIResource(new Font("思源宋体",Font.ITALIC,18)));
        JOptionPane.showMessageDialog(frame,"失败了,再接再厉!");
    }
    private boolean isWin() {
        Card card;
        for (int i = 0; i < RowS; i++) {
            for (int j = 0; j < COLS; j++) {
                card = cards[i][j];
                if(card.getNum() == 64) {
                    return true;
                }
            }
        }
        return false;
    }


目录
相关文章
|
5天前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(完结)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!(完结)
14 0
|
1月前
|
安全 Java 数据安全/隐私保护
在Java项目中集成单点登录(SSO)方案
在Java项目中集成单点登录(SSO)方案
|
6天前
|
SQL Java 数据库连接
java连接数据库加载驱动到java项目
该博客文章介绍了如何在Java项目中通过代码加载数据库驱动并连接SQL Server数据库,包括具体的加载驱动和建立数据库连接的步骤,以及如何将驱动包添加到Java项目的构建路径中。
|
5天前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(17)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!
12 0
【前端学java】java基础练习缺少项目?看这篇文章就够了!(17)
|
23天前
|
Java Spring
idea新建spring boot 项目右键无package及java类的选项
idea新建spring boot 项目右键无package及java类的选项
34 5
|
5天前
|
Java Spring
Java SpringBoot Bean InitializingBean 项目初始化
Java SpringBoot Bean InitializingBean 项目初始化
13 0
|
6天前
|
Java 网络安全 开发工具
新手入门Java。如何下载Eclipse、写出最基本的“Hello word”以及如何连接github并且上传项目。
新手入门Java。如何下载Eclipse、写出最基本的“Hello word”以及如何连接github并且上传项目。
17 0
|
7天前
|
jenkins Java 持续交付
自动化魔法:用Jenkins打造Java项目的持续部署流水线
【8月更文挑战第13天】在软件开发中,自动化部署是提高效率与减少错误的关键。Jenkins作为一款强大的持续集成工具,支持Java项目的自动化构建、测试与部署。通过配置Jenkins及其丰富的插件生态(如Git和Maven插件),可实现从代码提交到上线的全自动化流程。此流程包括从GitHub自动拉取代码、使用Maven构建项目,并通过如`mvn clean install`命令执行构建,最后利用插件如“Publish Over SSH”将制品部署至远程服务器。此外,还可配置邮件通知等后处理动作确保发布的稳定可靠。借助Jenkins,开发者能显著加速软件交付周期,同时减少手动操作带来的风险。
23 0
|
8天前
|
Java Shell
Java Sprintboot jar 项目启动、停止脚本
Java Sprintboot jar 项目启动、停止脚本
17 0
|
1月前
|
设计模式 消息中间件 监控
如何在Java项目中实现可扩展性架构
如何在Java项目中实现可扩展性架构