吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5824|回复: 11
收起左侧

[Java 转载] 连连看代码,直接编译运行即可

  [复制链接]
smzen 发表于 2017-2-15 15:23
可以自己修改,把汉字改成图片
[Java] 纯文本查看 复制代码
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Lianliankan extends JFrame{
	public static final int SQUARE_SIDE = 30; //每个格的大小
	public static final int JFRAME_WIDTH = SQUARE_SIDE * 10; //窗休宽
	public static final int JFRAME_HEIGHT = SQUARE_SIDE * 10; //窗体高
	public static final String[] data = new String[]{
		"田","畕","畾","土","圭","垚","十","卄","卅","卌",
		"屮","艸","芔","茻","水","沝","淼","皕","兟","兢",
		"競","夶","棗","棘","玨","竝","臸","玆","臦","林"};  //所有显示的数据 "字"
	public static int[][] map = new int[][]{
		// x 0 1 2 3 4 5 6 7 8 9    y
			{0,0,0,0,0,0,0,0,0,0},//0
			{0,1,1,1,1,1,1,1,1,0},//1
			{0,1,1,1,1,1,1,1,1,0},//2
			{0,1,1,1,1,1,1,1,1,0},//3
			{0,1,1,1,1,1,1,1,1,0},//4
			{0,1,1,1,1,1,1,1,1,0},//5
			{0,1,1,1,1,1,1,1,1,0},//6
			{0,1,1,1,1,1,1,1,1,0},//7
			{0,1,1,1,1,1,1,1,1,0},//8
			{0,0,0,0,0,0,0,0,0,0} //9
		
    }; //虚拟地图
	
	
	public static String[][] fonts = new String[map.length-2][map[0].length-2]; //实际抽出来的 "字" 
	public static List<Point> coordlist = new ArrayList<Point>(4); //存放已经找到的点
	public static List<Point> sticklist = new ArrayList<Point>(2); //存放两个比较点
	
	private GameArithmetic gameArithmetic = new GameArithmetic(); //查找点的算
	private SquareMap square; //图形类
	private Timer tirmer = new Timer(); //定时器
	public static int totalTime = 60000*5; //游戏时间
	
	public Lianliankan(){
		//启动定时器来监听时间
		TimerTask task = new TimerTask(){
			 @Override
			  public void run() {
				 totalTime -= 1000;
				 square.repaint();
			  }
		};
		tirmer.scheduleAtFixedRate(task, 1000, 1000);
		
		//初始化代码
		square = new SquareMap();
		square.addMouseListener(new MouseListener());
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(JFRAME_WIDTH+5, JFRAME_HEIGHT + 60);
		setTitle("Lianliankan");
		setLocationRelativeTo(null);
		setResizable(false);
		JMenuBar menu = new JMenuBar();
		JMenu game = new JMenu("游戏");	
        JMenuItem newgame = game.add("新游戏");
        JMenuItem pause = game.add("暂停");
        JMenuItem goon = game.add("继续");
        JMenuItem exit = game.add("退出");
        JMenu help = new JMenu("帮助");
        JMenuItem about = help.add("关于");
        menu.add(game);
        menu.add(help);
        setJMenuBar(menu);
        
		add(square);
		setVisible(true);
		init();
	}
	//初始化数据
	public void init(){
		boolean[] fontFalgs = new boolean[data.length];
		int length = ((map.length-2)*(map[0].length-2))/4;
		Random rn = new Random();
		for(int i = 0; i < length; i++){
			int num = 0;
			do{
				num = rn.nextInt(data.length);
			}while(fontFalgs[num]);
			String str = data[num];
			fontFalgs[num] = true;
			
			int colIndex = 0,rowIndex = 0;
			for (int j = 0; j < 4; j++) { //随机放到4个不同位置
				do{
					rowIndex = rn.nextInt(fonts.length);
					colIndex = rn.nextInt(fonts[0].length);
				}while(fonts[rowIndex][colIndex] != null);
				fonts[rowIndex][colIndex] = str;
			}
		}
	}
	//鼠标监听
	class MouseListener extends MouseAdapter{
		@Override
		public void mouseClicked(MouseEvent e) {
			if(e.getX() < SQUARE_SIDE || e.getX() > SQUARE_SIDE * 9 ||
					e.getY() < SQUARE_SIDE || e.getY()> SQUARE_SIDE * 9 || 
					map[(e.getY()/SQUARE_SIDE)][(e.getX()/SQUARE_SIDE)] == 0){
				return;
			} // 出了实际地图界限和已经找到就反回
			//System.out.println("x : " + (e.getX()/SQUARE_SIDE) + " y : " + (e.getY()/SQUARE_SIDE));
			
			if(sticklist.size() > 0){ //比较两个点
				Point p1 = new Point(sticklist.get(0)); 
				Point p2 = new Point((e.getX()/SQUARE_SIDE),(e.getY()/SQUARE_SIDE));
				map[p1.y][p1.x] = 2; //比较两个点时把这两个点设成其它标识
				map[p2.y][p2.x] = 2;
				//查询两点是否相通如果找到 设成该两点为0
				List<Point> ps = gameArithmetic.meet(p1.x < p2.x ? p1 : p2, p2.x > p1.x ? p2 : p1);
				if(ps == null){
					sticklist.clear();
					sticklist.add(new Point((e.getX()/SQUARE_SIDE),(e.getY()/SQUARE_SIDE)));
					map[p1.y][p1.x] = 1;
					map[p2.y][p2.x] = 1;
				}else{
					coordlist.addAll(ps);
					sticklist.add(p2);
					square.repaint();
					map[p1.y][p1.x] = 0;
					map[p2.y][p2.x] = 0;
				}
			}else {
				sticklist.add(new Point((e.getX()/SQUARE_SIDE),(e.getY()/SQUARE_SIDE)));
			}
			square.repaint();
		}
	}
	
	public static void main(String[] args) {
		new Lianliankan();
	}
}
//图形类
class SquareMap extends JPanel{
	Date startTime = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Color c = g.getColor();
		g.setColor(Color.GREEN);
		draw(g);
		g.setColor(c);
	}
	
	//画显示在面板上的图形与时间
	private void draw(Graphics g){
		Font font = new Font("宋体",Font.PLAIN,25);
		g.setFont(font);
		for(int i = Lianliankan.SQUARE_SIDE ; i < Lianliankan.JFRAME_HEIGHT-Lianliankan.SQUARE_SIDE ; i+=Lianliankan.SQUARE_SIDE){
			for (int j = Lianliankan.SQUARE_SIDE; j < Lianliankan.JFRAME_WIDTH - Lianliankan.SQUARE_SIDE; j+=Lianliankan.SQUARE_SIDE) {
				if(Lianliankan.map[i/30][j/30]!=0){
					g.draw3DRect(j, i, Lianliankan.SQUARE_SIDE, Lianliankan.SQUARE_SIDE, true);
					g.drawString(Lianliankan.fonts[(i/Lianliankan.SQUARE_SIDE)-1][(j/Lianliankan.SQUARE_SIDE)-1], j+2, i+25);
				}
			}
		}
		if(Lianliankan.sticklist.size() > 0){
			g.setColor(Color.RED);
			for (int j2 = 0; j2 < Lianliankan.sticklist.size(); j2++) {
				Point p = Lianliankan.sticklist.get(j2); 
				g.draw3DRect(p.x * (Lianliankan.SQUARE_SIDE),(p.y *Lianliankan.SQUARE_SIDE) , Lianliankan.SQUARE_SIDE, Lianliankan.SQUARE_SIDE, true);
			}
			if(Lianliankan.sticklist.size() >= 2){ 
				Lianliankan.sticklist.clear();
			}
		}
		if(Lianliankan.coordlist.size() > 0){
			g.setColor(Color.RED);
			int num = Lianliankan.SQUARE_SIDE/2;
			for (int j2 = 1; j2 < Lianliankan.coordlist.size(); j2++) {
				Point p1 = Lianliankan.coordlist.get(j2 - 1); 
				Point p2 = Lianliankan.coordlist.get(j2);
				g.drawLine((p1.x * Lianliankan.SQUARE_SIDE + num) , (p1.y * Lianliankan.SQUARE_SIDE + num) 
						, (p2.x * Lianliankan.SQUARE_SIDE + num) , (p2.y * Lianliankan.SQUARE_SIDE + num));
			}
			if(Lianliankan.coordlist.size() >= 2){ 
				Lianliankan.coordlist.clear();
			}
		}
		g.setColor(Color.GRAY);
		font = new Font("宋体",Font.PLAIN,15);
		g.setFont(font);
		startTime.setTime(Lianliankan.totalTime);
		g.drawString(sdf.format(startTime), Lianliankan.JFRAME_WIDTH-Lianliankan.SQUARE_SIDE*2-5, 12);
	}
	
}
//算法类
class GameArithmetic{
	
	public List<Point> meet(Point p1,Point p2){
		if(p1.equals(p2) || !Lianliankan.fonts[p1.y-1][p1.x-1].equals(Lianliankan.fonts[p2.y-1][p2.x-1])) return null;
		int index = 0;
		boolean left = true,right = true,up = true,down = true;
		//分 上下左右四个方向查找 每次+1 移动的找有障碍物返回
		while(left || right || up || down){
			
			if(right && meetCols(p1,new Point(p1.x+index,p1.y))==0){
				if(meetCols(p2,new Point(p1.x+index,p2.y))==0 && 
						meetRows(new Point(p1.x+index,p1.y),new Point(p1.x+index,p2.y)) == 0){
					return surveyPointer(p1,p2,new Point(p1.x+index,p1.y),new Point(p1.x+index,p2.y));
				}
			}else{
				right = false;
			}
			
			if(left && meetCols(p1,new Point(p1.x-index,p1.y))==0){
				if(meetCols(p2,new Point(p1.x-index,p2.y))==0 && 
						meetRows(new Point(p1.x-index,p1.y),new Point(p1.x-index,p2.y)) == 0){
					return surveyPointer(p1,p2,new Point(p1.x-index,p1.y),new Point(p1.x-index,p2.y));
				}
			}else{
				left = false;
			}
			
			if(down && meetRows(p1,new Point(p1.x,p1.y+index))==0){
				if(meetRows(p2,new Point(p2.x,p1.y+index))==0 && 
						meetCols(new Point(p1.x,p1.y+index),new Point(p2.x,p1.y+index)) == 0){
					return surveyPointer(p1,p2,new Point(p1.x,p1.y+index),new Point(p2.x,p1.y+index));
				}
			}else{
				down = false;
			}
		
			if(up && meetRows(p1,new Point(p1.x,p1.y-index))==0){
				if(meetRows(p2,new Point(p2.x,p1.y-index))==0 && 
						meetCols(new Point(p1.x,p1.y-index),new Point(p2.x,p1.y-index)) == 0){
					return surveyPointer(p1,p2,new Point(p1.x,p1.y-index),new Point(p2.x,p1.y-index));
				}
			}else{
				up = false;
			}
			
			index ++;
		}
		return null;
		
	}
	
	private int meetCols(Point p1,Point p2){
		int start = p1.x < p2.x ? p1.x : p2.x;
		int end = p1.x < p2.x ? p2.x : p1.x;
		
		if(start < 0 || end >= Lianliankan.map[0].length) return 1;
		
		for (int i = start; i <= end ; i++) {
			if(Lianliankan.map[p1.y][i]==1)
				return Lianliankan.map[p1.y][i];
		}
		return 0;
	}
	
	private int meetRows(Point p1,Point p2){
		int start = p1.y < p2.y ? p1.y : p2.y;
		int end = p1.y < p2.y ? p2.y : p1.y;
		
		if(start < 0 || end >= Lianliankan.map.length) return 1;
		
		for (int i = start; i <= end ; i++) {
			if(Lianliankan.map[i][p1.x]==1)
				return Lianliankan.map[i][p1.x];
		}
		return 0;
	}
	
	private List<Point> surveyPointer(Point p1,Point p2,Point proxy1,Point proxy2){
		List<Point> pList = new ArrayList<Point>();
		pList.add(p1);
		if(proxy1.equals(p1) && proxy2.equals(p2)){
		}else if(proxy1.equals(p1)){
			pList.add(proxy2);
		}else if(proxy2.equals(p2)){
			pList.add(proxy1);
		}else{
			pList.add(proxy1);
			pList.add(proxy2);
		}
		pList.add(p2);
		return pList;
	}
}

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
uuu_man + 1 + 1 牛逼
610100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Takitooru 发表于 2017-2-15 15:38
java的还真没有试过,套入html5就可以用手机设备玩了。谢谢分享
馍上开花 发表于 2017-2-15 15:41
就是这么帅 发表于 2017-2-15 16:15
永不放弃的鱼 发表于 2017-2-15 16:21
吾爱有你更精彩
永不放弃的鱼 发表于 2017-2-15 16:21
吾爱有你更精彩
gunxsword 发表于 2017-2-15 16:23
支持原创代码!
KING9115 发表于 2017-2-15 16:28
感谢楼主
头像被屏蔽
沐雨红尘 发表于 2017-2-15 16:36
提示: 作者被禁止或删除 内容自动屏蔽
夏末恋情 发表于 2017-2-15 17:11
绿色背景看着眼睛都瞎了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 05:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表