卡片消除游戏 java版(代码+讲解)

       最开始一出的时候就准备写了,被别的事情耽误了。花了两天时间,把某个游戏的基本的功能都写出来了,还是挺简单的。简单来说就是个卡片消除游戏,代码方面挺简单,比代码难的是地图的制作(卡片的放置)。完整代码在最下面,需要的自取。(300来行代码,非常简单)(本来想直接用原名字,居然还有版权问题,好离谱呀)


目录

游戏展示

代码讲解

完整代码


游戏展示


代码讲解

就选重要的讲一下吧

先创建一个card类,来存储我们卡片的x,y和卡片的种类。

public class Card {
    int x;
    int y;
    int kind;
    public Card(int x,int y){
        this.x = x;
        this.y = y;
    }
}

new两个vector,分别存储没有被点击过的card和点击过的card。

    Vector<Card> cards = new Vector<>();
    
    Vector<Card> cardsUse = new Vector<>();  //下面存储位置

然后向cards添加卡片。

        Card card;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                card = new Card(SIZE * i * 2 + SIZE + OFFSET_X, SIZE * j * 2 + SIZE / 2 + OFFSET_Y);
                cards.add(card);
                card = new Card(SIZE * i * 2 + SIZE + OFFSET_X, SIZE * j * 2 + SIZE + OFFSET_Y);
                cards.add(card);
            }
        }

这时的图片种类都是0,增加图片的种类。

        for (int i = 0; i < cards.size(); i++) {
            cards.get(i).kind = i / 6;
        }

然后随机打乱图片(这个随机方法后面可以作为道具使用)。

public void change() {
        for (int i = 0; i < cards.size(); i++) {
            Random random1 = new Random();
            int r = random1.nextInt(cards.size());
            int t = cards.get(i).kind;
            cards.get(i).kind = cards.get(r).kind;
            cards.get(r).kind = t;
        }
    }

将上面的代码放到setCards1()方法中,作为第一关的图片放置方法。

再写个setCards2()方法,作为第二关的放置方法(按自己的想法随便写就行)。

判断图片是否能被点击,点击后判断光标位置,看在哪张图片上,并看这张图片是否在最上面,只有最上面的才能被点击。具体方法是,判断这张图片是否与其后面的图片重叠,如果重叠,则说明不在最上面。

for (int i = 0; i < view11.cards.size(); i++) {

            //判断点击的哪张card
            if (x > view11.cards.get(i).x && x < view11.cards.get(i).x + view11.SIZE
                    && y > view11.cards.get(i).y && y < view11.cards.get(i).y + view11.SIZE) {

                //判断card是否在最上面
                boolean isC = true;
                for (int j = i + 1; j < view11.cards.size(); j++) {
                    if (Math.abs(view11.cards.get(i).x - view11.cards.get(j).x) < view11.SIZE
                            && Math.abs(view11.cards.get(i).y - view11.cards.get(j).y) < view11.SIZE) {
                        isC = false;
                        break;
                    }
                }

 如果图片在最上面,并且被点击过的图片总数少于7个,才能被点击。

如果点击的照片里面有三个一样的,就消除。

如果图片全点完,则进入下一关。

具体代码看完整代码


完整代码

Card类

package game03;

public class Card {
    int x;
    int y;
    int kind;
    public Card(int x,int y){
        this.x = x;
        this.y = y;
    }
}

View类

package game03;

import javax.swing.*;
import java.awt.*;
import java.util.Random;
import java.util.Vector;

public class View extends JFrame {

    Handle handle11 = new Handle(this);

    Vector<Card> cards = new Vector<>();

    Vector<Card> cardsUse = new Vector<>();  //下面存储位置

    final int OFFSET_X = 150;
    final int OFFSET_Y = 20;
    final int SIZE = 100;

    int level = 1;  //关卡

    public class MPanel11 extends JPanel {
        ImageIcon[] p = new ImageIcon[9];

        ImageIcon bj = new ImageIcon("src\\game03\\pic\\bj.jpg");

        public MPanel11() {

            addMouseListener(handle11);

            p[0] = new ImageIcon("src\\game03\\pic\\p1.png");
            p[1] = new ImageIcon("src\\game03\\pic\\p2.png");
            p[2] = new ImageIcon("src\\game03\\pic\\p3.png");
            p[3] = new ImageIcon("src\\game03\\pic\\p4.png");
            p[4] = new ImageIcon("src\\game03\\pic\\p5.png");
            p[5] = new ImageIcon("src\\game03\\pic\\p6.png");
            p[6] = new ImageIcon("src\\game03\\pic\\p7.png");
            p[7] = new ImageIcon("src\\game03\\pic\\p8.png");
            p[8] = new ImageIcon("src\\game03\\pic\\p9.png");

            setCards1();

        }

        @Override
        public void paint(Graphics g) {
            super.paint(g);

            bj.paintIcon(this,g,0,0);

//            for(int i=0;i<7;i++){
//                for(int j=0;j<6;j++){
//                    g.drawRect(i*SIZE+OFFSET_X,j*100+OFFSET_Y,SIZE,SIZE);
//                }
//            }

            for (Card card : cards) {
                p[card.kind].paintIcon(this, g, card.x, card.y);
            }

            for (int i = 0; i < cardsUse.size(); i++) {
                cardsUse.get(i).y = 650;
                cardsUse.get(i).x = OFFSET_X + SIZE * i;
                p[cardsUse.get(i).kind].paintIcon(this, g, cardsUse.get(i).x, cardsUse.get(i).y);
            }

            g.drawRect(OFFSET_X, 650, 700, 100);
        }
    }

    //随机数组函数
    public void change() {
        for (int i = 0; i < cards.size(); i++) {
            Random random1 = new Random();
            int r = random1.nextInt(cards.size());
            int t = cards.get(i).kind;
            cards.get(i).kind = cards.get(r).kind;
            cards.get(r).kind = t;
        }
    }

    public void setCards1() {
        level = 1;

        Card card;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                card = new Card(SIZE * i * 2 + SIZE + OFFSET_X, SIZE * j * 2 + SIZE / 2 + OFFSET_Y);
                cards.add(card);
                card = new Card(SIZE * i * 2 + SIZE + OFFSET_X, SIZE * j * 2 + SIZE + OFFSET_Y);
                cards.add(card);
            }
        }

        //赋图片
        for (int i = 0; i < cards.size(); i++) {
            cards.get(i).kind = i / 6;
        }
        change();
    }

    public void setCards2(){

        level = 2;

        //12
        for(int i=2;i<=4;i++){
            for(int j=1;j<=4;j++){
                addCard(i,j);
            }
        }
        //6
        for(int i=2;i<4;i++){
            for(int j=1;j<4;j++){
                addCard(i+0.5,j+0.5);
            }
        }
        //28
        for(int i=0;i<7;i++){
            for(int j=0;j<2;j++){
                addCard(i,j);
                addCard(i,j+0.5);
            }
        }
        //7
        for(int i=0;i<7;i++){
            addCard(i,0);
        }
        //6
        for(int i=0;i<6;i++){
            addCard(i+0.5,0.5);
        }
        //12
        for(int j=5;j>=3;j--){
            addCard(0,j);
            addCard(0,j-0.5);
            addCard(6,j);
            addCard(6,j-0.5);
        }
        //3
        for(int i=2;i<5;i++){
            addCard(i,5);
        }
        //6
        addCard(1,3.5);
        addCard(5,3.5);
        addCard(1.5,3);
        addCard(1.5,4);
        addCard(4.5,3);
        addCard(4.5,4);
        for(int i=1;i<=5;i++){
            addCard(i,2);
            addCard(i,3);
        }

        for (int i = 0; i < cards.size(); i++) {
            cards.get(i).kind = i/15;
        }

        change();
    }

    public void addCard(double x,double y){
        Card card = new Card((int)(OFFSET_X+x*100),(int)(OFFSET_Y+y*100));
        cards.add(card);
    }


    MPanel11 jp = new MPanel11();

    public View() {
        super("逗逗");

        add(jp);
        addKeyListener(handle11);

        setSize(1005, 800);
        setLocationRelativeTo(null);     //居中
        setResizable(false);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new View();
    }
}

Handle类

package game03;

import java.awt.event.*;

public class Handle extends KeyAdapter implements MouseListener {

    View view11;

    public Handle(View view11) {
        this.view11 = view11;
    }

    @Override
    public void keyPressed(KeyEvent e) {
        super.keyPressed(e);
        if(e.getKeyCode()==KeyEvent.VK_SPACE){
            view11.change();
            view11.repaint();
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) {

    }

    @Override
    public void mousePressed(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
//        System.out.println(x+" "+y);

        for (int i = 0; i < view11.cards.size(); i++) {

            //判断点击的哪张card
            if (x > view11.cards.get(i).x && x < view11.cards.get(i).x + view11.SIZE
                    && y > view11.cards.get(i).y && y < view11.cards.get(i).y + view11.SIZE) {

                //判断card是否在最上面
                boolean isC = true;
                for (int j = i + 1; j < view11.cards.size(); j++) {
                    if (Math.abs(view11.cards.get(i).x - view11.cards.get(j).x) < view11.SIZE
                            && Math.abs(view11.cards.get(i).y - view11.cards.get(j).y) < view11.SIZE) {
                        isC = false;
                        break;
                    }
                }

                //如果能点击
                if (isC) {

                    //判断下方是否有七张
                    if (view11.cardsUse.size() < 7) {

                        //增加card
                        boolean h = false;
                        for (int k = 0; k < view11.cardsUse.size(); k++) {
                            if (view11.cardsUse.get(k).kind == view11.cards.get(i).kind) {
                                view11.cardsUse.add(k, view11.cards.get(i));
                                h = true;
                                break;
                            }
                        }
                        if (!h) {
                            view11.cardsUse.add(view11.cards.get(i));
                        }
                        view11.cards.remove(view11.cards.get(i));

                        //消除三个
                        if (view11.cardsUse.size() >= 3) {
                            for (int k = 0; k < view11.cardsUse.size() - 2; k++) {
                                if (view11.cardsUse.get(k).kind == view11.cardsUse.get(k + 1).kind
                                        && view11.cardsUse.get(k + 1).kind == view11.cardsUse.get(k + 2).kind) {
                                    view11.cardsUse.remove(view11.cardsUse.get(k));
                                    view11.cardsUse.remove(view11.cardsUse.get(k));
                                    view11.cardsUse.remove(view11.cardsUse.get(k));
                                }
                            }
                        }
                    } else {
                        System.out.println("GAME OVER!!!");
                    }

                }
            }
        }

        if(view11.cards.size()==0){
            if(view11.level==2){
                System.out.println("WIN!!!");
            }else {
                view11.setCards2();
            }
        }
        view11.repaint();
    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值