连连看设计思路与java代码

import java.util.HashSet;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;

public class Test6 {

	//随意写个2维数组做练练看测试,0代表空
	int[][] lianliankanTu() {

		int[][] tu = new int[4][4];
		tu[0] = new int[] { 0, 0, 0, 1 };
		tu[1] = new int[] { 3, 1, 0, 3 };
		tu[2] = new int[] { 4, 1, 0, 0 };
		tu[3] = new int[] { 1, 4, 0, 1 };

		return tu;
	}

	public static void main(String[] args) {
		Test6 t = new Test6();
		int[][] tu = t.lianliankanTu();
		LinkPoint point1 = t.new LinkPoint(1, 1);
		LinkPoint point2 = t.new LinkPoint(3, 3);
		boolean result = t.isLinked(tu, point1, point2);
		System.out.println("result is " + result);
	}

	//存放与测试点可连的所有空值,用于判断是否有折线可连另一测试点
	HashSet<LinkPoint> connected = new HashSet<LinkPoint>();

	/**
	 * @param tu 图
	 * @param point1 测试点1
	 * @param point2 测试点2
	 * @return 是否可连
	 */
	boolean isLinked(int[][] tu, LinkPoint point1, LinkPoint point2) {

		if (point1.obtainValue(tu) == point2.obtainValue(tu)) {
			//判断是否有直线可连
			if (obtainLinkedPoint(tu, point1, point2))
				return true;
			//判断是否有一折线可连
			if (getCrossLinked(tu, point2))
				return true;
			//判断是否有二折线可连
			if (getCrossLinked(tu, point2))
				return true;
		}
		return false;

	}

	boolean obtainLinkedPoint(int[][] tu, LinkPoint point1, LinkPoint point2) {

		//向下探索所有空值,直到碰到点
		for (int row = point1.x + 1; row < tu.length; row++) {
			LinkPoint lp = new LinkPoint(row, point1.y);
			//如果该点就是测试点
			if (lp.equals(point2))
				return true;
			//如果该点非空值,停止探索
			if (!lp.isNull(tu))
				break;
			//set集合添加空点
			connected.add(lp);

		}

		//向上探索
		for (int row = point1.x - 1; row >= 0; row--) {
			LinkPoint lp = new LinkPoint(row, point1.y);
			if (lp.equals(point2))
				return true;
			if (!lp.isNull(tu))
				break;
			connected.add(lp);
		}

		//向右探索
		for (int line = point1.y + 1; line < tu[0].length; line++) {
			LinkPoint lp = new LinkPoint(point1.x, line);
			if (lp.equals(point2))
				return true;
			if (!lp.isNull(tu))
				break;
			connected.add(lp);
		}
		
		//向左探索
		for (int line = point1.y - 1; line >= 0; line--) {
			LinkPoint lp = new LinkPoint(point1.x, line);
			if (lp.equals(point2))
				return true;
			if (!lp.isNull(tu))
				break;
			connected.add(lp);
		}

		return false;
	}

	//获取转折点,通过将set集合的空点寻找垂直方向以及水平方向
	//需要一份拷贝,否则报ConcurrentModifyException错误
	boolean getCrossLinked(int[][] tu, LinkPoint point2) {
		HashSet<LinkPoint> connectedClone = (HashSet<LinkPoint>) connected
				.clone();
		for (Iterator<LinkPoint> i = connectedClone.iterator(); i.hasNext();) {
			LinkPoint point = i.next();

			if (obtainLinkedPoint(tu, point, point2))
				return true;

		}
		return false;
	}

	//一个结构类
	class LinkPoint {
		int x;
		int y;

		public LinkPoint(int x, int y) {
			super();
			this.x = x;
			this.y = y;
		}

		int obtainValue(int[][] tu) {
			return tu[x][y];
		}

		boolean isNull(int[][] tu) {
			if (tu[x][y] == 0)
				return true;
			return false;
		}

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + x;
			result = prime * result + y;
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			LinkPoint other = (LinkPoint) obj;
			if (x != other.x)
				return false;
			if (y != other.y)
				return false;
			return true;
		}

		@Override
		public String toString() {
			return "Point(" + x + "," + y + ")";
		}

	}

}


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); }
idea连连看是一款非常经典的连连看游戏,玩家需要在规定时间内找出相同图标并消除,直到将所有图标消除完毕。下面是一种可能的Java设计代码: 首先,我们需要创建一个图标类,用于表示每个图标的类型和状态。可以定义一个Enum类来代表不同的图标类型,例如猫、狗、鸟等等。每个图标可以有一个属性来表示它是否已被消除。 接下来,我们需要创建一个游戏面板类,用于显示图标,并处理玩家的操作。可以使用一个二维数组来表示游戏面板,数组中的每个元素代表一个图标对象。通过循环遍历数组,可以将每个图标显示在相应的位置上。 然后,我们需要实现玩家的操作。当玩家点击两个相同的图标时,如果它们满足一些消除的条件(例如两个图标之间的路径不能有其他图标遮挡),则可以将它们从面板上消除。这可以通过比较两个图标对象的类型和状态来实现。 游戏可以设置一个计时器,限制玩家在规定时间内完成游戏。可以使用Java的Timer类来实现计时器功能。当时间用尽或玩家成功消除所有图标时,游戏结束。 最后,可以添加一些额外的功能来增加游戏的趣味性,例如增加关卡难度、计分系统、提示功能等等。 这只是一个简单的设计思路,实际实现时可能需要根据具体需求进行调整和优化。通过Java编写设计代码,可以实现图形界面、事件处理、计时器等功能,让玩家可以愉快地享受连连看游戏的乐趣。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值