【课程设计】基于java的连连看小游戏,附源码+报告

1、项目介绍

窗口中只有一个“文件”菜单,其中包括了开始游戏、重来一次、炸弹以及退出。点击文件菜单中的开始游戏选项,系统开始计时(初始时间为600秒,即10分钟),图片的消除规则主要是通过不转弯或者转一次弯,或者转两次弯可以连接的两张相同的图片。当消除一对图片时,图片自动清除。该游戏还提供了一个作弊功能,通过“文件”菜单中的“炸弹”选项可以自动消除一对符合消除条件的图片,炸弹的初始值为3,也就是说只能使用三次系统提供的自动消除功能。如果时间用完了但是在游戏区域还有图片没有消除完,则游戏结束,系统会弹出一个对话框,提示玩家时间到了,点击确认按钮,会弹出一个对话框,询问玩家是否重玩一次,点击“是”,则重新开始游戏,点击“否”,则退出游戏,返回最原始的空白界面。

游戏图片在文件Resource文件夹中,游戏界面的初始化是从游戏的地图开始的,游戏地图的选取主要是通过随机产生的。根据游戏规则来开始游戏,符合规则的图片,将在地图中清除掉。游戏中碰到找不到符合规则的图片时,可以选择“文件”菜单中的炸弹按钮,它主要是通过系统自动查找到两张符合规则的图片,然后系统自动将这一对符合条件的图片清除掉。当所有图片清除成功的时候,系统会弹出一个对话框提示你“通关成功”,点击确认按钮可以返回到空白的界面。

2、演示视频

【课程设计】基于java的连连看小游戏,附源码+报告

3、项目截图

4、文档截图

5、代码示例

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

import cn.elva.Settings;
import cn.elva.model.ArrayPoint;
import cn.elva.model.Map;

public class MapUI extends JPanel implements ActionListener
{

	private static final long serialVersionUID = 1L;

	//private int bombCount = Settings.BOMBCOUNT;
	// 棋子数组,用按钮来表示
	private ChessButton[] chesses = null;

	// 数据模型
	private Map map = new Map();

	// 判断当前点击的棋子是否是第二次选中的
	private boolean two = false;

	// 第一次选中的棋子
	private ArrayPoint priviousPoint;

	// 第二次选中的棋子
	private ArrayPoint currPoint;

	/**
	 * 构造函数
	 */
	public MapUI()
	{
		super();
		initialize();
	}

	/**
	 * 初始化函数
	 * 
	 * @return void
	 */
	private void initialize()
	{
		initChesses();
		GridLayout gridLayout = new GridLayout(Settings.ROWS + 2,
				Settings.COLUMNS + 2);
		gridLayout.setHgap(2);
		gridLayout.setVgap(2);
		this.setLayout(gridLayout);
		this.setSize(300, 200);
		// 放置按钮,按行
		for (int row = 0; row < Settings.ROWS + 2; row++)
		{
			for (int col = 0; col < Settings.COLUMNS + 2; col++)
			{
				add(chesses[row * (Settings.COLUMNS + 2) + col]);
			}
		}
	}

	private void initChesses()
	{
		int[][] values = map.getMap();
		// 初始化棋子,和数据模型里保持一样
		this.chesses = new ChessButton[(Settings.ROWS + 2)
				* (Settings.COLUMNS + 2)];

		for (int row = 0; row < 10; row++)
		{
			for (int col = 0; col < 10; col++)
			{
				// 通过二维的数据模型坐标得到一维的棋子坐标
				int index = row * (Settings.COLUMNS + 2) + col;
				// 对棋子的数据模型,即ArrayPoint对象进行设置,指定此棋子具体的位置和值
				chesses[index] = new ChessButton(row, col, values[row][col]);
				chesses[index].addActionListener(this);
				// 将外围的一圈设为不可见,行,列为0 和为最大值的情况
				if (row == 0 || row == (Settings.ROWS + 2 - 1) || col == 0
						|| col == (Settings.COLUMNS + 2 - 1))
				{
					chesses[index].setVisible(false);
				}
			}
		}
	}

	//清除相同的两个按钮
	public void clearCheese(ArrayPoint priviousPoint, ArrayPoint currPoint)
	{
		// 处理匹配,看两点中是否联通
		
			// 获得数据模型中的数组
			int[][] values = map.getMap();
			// 将模型中对应的棋子设为0
			values[priviousPoint.getI()][priviousPoint.getJ()] = 0;
			values[currPoint.getI()][currPoint.getJ()] = 0;

			// 使两个已经消除的按钮不可见
			int index1 = priviousPoint.getI() * (Settings.COLUMNS + 2)
					+ priviousPoint.getJ();
			int index2 = currPoint.getI() * (Settings.COLUMNS + 2)
					+ currPoint.getJ();
			chesses[index1].setVisible(false);//为true则显示,fasle则不显示
			chesses[index2].setVisible(false);
			

			// 如果棋子总数已为0,则程序结束
			if (map.LEFTCOUNT == 0)
			{
				
				JOptionPane.showMessageDialog(this, "恭喜您通过!!");
			}
	}

	
	
	/**
	 * 事件监听器处理函数,也是处理棋子消除的地方
	 */
	
	public void actionPerformed(ActionEvent e)//判断两个"按钮"是否相同
	{
		// 获得当前的资源
		ChessButton button = (ChessButton) e.getSource();
		// 获得当前棋子的数据结构
		ArrayPoint p = button.getPoint();

		// 如果已有两个棋子选中, 则进行判断操作
		if (two)
		{
			currPoint = p;
			if( map.match(this.priviousPoint, this.currPoint))
			{
				clearCheese(this.priviousPoint, this.currPoint);
			}
			
			// 设置为没有两个按钮的选中的状态
			two = false;
		}
		else
		{
			// 将当前点击的棋子赋给变量priviousPoint
			this.priviousPoint = p;
			// 标志位设为TRUE,用于点击下个棋子的时候使用
			two = true;
		}

	}

	/**
	 * 炸弹的功能
	 * 
	 */
	public void bomb()
	{
		int[][] values = map.getMap();
		ArrayPoint p1 = null;
		ArrayPoint p2 = null;

		for (int row = 1; row < Settings.ROWS + 1; row++)
		{
			for (int col = 1; col < Settings.COLUMNS + 1; col++)
			{
				if (values[row][col] != 0)
				{
					p1 = new ArrayPoint(row, col, values[row][col]);
					
					for (int i = 1; i < Settings.ROWS + 1; i++)
					{
						for (int j = 1; j < Settings.COLUMNS + 1; j++)
						{
							if (values[i][j] != 0)
							{
								p2 = new ArrayPoint(i, j, values[i][j]);
							}
							else
							{
								continue;
							}

							//System.out.println(p1 + "|" + p2);

							if (map.match(p1, p2))
							{
								clearCheese(p1, p2);
								return;
							}
						}
					}
				}
			}
		}	
	}
}

java连连看代码 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import javax.swing.*; public class Game extends JFrame{ private int num[][]; //实现数组 private JButton gamebutton[][]; //游戏Button组 private Container cont; //内容面板 private JLabel timelabel; //时间标签 private JButton play; //开始游戏按钮 private JButton exit; //退出按钮 private JButton replay; //重新开始按钮 private JButton back; //返回主界面按钮 private JComboBox choice;//游戏等级 private JButton chongle; //游戏按钮重列 private JPanel gamepanel; //游戏按钮面板 private JPanel panel; //开始游戏面板 private int time=0; //时间记录 private Time T; //记时线程 private Thread t=new Thread(T); //记时线程 private int shu=1; //记录获取游戏按钮事件的个数 private int x=0,y=0,a=0,b=0;//按钮的坐标 private JButton button1=null,button2=null;//点击了的按钮 private boolean can;//能否消除 private int lvx,lvy; //游戏等级数组标列数 private int framex,framey; //框架大小 private int again=1;//记录重列次数 public Game(){ itincomponent(); } private void itincomponent(){ //设置面板属性 if(cont!=null) cont.removeAll(); this.setSize(500, 500); this.setLocationRelativeTo(null); //获取内容面板 cont=this.getContentPane(); //开始和退出按钮 panel=new JPanel(); play=new JButton("开始游戏"); choice=new JComboBox(); choice.addItem("低级"); choice.addItem("中级"); choice.addItem("高级"); choice.setSelectedItem("低级"); exit=new JButton("退出游戏"); panel.add(choice); panel.add(play); panel.add(exit); cont.add(panel,"South"); exit.addActionListener(new Exit());//结束事件监听 play.addActionListener(new Play());//开始事件监听 this.setResizable(false); this.setVisible(true); this.setDefaultCloseOperation(EXIT_ON_CLOSE); } ////获得新的面板 private void p(){ //设置面板属性 this.setSize(framex, framey); this.setLocationRelativeTo(null); //获取内容面板 cont=this.getContentPane(); //开始和退出按钮 panel=new JPanel(); exit=new JButton("退出游戏"); replay=new JButton("重新开始"); back=new JButton("返回主界面"); chongle=new JButton("重列"); panel.add(chongle); panel.add(replay); panel.add(exit); panel.add(back); cont.add(panel,"South"); exit.addActionListener(new Exit());//结束事件监听 replay.addActionListener(new Playbutton());//重新开始事件监听 back.addActionListener(new Back());//返回主界面事件监听 chongle.addActionListener(new Chongle());//重列事件监听 //时间面板 timelabel=new JLabel("游戏时间:"+time+"s",JLabel.CENTER); cont.add(timelabel,"North"); //生成游戏操作面板 gamepanel=new JPanel(); gamepanel.setLayout(new GridLayout(lvx,lvy,3,3)); //设置为表格布局 for (int i = 0; i < lvx; i++) { for (int j = 0; j <lvy; j++) { if(gamebutton[i][j].isVisible()){ gamebutton[i][j].setIcon(new ImageIcon(num[i][j]+".jpg")); } gamepanel.add(gamebutton[i][j]); gamebutton[i][j].addActionListener(new Gamebutton()); } } cont.add(gamepanel, "Center"); this.setResizable(false); this.setVisible(true); this.setDefaultCloseOperation(EXIT_ON_CLOSE); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java源码集合

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值