java小游戏---对对碰

对对碰

- 游戏实现功能:分别点击两张相邻的图像按钮进行交换(重点相邻),交换后的两个图像按钮的相邻水平或者垂直方向上,与之相同的图像超过规定个数后(这里规定为3个)就将其全部消除(置为空白按钮),上面的图像按钮也分别随之向下移动,将空白补齐(这里我们可以理解为图像按钮和空白按钮进行交换)。
- 游戏设计思路:
1.创建图像按钮数组,设置其基本属性;
2.给每个图像按钮配置相应的ID,用来标记图像信息,对于ID相同的按钮,图像也相同;
3.设置遍历全局判断是否可以建立相连按钮的函数;
4.设置遍历全局将可以建立相连的按钮图像ID置为EMPTY,将按钮置为空白按钮;
5.设置移动函数,将空白按钮与上层非空白按钮相互交换的函数,将空白按钮移动到上层;
6.设置更新函数,将移动到上层的空白按钮再随机匹配图像,继续使用;
7.设置交换按钮函数;
8.记录游戏得分,给一个确定的目标成绩,达到即可赢得游戏;
9.设置一个进度条,记录游戏进行的时间;
10.设置一个时间记录器(定时器);
11.设计游戏界面基本信息(根据个人爱好设计即可);

- 游戏代码

---mybutton类,设置了每个按钮对象的基本信息
package supperzzle;

import javax.swing.Icon;
import javax.swing.JButton;

public class MyButton extends JButton{
    private final int Width = 30;//设置按钮的宽度
    private final int Height = 30;
    private int ID;//设置按钮的ID-----ID代表每一个按钮里面存放的数据

    private int buttonPosX = 0;
    private int buttonPosY = 0;

    public MyButton(int id, Icon icon)//构造函数
    {
        this.setIcon(icon);
        this.ID = id;
        this.setSize(Width, Height);//设置按钮的边框大小
        this.setFocusable(true);//去掉按钮的聚焦框
        this.setBorderPainted(false);//去掉边框
        this.setContentAreaFilled(false);//不显示外围矩形边框
    }

    public int GetID()
    {
        return ID;
    }
    public void SetID(int id)
    {
        this.ID = id;
    }
}
//-----这是游戏的重点了,基本游戏界面设计--GamePanel类---对游戏的界面进行了基本的设置(写的有点挫,,有什么好的建议请尽情提的不要拘谨,哈哈)
package supperzzle;

import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventListener;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class GamePanel extends JPanel implements ActionListener{
    private final int row = 10;
    private final int col = 10;
    private final int lineCount = 3;//设置几连可碰消除
    private int grade = 0;//记录得分
    private final int score = 10;//设置每次消去一个方块获得的分数

    public MyButton mybutton[] = new MyButton[row*col];//这里只是开辟了相应的空间

    private final int countImage = 7;
    private ImageIcon imageIcon[] = new ImageIcon[countImage];//设置图标数组
    private final int EMPTY = -1;

    private Random random = new Random();

    private int posx = 0;
    private int posy = 0;//保存第一次按钮按下去的坐标
    private boolean IsSecond = false;


    public GamePanel()//游戏面板的构造函数----实现图片加载,数组图标的加载,以及按钮的基本设置
    {
        this.setLayout(new GridLayout(row,col,0,0));//创建一个网络布局管理格式---row行col列
        for(int i = 0; i < countImage; i++)//图标数组初始化
        {
//          Image image = Toolkit.getDefaultToolkit().getImage("F:/Image/supperzzle/angrybird"+i+".png");
            Image image = Toolkit.getDefaultToolkit().getImage("F:/Image/LinkGame/pic"+i+".png");
            imageIcon[i] = new ImageIcon(image);//每一个数组元素都得到了相应的图标
        }
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < col; j++)
            {
                int index = random.nextInt(countImage);//随机生成一个数作为图标数组的下标
                mybutton[i*col+j] = new MyButton(index,imageIcon[index]);//给每个元素都进行了初始化
                mybutton[i*col+j].addActionListener(this);//按钮添加监听机制
                mybutton[i*col+j].setEnabled(false);//设置按钮为无效
                this.add(mybutton[i*col+j]);//将按钮加载在该面板中
            }
        }
    }

    public boolean YesOrNoThreeLink(int x, int y)//判断该坐标同一个方向上是否可以建立连续相同id的方块按钮
    {
        int linked = 1;
        //判断垂直方向上面是否有连续相同的
        for(int i = x-1; i >= 0; i--)
        {
            if(mybutton[i*col+y].GetID() == mybutton[x*col+y].GetID())
            {
                linked++;
            }
            else
            {
                break;
            }
        }
        for(int i = x+1; i < row; i++)//判断该坐标的下面
        {
            if(mybutton[i*col+y].GetID() == mybutton[x*col+y].GetID())
            {
                linked++;
            }
            else
            {
                break;
            }
        }
        if(linked >= lineCount)
        {
            return true;
        }
        //判断水平方向上面是否有里连续相同的方块
        linked = 1;
        for(int i = y-1; i >= 0; i--)//判断水平向左
        {
            if(mybutton[x*col+i].GetID() == mybutton[x*col+y].GetID())
            {
                linked++;
            }
            else
                break;
        }
        for(int i = y+1; i < col; i++)//判断水平向右
        {
            if(mybutton[x*col+i].GetID() == mybutton[x*col+y].GetID())
            {
                linked++;
            }
            else
                break;
        }
        if(linked >= lineCount)//说明满足条件建立了连线
        {
            return true;
        }
        return false;
    }

    public void RemoveLink(int x, int y)//移除相同ID的方块设置相同的方块ID为EMPTY,并计算得分
    {
        int linked1 = 0;
        int linked2 = 0;
        int tempxStart = x;
        int tempxEnd = x;//分别保存第一个和最后一个与该点ID相同的x坐标
        int tempyStart = y;
        int tempyEnd = y;//分别保存第一个和最后一个与该点ID相同的y坐标
        //先判断垂直方向上面的---上下行
        for(int i = x-1; i >= 0; i--)//判断该坐标的上面
        {
            if(mybutton[i*col+y].GetID() == mybutton[x*col+y].GetID())
            {
                linked1++;
                tempxStart = i;
            }
            else
            {
                break;
            }
        }
        for(int i = x+1; i < row; i++)//判断该坐标的下面
        {
            if(mybutton[i*col+y].GetID() == mybutton[x*col+y].GetID())
            {
                linked1++;
                tempxEnd = i;
            }
            else
            {
                break;
            }
        }
        if(linked1 + 1 >= lineCount)
        {
            for(int i = tempxStart; i <= tempxEnd; i++)
            {
                mybutton[i*col+y].SetID(EMPTY);
            }
//          grade += linked*score;
            grade += linked1*score;
        }
        //判断水平方向上面的---左右列
        for(int i = y-1; i >= 0; i--)//判断水平向左
        {
            if(mybutton[x*col+i].GetID() == mybutton[x*col+y].GetID())
            {
                linked2++;
                tempyStart = i;
            }
            else
                break;
        }
        for(int i = y+1; i < col; i++)//判断水平向右
        {
            if(mybutton[x*col+i].GetID() == mybutton[x*col+y].GetID())
            {
                linked2++;
                tempyEnd = i;
            }
            else
                break;
        }
        if(linked2+1 >= lineCount)//说明满足条件建立了连线
        {
            for(int i = tempyStart; i <= tempyEnd; i++)
            {
                mybutton[x*col+i].SetID(EMPTY);
            }
//          grade += score*linked;
            grade += score*linked2;
        }
        grade += score;
    }

    public int GetGrade()//获取得分
    {
        return grade;
    }

    public void SetGrade(int n)
    {
        this.grade = n;
    }

    public void SwapElement(int x, int y)//交换元素
    {
        if(x >= 0 && x < row && y >= 0 && y < col)
        {
            if(!IsSecond)//第一次点击按钮
            {
                posx = x;
                posy = y;
                IsSecond = true;
                System.out.println("第一次点击:posx->"+posx+"  posy->"+posy);
            }
            else//第二次点击按钮
            {
                //判断是否是相邻的两个方块
                System.out.println("第2次点击:x->"+x+"  y->"+y);
                if(1 == Math.abs(posx - x) && posy == y
                || 1 == Math.abs(posy - y) && posx == x)//判断是否是相邻的坐标
                {
                    //先交换
                    System.out.println("交换");
                    int temp = mybutton[posx*col+posy].GetID();
                    mybutton[posx*col+posy].SetID(mybutton[x*col+y].GetID()); 
                    mybutton[x*col+y].SetID(temp);
//                  showImageButton();
                    mybutton[x*col+y].setIcon(imageIcon[temp]);
                    mybutton[posx*col+posy].setIcon(imageIcon[mybutton[posx*col+posy].GetID()]);
                    //再判断
                    if(YesOrNoThreeLink(x,y) || YesOrNoThreeLink(posx,posy))
                    {
                        if(YesOrNoThreeLink(x,y))
                        {
                            RemoveLink(x,y);
                            GameFrame.texteara.setText(Integer.toString(GetGrade()));
                        }
                        if(YesOrNoThreeLink(posx,posy))
                        {
                            RemoveLink(posx,posy);
                            GameFrame.texteara.setText(Integer.toString(GetGrade()));
                        }
                        //开始掉方块,全盘处理所有下面的空白方块
                        DownButton();
                        //更新
                        UpDateButton();
                        showImageButton();
                        GameFrame.texteara.setText(Integer.toString(GetGrade()));
                        while(GlobalSearch(1))//扫描全盘
                        {
                            GlobalSearch(0);//消除
                            DownButton();
                            UpDateButton();
                            showImageButton();
                            GameFrame.texteara.setText(Integer.toString(GetGrade()));
                        }
                    }
                    else
                    {
                        //没有相同的方块就再换回来
                        temp = mybutton[posx*col+posy].GetID();
                        mybutton[posx*col+posy].SetID(mybutton[x*col+y].GetID()); 
                        mybutton[x*col+y].SetID(temp);
//                      showImageButton();
                        mybutton[x*col+y].setIcon(imageIcon[temp]);
                        mybutton[posx*col+posy].setIcon(imageIcon[mybutton[posx*col+posy].GetID()]);
                    }
                }
                IsSecond = false;
            }
        }
    }

    public void DownButton()//将底层的空白的方块全部上移,将上面的非空白方块下移补齐
    {
        for(int i = row-1; i > 0; i--)//行--从最后一行开始
        {
            for(int j = 0; j < col; j++)//列---从第一列开始
            {
                if(mybutton[i*col+j].GetID() == EMPTY)//交换每个按钮决定图像的ID号即可
                {
                    //交换同列上面非EMPTY的结点
                    for(int k = i-1; k >= 0; k--)
                    {
                        if(mybutton[k*col+j].GetID() != EMPTY)
                        {
                            int id = mybutton[i*col+j].GetID();
                            mybutton[i*col+j].SetID(mybutton[k*col+j].GetID());
                            mybutton[k*col+j].SetID(id);
                            break;
                        }
                    }
                }
            }
        }
    }

    public boolean GlobalSearch(int flag)//全盘扫描
    {
        if(flag == 1)//----------只是扫描所有的元素是否存在相邻的连续方块
        {
            for(int i = 0; i < row; i++)
            {
                for(int j = 0; j < col; j++)
                {
                    if(YesOrNoThreeLink(i,j))
                    {
                        return true;
                    }
                }
            }
        }
        else if(flag == 0)//-------扫描加消除该节点置为EMPTY
        {
            for(int i = 0; i < row; i++)
            {
                for(int j = 0; j < col; j++)
                {
                    RemoveLink(i,j);
                }
            }
            return true;
        }

        return false;
    }

    public void showImageButton()//将所有的按钮的图标重新绘制一次
    {
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < col; j++)
            {
                mybutton[i*col+j].setIcon(imageIcon[mybutton[i*col+j].GetID()]);
            }
        }
    }

    public void UpDateButton()//更新按钮里面的坐标id-----让EMPTY的按钮重新获得随机ID
    {
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < col; j++)
            {
                if(mybutton[i*col+j].GetID() == EMPTY)
                {
                    int index = random.nextInt(countImage);
                    mybutton[i*col+j].SetID(index);
                }
            }
        }
    }

    public int GetRow()
    {
        return row;
    }
    public int GetCol()
    {
        return col;
    }

    public void actionPerformed(ActionEvent e)//监听机制
    {
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < col; j++)
            {
                if(e.getSource() == mybutton[i*col+j])//交换元素对象
                {
                    SwapElement(i,j);
                    GameFrame.texteara.setText(Integer.toString(GetGrade()));
                    break;
                }
            }
        }
        if(grade > 8000 && GameFrame.timer.isRunning())
        {
            JOptionPane.showConfirmDialog(null, "恭喜您过关", "Win", JOptionPane.CLOSED_OPTION);
            for(int i = 0; i < row; i++)
            {
                for(int j = 0; j < col; j++)
                {
                    mybutton[i*col+j].setEnabled(false);
                    GameFrame.buttonstart.setEnabled(true);
                    GameFrame.timer.stop();
                }
            }
        }
    }

}
//游戏走到这里就是真正的游戏接口了,游戏开始的入口--GameFrame类,设计游戏窗口和创建游戏
package supperzzle;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.Timer;

public class GameFrame extends JFrame implements ActionListener{
    private JPanel paneone = new JPanel();
    public static JButton buttonstart = new JButton("游戏开始");
    private JButton buttonend = new JButton("游戏结束");
    private JLabel labelGrade = new JLabel("游戏得分");
    private JLabel labelTime = new JLabel("游戏时间");
    public static JTextField texteara = new JTextField(10);//设置文本编辑域
    GamePanel gamepanel = new GamePanel();
    private int gamerow = gamepanel.GetRow();
    private int gamecol = gamepanel.GetCol();
    private JProgressBar progressbar = new JProgressBar();//创建一个进度条
    public static Timer timer;//创建一个时间计时器


    public GameFrame()
    {
        Container con = this.getContentPane();
        con.setLayout(new BorderLayout());
        paneone.setLayout(new FlowLayout());
        paneone.add(buttonstart);//添加开始按钮
        paneone.add(labelGrade);//添加得分编辑框
        paneone.add(texteara);//添加文本域
        paneone.add(labelTime);//添加时间编辑框
        paneone.add(progressbar);//添加一个进度条
        paneone.add(buttonend);//添加结束按钮
        con.add(paneone,BorderLayout.NORTH);
        con.add(gamepanel,BorderLayout.CENTER);
        this.setBounds(300, 0, 600, 700);
        this.setTitle("对对碰游戏");
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口关闭

        buttonstart.addActionListener(this);
        buttonend.addActionListener(this);

    }

    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == buttonstart)//点击开始按钮
        {
            gamepanel.SetGrade(0);//重新设置得分
            buttonstart.setEnabled(false);
            progressbar.setMaximum(100);//设置进度条的最大最小范围
            progressbar.setMinimum(0);
            progressbar.setStringPainted(true);
            timer = new Timer(800,new TimeListener());
            timer.start();
            for(int i = 0; i < gamerow; i++)
            {
                for(int j = 0; j < gamecol; j++)
                {
                    gamepanel.mybutton[i*gamecol+j].setEnabled(true);
                }
            }
            initGame();
            texteara.setText(Integer.toString(gamepanel.GetGrade()));
        }
        if(e.getSource() == buttonend)
        {
            System.exit(1);
        }
    }

    public void initGame()
    {
        while(gamepanel.GlobalSearch(1))
        {
            gamepanel.GlobalSearch(0);
            gamepanel.DownButton();
            gamepanel.UpDateButton();
            gamepanel.showImageButton();
        }
    }

    class TimeListener implements ActionListener//创建了一个自定义的时间监听机制
    {
        int times = 0;
        public void actionPerformed(ActionEvent e)
        {
            progressbar.setValue(times++);
            if(times > 100)
            {
                timer.stop();
                for(int i = 0; i < gamerow; i++)
                {
                    for(int j = 0; j < gamecol; j++)
                    {
                        gamepanel.mybutton[i*gamecol+j].setEnabled(false);
                    }
                }
                buttonstart.setEnabled(true);
            }
        }
    }

    public static void main(String[] args) {
        GameFrame gameframe = new GameFrame();
    }

}

- 运行结果

这是运行后的游戏开始界面:
这里写图片描述

这是点击开始以后的界面,这样你就可以开始玩你的小游戏了!哈哈!
这里写图片描述

  • 8
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Java对对碰游戏可以使用Swing或JavaFX进行开发。以下是一个简单的示例代码: ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MatchGame extends JFrame implements ActionListener { private JButton[] buttons = new JButton[16]; private int[] buttonValues = new int[16]; private int counter = 0; private int firstButtonIndex = -1; private int secondButtonIndex = -1; private int pairsFound = 0; public MatchGame() { super("Match Game"); setSize(300, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new GridLayout(4, 4)); initButtons(); setVisible(true); } public void initButtons() { for (int i = 0; i < 16; i++) { buttons[i] = new JButton(); buttons[i].addActionListener(this); add(buttons[i]); } initButtonValues(); } public void initButtonValues() { int[] values = new int[8]; for (int i = 0; i < 8; i++) { values[i] = i + 1; } for (int i = 0; i < 16; i++) { if (buttonValues[i] == 0) { int index = (int) (Math.random() * 8); if (values[index] == 0) { i--; } else { buttonValues[i] = values[index]; values[index] = 0; } } } } public void actionPerformed(ActionEvent e) { counter++; JButton button = (JButton) e.getSource(); int index = getButtonIndex(button); button.setText(Integer.toString(buttonValues[index])); if (counter % 2 != 0) { firstButtonIndex = index; } else { secondButtonIndex = index; checkPair(); } } public int getButtonIndex(JButton button) { for (int i = 0; i < 16; i++) { if (buttons[i] == button) { return i; } } return -1; } public void checkPair() { if (buttonValues[firstButtonIndex] == buttonValues[secondButtonIndex]) { buttons[firstButtonIndex].setEnabled(false); buttons[secondButtonIndex].setEnabled(false); pairsFound++; if (pairsFound == 8) { JOptionPane.showMessageDialog(this, "Congratulations! You won!"); System.exit(0); } } else { buttons[firstButtonIndex].setText(""); buttons[secondButtonIndex].setText(""); } } public static void main(String[] args) { new MatchGame(); } } ``` 这个对对碰游戏使用一个16个按钮的4x4网格来显示牌。每个按钮都有一个数字,玩家需要翻转两个相同的数字的按钮,以找到所有的配对。如果找到了一个配对,这两个按钮将被禁用,否则它们将被翻转回去。游戏将在找到所有的配对时结束。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值