java实现对对碰小游戏

本文实例为大家分享了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();
  }

}

- 运行结果

这是运行后的游戏开始界面:

这是点击开始以后的界面,这样你就可以开始玩你的小游戏了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现连连看游戏

    本文实例为大家分享了java实现连连看游戏的具体代码,供大家参考,具体内容如下 代码会实现共享的,这个是截图 代码: package com.lr.bean; import java.util.Scanner; import java.util.Random; import com.lr.bean.Point; public class Link{ public static void main(String[] args){ Scanner sc=new Scanner(System.in);

  • java连连看游戏菜单设计

    本文实例为大家分享了java连连看游戏菜单的具体实现代码,供大家参考,具体内容如下 先写GUI. 首先初始化框架,菜单,按钮,需要把菜单和按钮都添加在框架中.注意添加的顺序,首先要设置菜单,再设置框架,再设置按钮,如果交换了设置菜单和框架的顺序,会导致菜单显示不出,被框架挡住.对菜单设置了三个选项,第一个选项有五个下拉按键,用循环添加,第二个和第三个选项的下拉按键直接添加. GUI代码如下: package gui; import java.awt.Font; import javax.swin

  • java仿QQ连连看游戏

    关于这个项目,真的是花了很多心思在上面,从开始构思,到最后完成,真的是花了整整一个月.大概是11月初开始学java swing的时候有的想法,然后开始构思整个思路,相关算法讨论以及调试. 最开始先对连连看基础算法进行测试,就用一般的二维数组,然后就用控制台输入两个点的坐标进行删除,这一步就调试了我整整一个星期,基础算法搞完了 终于开始设计界面了,反正也不知道那时候花了多长时间才把界面给设计好,反正还设计的特别丑(至今也如此). 功能如下: 运行程序后有背景音乐 菜单栏有:重新开始,提示,炸弹,排

  • java基于swing实现的连连看代码

    本文实例讲述了java基于swing实现连连看代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: package llkan; import javax.swing.*; import java.awt.*; import java.awt.event.*; /**  * 连连看游戏  * @author Administrator  *2014年10月17日  */ public class MainGame implements ActionListener {     

  • java实现对对碰小游戏

    本文实例为大家分享了java实现对对碰的具体代码,供大家参考,具体内容如下 - 游戏实现功能:分别点击两张相邻的图像按钮进行交换(重点相邻),交换后的两个图像按钮的相邻水平或者垂直方向上,与之相同的图像超过规定个数后(这里规定为3个)就将其全部消除(置为空白按钮),上面的图像按钮也分别随之向下移动,将空白补齐(这里我们可以理解为图像按钮和空白按钮进行交换). - 游戏设计思路: 1.创建图像按钮数组,设置其基本属性: 2.给每个图像按钮配置相应的ID,用来标记图像信息,对于ID相同的按钮,图像也

  • Java完美实现2048小游戏

    完美地模仿了2048游戏,是根据网友的一个2048改的. Block.java import javax.swing.*; import java.awt.*; public class Block extends JLabel { private int value; public Block() { value = 0;//初始化值为0 setFont(new Font("font", Font.PLAIN, 40));//设定字体 setBackground(Color.gray

  • Java实现打飞机小游戏(附完整源码)

    写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习.java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐.代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习. 效果如下 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy

  • java实现数字猜拳小游戏

    本文编写一个java数字猜拳的小游戏,具体实现很简单 package guenum; import java.util.ArrayList; import java.util.Scanner; public class Demo { // private static Object list; public static void main(String ad[]) { System.out.println("-------------------------------------小游戏---

  • Java实现的打地鼠小游戏完整示例【附源码下载】

    本文实例讲述了Java实现的打地鼠小游戏.分享给大家供大家参考,具体如下: 这里涉及到java线程和GUI的相关知识,一个简单的java小游戏打地鼠,有兴趣的朋友可以优化一下.先来看看运行效果: 具体代码: Mouse.java: import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt

  • Java实现24点小游戏

    本文实例为大家分享了Java实现24点小游戏的具体代码,供大家参考,具体内容如下 程序设计要求: 24点游戏是经典的纸牌益智游戏. 常见游戏规则: 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏. 基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题. 1.程序风格良好(使用自定义注释模板) 2.列出表

  • Java实现猜字小游戏

    猜字游戏是一款益智游戏,喜欢玩具有挑战性单词游戏的你就可以来体验一下了,给你一个字母板.尝试通过想象相邻字母的单词.您将获得一个分数,根据您使用的字母,你已经使用了多少个字母,并以这些字母相关联的任何修饰符都可以的. 具体代码如下所示: package test07; import java.util.Scanner; //猜字符游戏 public class Guessing { //主方法 public static void main(String[] args) { Scanner sc

  • 用GUI实现java版贪吃蛇小游戏

    本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFrame = new JFrame(); jFrame.setBounds(100,100,900,720); jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON

  • java实现打砖块小游戏

    本文实例为大家分享了java实现打砖块小游戏的具体代码,供大家参考,具体内容如下 源码共包含两个文件 文件1:play_zhuankuai.java import java.awt.*; import javax.swing.JPanel; @SuppressWarnings("serial") public class play_zhuankuai extends JPanel implements Runnable{ boolean exit=false; boolean end=

  • java实现贪吃蛇小游戏

    本文实例为大家分享了java实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 这是MVC模式的完整Java项目,编译运行SnakeApp.java即可开始游戏. 可扩展功能: 1.积分功能:可以创建得分规则的类(模型类的一部分), 在GameController的run()方法中计算得分 2.变速功能:比如加速功能,减速功能,可以在GameController的keyPressed()方法中针对特定的按键设置每一次移动之间的时间间隔,将Thread.sleep(Settings.DEFAUL

随机推荐