查看: 829|回复: 9

[编程交流] [Java] 连连看代码,直接编译运行即可

[复制链接]
发表于 2017-2-15 16:10 | 显示全部楼层 |阅读模式
冒烟的左轮 2017-2-15 16:10 829 9 显示全部楼层
可以自己修改,把汉字改成图片
  1. import java.awt.Color;
  2. import java.awt.Font;
  3. import java.awt.Graphics;
  4. import java.awt.Point;
  5. import java.awt.event.MouseAdapter;
  6. import java.awt.event.MouseEvent;
  7. import java.text.SimpleDateFormat;
  8. import java.util.ArrayList;
  9. import java.util.Date;
  10. import java.util.List;
  11. import java.util.Random;
  12. import java.util.Timer;
  13. import java.util.TimerTask;

  14. import javax.swing.JFrame;
  15. import javax.swing.JMenu;
  16. import javax.swing.JMenuBar;
  17. import javax.swing.JMenuItem;
  18. import javax.swing.JPanel;

  19. public class Lianliankan extends JFrame{
  20.     public static final int SQUARE_SIDE = 30; //每个格的大小
  21.     public static final int JFRAME_WIDTH = SQUARE_SIDE * 10; //窗休宽
  22.     public static final int JFRAME_HEIGHT = SQUARE_SIDE * 10; //窗体高
  23.     public static final String[] data = new String[]{
  24.         "田","畕","畾","土","圭","垚","十","卄","卅","卌",
  25.         "屮","艸","芔","茻","水","沝","淼","皕","兟","兢",
  26.         "競","夶","棗","棘","玨","竝","臸","玆","臦","林"};  //所有显示的数据 "字"
  27.     public static int[][] map = new int[][]{
  28.         // x 0 1 2 3 4 5 6 7 8 9    y
  29.             {0,0,0,0,0,0,0,0,0,0},//0
  30.             {0,1,1,1,1,1,1,1,1,0},//1
  31.             {0,1,1,1,1,1,1,1,1,0},//2
  32.             {0,1,1,1,1,1,1,1,1,0},//3
  33.             {0,1,1,1,1,1,1,1,1,0},//4
  34.             {0,1,1,1,1,1,1,1,1,0},//5
  35.             {0,1,1,1,1,1,1,1,1,0},//6
  36.             {0,1,1,1,1,1,1,1,1,0},//7
  37.             {0,1,1,1,1,1,1,1,1,0},//8
  38.             {0,0,0,0,0,0,0,0,0,0} //9
  39.          
  40.     }; //虚拟地图
  41.      
  42.      
  43.     public static String[][] fonts = new String[map.length-2][map[0].length-2]; //实际抽出来的 "字"
  44.     public static List<Point> coordlist = new ArrayList<Point>(4); //存放已经找到的点
  45.     public static List<Point> sticklist = new ArrayList<Point>(2); //存放两个比较点
  46.      
  47.     private GameArithmetic gameArithmetic = new GameArithmetic(); //查找点的算
  48.     private SquareMap square; //图形类
  49.     private Timer tirmer = new Timer(); //定时器
  50.     public static int totalTime = 60000*5; //游戏时间
  51.      
  52.     public Lianliankan(){
  53.         //启动定时器来监听时间
  54.         TimerTask task = new TimerTask(){
  55.              @Override
  56.               public void run() {
  57.                  totalTime -= 1000;
  58.                  square.repaint();
  59.               }
  60.         };
  61.         tirmer.scheduleAtFixedRate(task, 1000, 1000);
  62.          
  63.         //初始化代码
  64.         square = new SquareMap();
  65.         square.addMouseListener(new MouseListener());
  66.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  67.         setSize(JFRAME_WIDTH+5, JFRAME_HEIGHT + 60);
  68.         setTitle("Lianliankan");
  69.         setLocationRelativeTo(null);
  70.         setResizable(false);
  71.         JMenuBar menu = new JMenuBar();
  72.         JMenu game = new JMenu("游戏");   
  73.         JMenuItem newgame = game.add("新游戏");
  74.         JMenuItem pause = game.add("暂停");
  75.         JMenuItem goon = game.add("继续");
  76.         JMenuItem exit = game.add("退出");
  77.         JMenu help = new JMenu("帮助");
  78.         JMenuItem about = help.add("关于");
  79.         menu.add(game);
  80.         menu.add(help);
  81.         setJMenuBar(menu);
  82.          
  83.         add(square);
  84.         setVisible(true);
  85.         init();
  86.     }
  87.     //初始化数据
  88.     public void init(){
  89.         boolean[] fontFalgs = new boolean[data.length];
  90.         int length = ((map.length-2)*(map[0].length-2))/4;
  91.         Random rn = new Random();
  92.         for(int i = 0; i < length; i++){
  93.             int num = 0;
  94.             do{
  95.                 num = rn.nextInt(data.length);
  96.             }while(fontFalgs[num]);
  97.             String str = data[num];
  98.             fontFalgs[num] = true;
  99.             
  100.             int colIndex = 0,rowIndex = 0;
  101.             for (int j = 0; j < 4; j++) { //随机放到4个不同位置
  102.                 do{
  103.                     rowIndex = rn.nextInt(fonts.length);
  104.                     colIndex = rn.nextInt(fonts[0].length);
  105.                 }while(fonts[rowIndex][colIndex] != null);
  106.                 fonts[rowIndex][colIndex] = str;
  107.             }
  108.         }
  109.     }
  110.     //鼠标监听
  111.     class MouseListener extends MouseAdapter{
  112.         @Override
  113.         public void mouseClicked(MouseEvent e) {
  114.             if(e.getX() < SQUARE_SIDE || e.getX() > SQUARE_SIDE * 9 ||
  115.                     e.getY() < SQUARE_SIDE || e.getY()> SQUARE_SIDE * 9 ||
  116.                     map[(e.getY()/SQUARE_SIDE)][(e.getX()/SQUARE_SIDE)] == 0){
  117.                 return;
  118.             } // 出了实际地图界限和已经找到就反回
  119.             //System.out.println("x : " + (e.getX()/SQUARE_SIDE) + " y : " + (e.getY()/SQUARE_SIDE));
  120.             
  121.             if(sticklist.size() > 0){ //比较两个点
  122.                 Point p1 = new Point(sticklist.get(0));
  123.                 Point p2 = new Point((e.getX()/SQUARE_SIDE),(e.getY()/SQUARE_SIDE));
  124.                 map[p1.y][p1.x] = 2; //比较两个点时把这两个点设成其它标识
  125.                 map[p2.y][p2.x] = 2;
  126.                 //查询两点是否相通如果找到 设成该两点为0
  127.                 List<Point> ps = gameArithmetic.meet(p1.x < p2.x ? p1 : p2, p2.x > p1.x ? p2 : p1);
  128.                 if(ps == null){
  129.                     sticklist.clear();
  130.                     sticklist.add(new Point((e.getX()/SQUARE_SIDE),(e.getY()/SQUARE_SIDE)));
  131.                     map[p1.y][p1.x] = 1;
  132.                     map[p2.y][p2.x] = 1;
  133.                 }else{
  134.                     coordlist.addAll(ps);
  135.                     sticklist.add(p2);
  136.                     square.repaint();
  137.                     map[p1.y][p1.x] = 0;
  138.                     map[p2.y][p2.x] = 0;
  139.                 }
  140.             }else {
  141.                 sticklist.add(new Point((e.getX()/SQUARE_SIDE),(e.getY()/SQUARE_SIDE)));
  142.             }
  143.             square.repaint();
  144.         }
  145.     }
  146.      
  147.     public static void main(String[] args) {
  148.         new Lianliankan();
  149.     }
  150. }
  151. //图形类
  152. class SquareMap extends JPanel{
  153.     Date startTime = new Date();
  154.     SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
  155.      
  156.     @Override
  157.     protected void paintComponent(Graphics g) {
  158.         super.paintComponent(g);
  159.         Color c = g.getColor();
  160.         g.setColor(Color.GREEN);
  161.         draw(g);
  162.         g.setColor(c);
  163.     }
  164.      
  165.     //画显示在面板上的图形与时间
  166.     private void draw(Graphics g){
  167.         Font font = new Font("宋体",Font.PLAIN,25);
  168.         g.setFont(font);
  169.         for(int i = Lianliankan.SQUARE_SIDE ; i < Lianliankan.JFRAME_HEIGHT-Lianliankan.SQUARE_SIDE ; i+=Lianliankan.SQUARE_SIDE){
  170.             for (int j = Lianliankan.SQUARE_SIDE; j < Lianliankan.JFRAME_WIDTH - Lianliankan.SQUARE_SIDE; j+=Lianliankan.SQUARE_SIDE) {
  171.                 if(Lianliankan.map[i/30][j/30]!=0){
  172.                     g.draw3DRect(j, i, Lianliankan.SQUARE_SIDE, Lianliankan.SQUARE_SIDE, true);
  173.                     g.drawString(Lianliankan.fonts[(i/Lianliankan.SQUARE_SIDE)-1][(j/Lianliankan.SQUARE_SIDE)-1], j+2, i+25);
  174.                 }
  175.             }
  176.         }
  177.         if(Lianliankan.sticklist.size() > 0){
  178.             g.setColor(Color.RED);
  179.             for (int j2 = 0; j2 < Lianliankan.sticklist.size(); j2++) {
  180.                 Point p = Lianliankan.sticklist.get(j2);
  181.                 g.draw3DRect(p.x * (Lianliankan.SQUARE_SIDE),(p.y *Lianliankan.SQUARE_SIDE) , Lianliankan.SQUARE_SIDE, Lianliankan.SQUARE_SIDE, true);
  182.             }
  183.             if(Lianliankan.sticklist.size() >= 2){
  184.                 Lianliankan.sticklist.clear();
  185.             }
  186.         }
  187.         if(Lianliankan.coordlist.size() > 0){
  188.             g.setColor(Color.RED);
  189.             int num = Lianliankan.SQUARE_SIDE/2;
  190.             for (int j2 = 1; j2 < Lianliankan.coordlist.size(); j2++) {
  191.                 Point p1 = Lianliankan.coordlist.get(j2 - 1);
  192.                 Point p2 = Lianliankan.coordlist.get(j2);
  193.                 g.drawLine((p1.x * Lianliankan.SQUARE_SIDE + num) , (p1.y * Lianliankan.SQUARE_SIDE + num)
  194.                         , (p2.x * Lianliankan.SQUARE_SIDE + num) , (p2.y * Lianliankan.SQUARE_SIDE + num));
  195.             }
  196.             if(Lianliankan.coordlist.size() >= 2){
  197.                 Lianliankan.coordlist.clear();
  198.             }
  199.         }
  200.         g.setColor(Color.GRAY);
  201.         font = new Font("宋体",Font.PLAIN,15);
  202.         g.setFont(font);
  203.         startTime.setTime(Lianliankan.totalTime);
  204.         g.drawString(sdf.format(startTime), Lianliankan.JFRAME_WIDTH-Lianliankan.SQUARE_SIDE*2-5, 12);
  205.     }
  206.      
  207. }
  208. //算法类
  209. class GameArithmetic{
  210.      
  211.     public List<Point> meet(Point p1,Point p2){
  212.         if(p1.equals(p2) || !Lianliankan.fonts[p1.y-1][p1.x-1].equals(Lianliankan.fonts[p2.y-1][p2.x-1])) return null;
  213.         int index = 0;
  214.         boolean left = true,right = true,up = true,down = true;
  215.         //分 上下左右四个方向查找 每次+1 移动的找有障碍物返回
  216.         while(left || right || up || down){
  217.             
  218.             if(right && meetCols(p1,new Point(p1.x+index,p1.y))==0){
  219.                 if(meetCols(p2,new Point(p1.x+index,p2.y))==0 &&
  220.                         meetRows(new Point(p1.x+index,p1.y),new Point(p1.x+index,p2.y)) == 0){
  221.                     return surveyPointer(p1,p2,new Point(p1.x+index,p1.y),new Point(p1.x+index,p2.y));
  222.                 }
  223.             }else{
  224.                 right = false;
  225.             }
  226.             
  227.             if(left && meetCols(p1,new Point(p1.x-index,p1.y))==0){
  228.                 if(meetCols(p2,new Point(p1.x-index,p2.y))==0 &&
  229.                         meetRows(new Point(p1.x-index,p1.y),new Point(p1.x-index,p2.y)) == 0){
  230.                     return surveyPointer(p1,p2,new Point(p1.x-index,p1.y),new Point(p1.x-index,p2.y));
  231.                 }
  232.             }else{
  233.                 left = false;
  234.             }
  235.             
  236.             if(down && meetRows(p1,new Point(p1.x,p1.y+index))==0){
  237.                 if(meetRows(p2,new Point(p2.x,p1.y+index))==0 &&
  238.                         meetCols(new Point(p1.x,p1.y+index),new Point(p2.x,p1.y+index)) == 0){
  239.                     return surveyPointer(p1,p2,new Point(p1.x,p1.y+index),new Point(p2.x,p1.y+index));
  240.                 }
  241.             }else{
  242.                 down = false;
  243.             }
  244.          
  245.             if(up && meetRows(p1,new Point(p1.x,p1.y-index))==0){
  246.                 if(meetRows(p2,new Point(p2.x,p1.y-index))==0 &&
  247.                         meetCols(new Point(p1.x,p1.y-index),new Point(p2.x,p1.y-index)) == 0){
  248.                     return surveyPointer(p1,p2,new Point(p1.x,p1.y-index),new Point(p2.x,p1.y-index));
  249.                 }
  250.             }else{
  251.                 up = false;
  252.             }
  253.             
  254.             index ++;
  255.         }
  256.         return null;
  257.          
  258.     }
  259.      
  260.     private int meetCols(Point p1,Point p2){
  261.         int start = p1.x < p2.x ? p1.x : p2.x;
  262.         int end = p1.x < p2.x ? p2.x : p1.x;
  263.          
  264.         if(start < 0 || end >= Lianliankan.map[0].length) return 1;
  265.          
  266.         for (int i = start; i <= end ; i++) {
  267.             if(Lianliankan.map[p1.y][i]==1)
  268.                 return Lianliankan.map[p1.y][i];
  269.         }
  270.         return 0;
  271.     }
  272.      
  273.     private int meetRows(Point p1,Point p2){
  274.         int start = p1.y < p2.y ? p1.y : p2.y;
  275.         int end = p1.y < p2.y ? p2.y : p1.y;
  276.          
  277.         if(start < 0 || end >= Lianliankan.map.length) return 1;
  278.          
  279.         for (int i = start; i <= end ; i++) {
  280.             if(Lianliankan.map[i][p1.x]==1)
  281.                 return Lianliankan.map[i][p1.x];
  282.         }
  283.         return 0;
  284.     }
  285.      
  286.     private List<Point> surveyPointer(Point p1,Point p2,Point proxy1,Point proxy2){
  287.         List<Point> pList = new ArrayList<Point>();
  288.         pList.add(p1);
  289.         if(proxy1.equals(p1) && proxy2.equals(p2)){
  290.         }else if(proxy1.equals(p1)){
  291.             pList.add(proxy2);
  292.         }else if(proxy2.equals(p2)){
  293.             pList.add(proxy1);
  294.         }else{
  295.             pList.add(proxy1);
  296.             pList.add(proxy2);
  297.         }
  298.         pList.add(p2);
  299.         return pList;
  300.     }
  301. }
复制代码


NuRamamaTJon 该用户已被删除
发表于 2017-2-17 14:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

NuRamamaTJon 该用户已被删除
发表于 2017-2-17 14:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

NuRamamaTJon 该用户已被删除
发表于 2017-2-17 14:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

NuRamamaTJon 该用户已被删除
发表于 2017-2-17 14:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

NuRamamaTJon 该用户已被删除
发表于 2017-2-17 14:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

NuRamamaTJon 该用户已被删除
发表于 2017-2-17 14:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

NuRamamaTJon 该用户已被删除
发表于 2017-2-17 14:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

NuRamamaTJon 该用户已被删除
发表于 2017-2-17 14:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

NuRamamaTJon 该用户已被删除
发表于 2017-2-17 14:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表 发新帖

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