代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
Java 连连看游戏,简单,源码
作者:
rouyh
/ 发布于
2013/7/1
/
735
开放平台:eclipse3.7 Java JDK:1.7 测试环境:Windows7 其实的无解解法随便弄个了一个,没测试,目测应该有问题
package com.luoyh.games.again; import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; /** * * @author luoyh * @date 2013-06-28 * */ public class TestDrawLine { public static void main(String[] args) { new DrawSee(); } } class DrawSee extends JFrame { private static final long serialVersionUID = 2L; private static final int sx = 50; private static final int sy = 50; private static final int w = 40; private static final int rw = 400; private int px = 0, py = 0; private Container p; private Graphics jg; private int cc = 0; private int[][] map; private boolean isEnd = false; private int rectColor = 0xf5f5f5; public DrawSee() { p = getContentPane(); setBounds(100, 100, 500, 500); setVisible(true); p.setBackground(new Color(rectColor)); setLayout(null); setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 不怎么熟悉Java的UI编程,所以线程睡了1秒 //这样画出来的图像在Container上面 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } paintComponents(this.getGraphics()); jg = this.getGraphics(); this.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if(isEnd) { jg.setFont(new Font("微软雅黑", 0, 62)); jg.drawString("Game Over!", 100, 220); return; } cc ++; int x = e.getX(), y = e.getY(); //System.out.println("clicked:" + e.getX() + "," + e.getY()); int cx = (x - sx) / w, cy = (y - sy) / w; if(cc == 1) { px = cx; py = cy; } if(cx < 0 || cy < 0 || cx > 9 || cy > 9) { cc = 0; return; } System.out.println("[" + cx + "][" + cy + "]" + " = " + map[cy][cx]); //Graphics g = p.getGraphics(); // jg. // Graphics2D g2 = (Graphics2D) jg; // g2.setStroke(new BasicStroke(3.0f)); jg.setColor(Color.LIGHT_GRAY); //jg.drawRect(sx + (cx * w), sy + (cy * w), w, w); //jg.setColor(new Color(0xf5f5f5)); jg.fillRect(sx + (cx * w) + 1, sy + (cy * w) + 1, w - 2, w - 2); drawString(jg, cy, cx); if(cc > 1) { SeeAgain.removed(map, py, px, cy, cx ); // 移除效果,覆盖矩形 jg.setColor(new Color(rectColor)); jg.fillRect(sx + (cx * w) + 1, sy + (cy * w) + 1, w - 2, w - 2); jg.fillRect(sx + (px * w) + 1, sy + (py * w) + 1, w - 2, w - 2); jg.setColor(Color.RED); jg.drawRect(sx + (cx * w), sy + (cy * w), w, w); jg.drawRect(sx + (px * w), sy + (py * w), w, w); // 显示文字 drawString(jg, cy, cx); drawString(jg, py, px); cc = 0; } show(map); isEnd = end(map); if(isEnd) { jg.setFont(new Font("微软雅黑", 0, 62)); jg.drawString("Game Over!", 100, 220); } } }); } public static boolean end(int[][] map) { for(int[] ms : map) { for(int m : ms) { if(m != 0) { return false; } } } return true; } public static void show(int[][] map) { System.out.println("\n\n===================="); for(int[] m : map) { for(int a : m) { System.out.print(a + " "); } System.out.println(); } System.out.println("===================="); } public void paintComponents(Graphics g) { try { map = SeeAgain.createMap(); g.setColor(Color.RED); //int sx = 120, sy = 120; g.drawRect(sx, sy, rw, rw); //g.drawString("1", sx + (2 * 20) + 5, sy + (2 * 20) - 5); for(int i = 0; i < 10; i ++) { for(int j = 0; j < 10; j ++) { g.drawLine(sx + (i * w), sy, sx + (i * w), sy + rw); drawString(g, j, i); // g.setFont(new Font("微软雅黑", 0, 40)); // g.drawString(map[j][i] + "", sx + (i * w) + 5, sy + ((j + 1) * w) - 5); g.drawLine(sx, sy + (i * w), sx + rw, sy + (i * w)); } } } catch (Exception e) { e.printStackTrace(); } } private void drawString(Graphics g, int x, int y) { // 为0就不显示 if(map[x][y] != 0) { g.setColor(Color.RED); g.setFont(new Font("微软雅黑", 0, 40)); g.drawString(map[x][y] + "", sx + (y * w) + 5, sy + ((x + 1) * w) - 5); } } } SeeAgain.java package com.luoyh.games.again; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * <b>算法: </b> * 给定x,y和tx,ty2个对象的坐标, * 判断2个坐标值是否相同且在2个转角之内 * 找x,y的直线上的所有非0值放入集合S * 找x,y的直线上的所有0值放入临时集合T * 找集合T上的所有非0值放入今后S * 找集合T上的所有0值的非0直线值放如S * 判断tx,ty的值在S里则能移除 * * 没有处理无解情况 * 判断是否有无解遍历一次map. * * @author luoyh * @date 2013-6-28 * */ public class SeeAgain { // W * H must be a even private static final int W = 8; private static final int H = 8; // 最外面一圈是0,这样好巡检,显示为W*H private static final int AW = 10; private static final int AH = 10; public static void main(String[] args) throws Exception { //Collections.shuffle(list) //list.addAll(new int[]{}); createMap(); // Map<String, Object> map = new HashMap<String, Object>(); // map.put("k1", new Item(12,4,6)); // map.put("k2", new Item(12,4,6)); // map.put("k3", new Item(12,2,6)); // // System.out.println((map.get("k1").equals(map.get("k2"))) + ","+map.get("k1").equals(map.get("k3"))); } /** * 矩阵插入 * 这里默认约定src小于des, 并且插入的位置不会溢出 * 否则会出错 * @param src 要插入的矩阵 * @param des 包含矩阵 * @param x 起始x * @param y 起始y */ public static void rectInsert(int[][] src, int[][] des, int x, int y) { for(int i = 0; i < src.length; i ++) { for(int j = 0; j < src[0].length; j ++) { des[i + x][j + y] = src[i][j]; } } } /** * 创建地图 */ public static int[][] createMap() throws Exception { int[][] amap = new int[AW][AH]; int[][] map = new int[W][H]; List<Integer> list = new ArrayList<Integer>(); // 生成偶数对对象 for(int i = 0; i < W * H; i ++) { list.add(i % W + 1); System.out.print(list.get(i) + ((i + 1) % W == 0 ? "\n" : " ")); } //if(map.length > 0) return; // 洗牌 Collections.shuffle(list); System.out.println("=============="); int ww = 0; for(int i = 0; i < W * H; i ++) { System.out.print(list.get(i) + ((i + 1) % 8 == 0 ? "\n" : " ")); map[i / W][ww ++] = list.get(i); ww = ww == W ? 0 : ww; } // 插入矩阵 rectInsert(map, amap, 1, 1); System.out.println("**************"); // begin show for(int i = 0; i < W; i ++ ) { for(int j = 0; j < W; j ++) { System.out.print(map[i][j] + " "); } System.out.println(); } System.out.println("\n\n"); for(int[] m : amap) { for(int a : m) { System.out.print(a + " "); } System.out.println(); } //removed(amap, 1, 8, 0, 0); return amap; // end show // System.out.println("\n\n"); // for(int i = 0; i < W; i ++) { // for(int j = 0; j < W; j ++) { // removed(amap, i, j, 0, 0); // show(amap); // Thread.sleep(2000); // } // } // test remove } public static void show(int[][] map) { System.out.println("\n\n===================="); for(int[] m : map) { for(int a : m) { System.out.print(a + " "); } System.out.println(); } System.out.println("===================="); } /** * 寻找直线算法 * 算法优化,见里面注释 * @param s 要加入的集合,可以为null * @param map 地图 * @param x 源位置 * @param y * @param zero 是否寻找为0的 * @param die 是否是寻找无解 * @return 返回null则有解且能删除 */ private static List<Item> line(List<Item> s, int[][] map, int x, int y, int tx, int ty, boolean zero, boolean die) { int renVal = map[x][y], tagVal = map[tx][ty]; // 对比的对象 Item tagItem = new Item(tagVal, tx, ty); Item renItem = new Item(renVal, x, y); if(s == null) s = new ArrayList<Item>(); int tempx = x, tempy = y; // x,y寻址 while(-- tempx >= 0) { Item item = new Item(map[tempx][y], tempx, y); //System.out.println(item); if(zero) { if(item.val == 0) { s.add(item); } else { break; } } else { if(item.val != 0) { if(die) { if(!renItem.equals(item) && renVal == item.val) { return null; } } if(renVal == tagVal && item.equals(tagItem)) { // 这里其实就找到了,可以删除,然后返回 // 下面同理 return null; } s.add(item); break; } } } while(-- tempy >= 0) { Item item = new Item(map[x][tempy],x,tempy); if(zero) { if(item.val == 0) { s.add(item); } else { break; } } else { if(item.val != 0) { if(die) { if(!renItem.equals(item) && renVal == item.val) { return null; } } if(renVal == tagVal && item.equals(tagItem)) { // 这里其实就找到了,可以删除,然后返回 // 下面同理 return null; } s.add(item); break; } } } tempx = x; tempy = y; while( ++ tempx < AW ) { Item item = new Item(map[tempx][y], tempx, y); if(zero) { if(item.val == 0) { s.add(item); } else { break; } } else { if(item.val != 0) { if(die) { if(!renItem.equals(item) && renVal == item.val) { return null; } } if(renVal == tagVal && item.equals(tagItem)) { // 这里其实就找到了,可以删除,然后返回 // 下面同理 return null; } s.add(item); break; } } } while( ++ tempy < AH ) { Item item = new Item(map[x][tempy], x, tempy); if(zero) { if(item.val == 0) { s.add(item); } else { break; } } else { if(item.val != 0) { if(die) { if(!renItem.equals(item) && renVal == item.val) { return null; } } if(renVal == tagVal && item.equals(tagItem)) { // 这里其实就找到了,可以删除,然后返回 // 下面同理 return null; } s.add(item); break; } } } return s; } private static boolean find(int[][] map, int x, int y, int tx, int ty) { // x,y所所处位置的2个转角之内的所有对象集合 List<Item> s = new ArrayList<Item>(); // 临时集合,t是s的直线0值,t1是t的直线非0值 List<Item> t = new ArrayList<Item>(); List<Item> t1 = new ArrayList<Item>(); // 开始的对象 Item srcI = new Item(map[x][y], x, y); // 对比对象 Item renItem = new Item(map[tx][ty], tx, ty); // 如果开始对象和对比对象是同一个就返回 if(srcI.equals(renItem)) { return false; } if(map[x][y] == 0 || map[tx][ty] == 0) { return false; } if(map[x][y] != map[tx][ty]) { System.out.println("not equals."); return false; } // 得到x,y直线位置上的数据 if(line(s, map, x, y, tx, ty, false, false) == null) { return true; } // 得到t,t1 for(Item item : line(null, map, x, y, tx, ty, true, false)) { line(t, map, item.x, item.y, tx, ty, true, false); } for(Item item : t) { if(line(t1, map, item.x, item.y, tx, ty, false, false) == null) return true; } // add in s s.addAll(t1); for(Item item : s) { System.out.println(item); } /* for(int i = 0; i < W; i ++) { for(int j = 0; j < H; j ++) { } }*/ for(Item item : s) { if(item.val == renItem.val && item.equals(renItem)) { System.out.println("find"); //map[x][y] = map[tx][ty] = 0; return true; //break; } } return false; } /** * 此方法有误,没有做处理 * @param map * @return */ public static boolean isDie(int[][] map) { for(int i = 0; i < map.length; i ++) { for(int j = 0; j < map[0].length; j ++) { if(map[i][j] != 0) { if(line(null, map, i, j, 0, 0, false, true) == null) return true; } } } return false; } /** * 移除指定地图上2个对象图片 * @param map 地图 * @param x 起始位置,根据起始位置算出目标位置是否在2个转角之内 * @param y * @param tx 目标位置 * @param ty */ public static boolean removed(int[][] map, int x, int y, int tx, int ty) { if(find(map, x, y, tx, ty)) { System.out.println("removed"); map[x][y] = map[tx][ty] = 0; return true; } return false; } } class Item { int val, x, y; public Item(int val, int x, int y) { this.val = val; this.x = x; this.y = y; } @Override public boolean equals(Object obj) { Item item = (Item) obj; return val == item.val && x == item.x && y == item.y; } @Override public String toString() { return x + " , " + y + " = " + val; } }
试试其它关键字
连连看
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
rouyh
贡献的其它代码
(
1
)
.
Java 连连看游戏,简单,源码
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3