java项目---2048

news2024/10/6 18:35:24

目录

游戏介绍

游戏玩法

全代码

(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这个数字就算成功。


全代码

(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用来创建菜单(可以参考上面的总代买进行参考)

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

    //创建字体
    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;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/766947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目经理在日常管理工作中需要注意什么?

项目管理的核心在于以项目经理为主导的团队协作&#xff0c;项目经理需要管理团队成员&#xff0c;保障团队的产出和效能。因此&#xff0c;项目经理需要具备多种能力&#xff0c;如沟通能力、管理能力、洞察人心的能力等&#xff0c;才能有效推动项目进展。 1、制定计划是项…

如何更改idea的背景,以及显示某些属性

idea项目无法正常显示的问题 在idea中右侧的属性都不存在的解决方法,或左边的不显示,我浏览了很多的文章才找到的解决办法,在这里分享给大家 就可以显示出来了,因为我原来已经显示了,当我取消后就看不到了 修改背景 1.先进入到设置的页面 选择完成后点击ok把设置关了就设置成功…

Java开发 - 深入理解Redis哨兵机制原理

前言 Redis的主从、哨兵模式、集群模式&#xff0c;在前文中都已经有了详细的搭建流程&#xff0c;可谓是手把手教程&#xff0c;也得到了很多朋友的喜欢。由于前文偏向于应用方面&#xff0c;就导致了理论知识的匮乏&#xff0c;我们可能会用了&#xff0c;但却不明所以&…

基于STM32的homeassistant(采用FreeRTOS操作系统)【第三章:HA服务器搭建、数据展示】

第三章开发环境 硬件设备STM32与各类传感器&#xff08;与前两章一致&#xff09;服务器设备腾讯云&#xff08;阿里云等云服务器或自建服务器端均可&#xff09;移植环境Homeassistant、EMQ 具体实现方案 视频教程 homeassistant配置MQTT集成以及传感器实体&#xff08;ST…

C语言程序设计——结构体、枚举、联合

一、结构体 1. 概念 结构体是一种自定义的数据类型&#xff0c;它是一些值的集合&#xff0c;这些值称为成员变量&#xff0c;结构体由多个数据成员组成&#xff0c;这些成员可以是不同类型的变量。 2. 结构体的声明 2.1 一般声明 struct student {char name[10];int age; …

Nginx系列之 一 反向代理

目录 Nginx系列之 一 入门_开着拖拉机回家的博客-CSDN博 一、Nginx概述 二、反向代理 2.1 正向代理 2.2 反向代理 三、反向代理实战 3.1测试服务器 3.2 配置文件说明 3.3 反向代理实战案例一 1、目的 2、具体实现 3.4 反向代理实战案例二 1、目的 2、具体实现 入…

力扣 860. 柠檬水找零

题目来源&#xff1a;https://leetcode.cn/problems/lemonade-change/description/ C题解&#xff1a;由于收到的钱币只有5&#xff0c;10&#xff0c;20三种&#xff0c;对于5元直接收&#xff0c;对于10元找零1张5元&#xff0c;对于20元找零15元&#xff0c;可以找零105或者…

java 使用 geotools 将 shp 文件(zip压缩包)转换为 geoJson 格式

步骤0&#xff1a;你也可以参考这篇文章 &#xff1a;java实现geojson格式数据与shp文件相互转换 步骤1&#xff1a;引入引入geotools工具。 步骤2&#xff1a;编写工具类&#xff0c;获取shp的zip文件。 步骤3&#xff1a;编写工具类&#xff0c;解析shp文件成为jsonObject…

6.7Jmeter5.1,非GUI模式,通过命令行传递线程数和运行时间

原创文章&#xff0c;谢绝转载。 一、前提 本次做性能测试&#xff0c;需求是需要在Linux下的非GUI模式下执行。但用命令行执行时&#xff0c;线程数需要改变&#xff0c;为了执行方便&#xff0c;不需要每次都在脚本中修改线程数&#xff0c;那么线程数都需要通过参数传递&…

如何使用自有数据微调ChatGLM-6B

构建自己的数据集 数据格式&#xff1a;问答对 官网例子 ADGEN 数据集任务为根据输入&#xff08;content&#xff09;生成一段广告词&#xff08;summary&#xff09;。 { "content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖…

【雕爷学编程】Arduino动手做(22)——8X8 LED点阵MAX7219屏2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#xff0c;这…

AI图像生成无需代码连接集简云数据表的方法

1 场景描述 人工智能的出现&#xff0c;各个领域都开始尝试将AI作为提高工作效率的必备工具。除了AI对话等&#xff0c;越来越多的AI图像生成工具也出现在市场上。这些AI图像生成工具可以自动创建惊人的图像、艺术作品和设计&#xff0c;从而帮助设计师和创意人员更快速地实现其…

下个月要备多少货?伙伴云零代码进销存系统让您一目了然

大量企业的商业模式是销售实体商品&#xff0c;他们需要进销存系统来帮助企业管理好采购、销售、仓储的业务流程&#xff0c;从而更高效稳定的获得利润&#xff0c;因此进销存是企业的核心业务场景。来看看伙伴云零代码进销存系统如何精准计算进货出货数量&#xff0c;让中小企…

unable to get local issuer certificate (_ssl.c:992)‘)]

操作系统mac os python 版本 python3.11 import edge_tts import asyncio TEXT "how are you"print(TEXT) voice zh-CN-YunxiNeural output 4.mp3 rate -4% volume 0% async def my_function():tts edge_tts.Communicate(text TEXT,voice voice,rate rate…

上海汽配IPO上会在即:由镇政府控股,募资还要偿还银行贷款?

近日&#xff0c;上海证券交易所披露的信息显示&#xff0c;上海汽车空调配件股份有限公司&#xff08;以下简称“上海汽配”&#xff09;将于7月21日接受上市委审议。据贝多财经了解&#xff0c;上海汽配已于7月13日更新了招股书&#xff08;上会稿&#xff09;。 本次冲刺IPO…

学Python编程为什么会对学好数学有帮助呢?

Python编程和数学有什么关系呢&#xff1f;Python的起源是怎样的呢&#xff1f; 我们先来简单认识一下Python&#xff0c;和Python交个朋友。 Python的全拼是P—Y—T—H—O—N&#xff0c;发音是Python&#xff0c;汉语解释是蟒蛇的意思。 我们再来看Python的图标&#xff0c…

STM32实现MLX90614非接触测温串口显示(标准库与HAL库实现)

目录 模块选择 编程环境 MLX90614基本原理 通信协议&#xff08;SMBus通信&#xff0c;类IIC通信&#xff09; 代码实现 STM32与模块之间接线表 1.标准库实现温度采集 2.HAL库实现温度采集 模块选择 STM32F103C8T6 MLX90614 非接触式红外测温传感器 编程环境 KEIL5&…

了解交换机接口的链路类型(access、trunk、hybrid)

上一个章节中讲到了vlan的作用及使用&#xff0c;这篇了解一下交换机接口的链路类型和什么情况下使用 vlan在数据包中是如何体现的&#xff0c;在上一篇的时候提到测试了一下&#xff0c;从PC1去访问PC4的时候&#xff0c;只从E0/0/2发送给了E0/0/3这是&#xff0c;因为两个接…

手把手GDB调试

确保你的程序有可调式的信息 使用gcc编译一个程序 ,带上一些额外的参数 -o0 -g-o0 &#xff1a;避免编译器优化&#xff0c;使用最低的优化等级&#xff0c;默认的编译选项 -g &#xff1a;生产调试信息 如果你已经有一个工程demo&#xff0c;使用cmake时注意使用Debug模式&…

Java使用poi-tl生成word文档添加超链接及添加多个超链接情况

首先是生成单个超链接情况&#xff0c;很简单 就是通过字符替换就行&#xff0c;但是替换的value格式是 TextRenderData data.put("attachment",Texts.of("文件名").link("http://wenjianlj文件路径.com").create()); 就是在替换的data&#…