实现消除

1、Chess.java

package Linkup;

/**
* 棋子封装类
*
* @author laixl
*
*/ public class Chess { // 图片的 状态 //1.....20
// 0表示消掉 private int status; public Chess(int status) {
this.status = status;
} public int getStatus() {
return status;
} public void setStatus(int status) {
this.status = status;
} }

2、Param.java

package tools;

import java.awt.Image;

import javax.swing.ImageIcon;

public class Param {

	//游戏总行数与总列数
public static int rows=8;
public static int cols=10; //棋子图标 宽与高
public static int chessWidth =55;
public static int chessHeight=55; //棋盘到边界的距离
public static int marginWidth = 200-chessWidth;
public static int marginHeight = 100-chessHeight; //游戏的背景图片
public static Image imageBackground = new ImageIcon("Images/build/back.jpg").getImage(); public static Image[] chessImage = new Image[20];
static {
for (int i = 0; i < chessImage.length; i++) {
chessImage[i] = new ImageIcon("Images/build/" + (i + 1) + ".png").getImage();
}
} }

3、MapPanel.java

package Linkup;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Stroke;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;
import java.util.Random; import javax.swing.JPanel; import tools.Core;
import tools.Param; /**
* 棋盘面板
*
* @author laixl
*
*/ public class MapPanel extends JPanel implements MouseListener {
Chess[][] arr = new Chess[Param.rows + 2][Param.cols + 2];
// 粗线条
Stroke stroke = new BasicStroke(3.0f); // 定义两个点 存放点击的两个点的坐标
Point firstPoint;
Point secondPoint; public MapPanel() {
initArr(); this.addMouseListener(this);
} public void initArr() { Random random = new Random();
for (int i = 1; i <= 20; i++) {
int count = 0;
while (count < 4) {
int x = random.nextInt(8) + 1;
int y = random.nextInt(10) + 1;
if (arr[x][y] == null) {
arr[x][y] = new Chess(i);
count++;
}
}
} // 外围一圈 手动初始化
// 最上面一行与最下面一行
for (int i = 0; i < arr[0].length; i++) {
arr[0][i] = new Chess(0);
arr[arr.length - 1][i] = new Chess(0);
} // 最左边一行与最右边一行
for (int i = 0; i < arr.length; i++) {
arr[i][0] = new Chess(0); arr[i][arr[0].length - 1] = new Chess(0);
} } @Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(Param.imageBackground, 0, 0, this);// 设置背景图片 for (int i = 1; i < arr.length; i++) {
for (int j = 1; j < arr[i].length; j++) {
if (arr[i][j].getStatus() != 0) {
int x = j * Param.chessWidth + Param.marginWidth;
int y = i * Param.chessHeight + Param.marginHeight;
g.drawImage(Param.chessImage[arr[i][j].getStatus() - 1], x,
y, this);
g.setColor(Color.green);
g.drawRect(x, y, Param.chessWidth, Param.chessHeight);
}
}
}
// 判断第一个点firstPoint不为null
if (firstPoint != null) {
Graphics2D g2d = (Graphics2D) g;
g2d.setStroke(stroke);
g2d.setColor(Color.blue);
int rowX = firstPoint.y * Param.chessWidth + Param.marginWidth; int rowY = firstPoint.x * Param.chessHeight + Param.marginHeight; g2d.drawRect(rowX + 2, rowY + 2, Param.chessWidth - 4,
Param.chessHeight - 4);
} } @Override
public void mouseClicked(MouseEvent e) {
} @Override
public void mousePressed(MouseEvent e) {
if (e.getModifiers() != InputEvent.BUTTON1_MASK) {
return;
} int x = e.getX();
int y = e.getY(); int X = (x - Param.marginWidth) / Param.chessWidth;
int rowX = X * Param.chessWidth + Param.marginWidth;
int Y = (y - Param.marginHeight) / Param.chessHeight;
int rowY = Y * Param.chessHeight + Param.marginHeight; Graphics g = getGraphics();
Graphics2D g2d = (Graphics2D) g;
g2d.setStroke(stroke);
g2d.setColor(Color.blue);
if ((x >= Param.marginWidth + Param.chessWidth && x <= Param.marginWidth
+ Param.cols * Param.chessWidth + Param.chessWidth)
&& (y >= Param.marginHeight + Param.chessHeight && y <= Param.marginHeight
+ Param.rows * Param.chessHeight + Param.chessHeight)) { // 第一次点击了firstPoint==null||重复点击了第一个点
if (firstPoint == null || (firstPoint.x == Y && firstPoint.y == X)) {
firstPoint = new Point(Y, X);
g2d.setColor(Color.blue);
g2d.drawRect(rowX + 2, rowY + 2, Param.chessWidth - 4,
Param.chessHeight - 4);
return;
}
// 第二点
secondPoint = new Point(Y, X);
g2d.setColor(Color.red);
g2d.drawRect(rowX + 2, rowY + 2, Param.chessWidth - 4,
Param.chessHeight - 4);
// 判断两个点的图标是否一致
if (arr[firstPoint.x][firstPoint.y].getStatus() != arr[secondPoint.x][secondPoint.y]
.getStatus()) {
firstPoint = secondPoint; repaint();
return;
} // 图标的状态值相同 连通算法
List<Point> list = Core.checkLinked(arr, firstPoint, secondPoint);
if (list == null) {
firstPoint = secondPoint; repaint();
return;
} // 可以连通:设置图标的状态值为0,把两点放null,绘制连接线,重新绘制界面
arr[firstPoint.x][firstPoint.y].setStatus(0);
arr[secondPoint.x][secondPoint.y].setStatus(0);
firstPoint = null;
secondPoint = null; // 绘制连接线 drawLinkedLine(list, g2d); repaint();
} } @Override
public void mouseReleased(MouseEvent e) {
} @Override
public void mouseEntered(MouseEvent e) {
} @Override
public void mouseExited(MouseEvent e) {
} private void drawLinkedLine(List<Point> list, Graphics2D g2d) {
// TODO Auto-generated method stub
if (list.size() == 2) {
Point a = list.get(0);
Point b = list.get(1);
int ax = a.y * Param.chessWidth + Param.marginWidth
+ Param.chessWidth / 2;
int ay = a.x * Param.chessHeight + Param.marginHeight
+ Param.chessHeight / 2;
int bx = b.y * Param.chessWidth + Param.marginWidth
+ Param.chessWidth / 2;
int by = b.x * Param.chessHeight + Param.marginHeight
+ Param.chessHeight / 2;
g2d.drawLine(ax, ay, bx, by); } if (list.size() == 3) {
Point a = list.get(0);
Point c = list.get(1);
Point b = list.get(2); int ax = a.y * Param.chessWidth + Param.marginWidth
+ Param.chessWidth / 2;
int ay = a.x * Param.chessHeight + Param.marginHeight
+ Param.chessHeight / 2; int cx = c.y * Param.chessWidth + Param.marginWidth
+ Param.chessWidth / 2;
int cy = c.x * Param.chessHeight + Param.marginHeight
+ Param.chessHeight / 2;
int bx = b.y * Param.chessWidth + Param.marginWidth
+ Param.chessWidth / 2;
int by = b.x * Param.chessHeight + Param.marginHeight
+ Param.chessHeight / 2;
g2d.drawLine(ax, ay, cx, cy);
g2d.drawLine(cx, cy, bx, by);
} if (list.size() == 4) {
Point a = list.get(0);
Point c = list.get(1);
Point d = list.get(2);
Point b = list.get(3);
int ax = a.y * Param.chessWidth + Param.marginWidth
+ Param.chessWidth / 2;
int ay = a.x * Param.chessHeight + Param.marginHeight
+ Param.chessHeight / 2; int cx = c.y * Param.chessWidth + Param.marginWidth
+ Param.chessWidth / 2;
int cy = c.x * Param.chessHeight + Param.marginHeight
+ Param.chessHeight / 2;
int dx = d.y * Param.chessWidth + Param.marginWidth
+ Param.chessWidth / 2;
int dy = d.x * Param.chessHeight + Param.marginHeight
+ Param.chessHeight / 2;
int bx = b.y * Param.chessWidth + Param.marginWidth
+ Param.chessWidth / 2;
int by = b.x * Param.chessHeight + Param.marginHeight
+ Param.chessHeight / 2;
g2d.drawLine(ax, ay, cx, cy);
g2d.drawLine(cx, cy, dx, dy);
g2d.drawLine(dx, dy, bx, by);
} try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

4、Core.java

package tools;

import java.util.List;
import java.awt.Point;
import java.util.ArrayList; import Linkup.Chess;
/**
* 连连看核心算法类 实现连通
* @author laixl
*
*/
public class Core {
//定义 静态集合
private static List<Point> list = new ArrayList<Point>(); /**
* 连通的总判断方法
* @param arr
* @param a
* @param b
* @return 连通点的集合;null表示无法连通
*/
public static List<Point> checkLinked(Chess[][] arr, Point a, Point b) {
list.clear();
if (noCorner(arr, a, b) != null) {
return list;
}
if (oneCorner(arr, a, b) != null) {
return list;
} if (twoCorner(arr, a, b) != null) {
return list;
}
return null;
} /**
* 直线连通算法
* @param arr
* @param a
* @param b
* @return 连通点的集合,null代表不能连通
*/
public static List<Point> noCorner(Chess[][] arr, Point a, Point b) {
if (canArrived(arr, a, b)) {
list.add(a);
list.add(b);
return list;
}
return null;
} /**
* 一拐角连通算法
*
* @param arr
* @param a
* @param b
* @return 连通点的集合,null代表不能连通
*/
public static List<Point> oneCorner(Chess[][] arr, Point a, Point b) {
Point c = new Point(a.x, b.y); if (arr[c.x][c.y].getStatus() == 0 && canArrived(arr, a, c)
&& canArrived(arr, c, b)) {
list.add(a);
list.add(c);
list.add(b);
return list;
} Point d = new Point(b.x, a.y);
if (arr[d.x][d.y].getStatus() == 0 && canArrived(arr, a, d)
&& canArrived(arr, d, b)) {
list.add(a);
list.add(d);
list.add(b);
return list;
}
return null;
} /**
* 二拐角连通算法
*
* @param arr
* @param a
* @param b
* @return 连通点的集合,null代表不能连通
*/
public static List<Point> twoCorner(Chess[][] arr, Point a, Point b) {
for (int i = 0; i < arr[0].length; i++) {
Point c = new Point(a.x, i); if (arr[c.x][c.y].getStatus() == 0 && canArrived(arr, a, c)
&& oneCorner(arr, c, b) != null) {
list.add(0, a);
return list;
}
}
for (int i = 0; i < arr.length; i++) {
Point c = new Point(i, a.y);
if (arr[c.x][c.y].getStatus() == 0 && canArrived(arr, a, c)
&& oneCorner(arr, c, b) != null) { list.add(0, a);
return list;
}
}
return null;
} /**
* 判断直线是否可以连通
*
* @param arr
* @param a
* @param b
* @return true表示可以连通,false表示不可以连通
*/
public static boolean canArrived(Chess[][] arr, Point a, Point b) {
// 横向 a.x == b.x
if (a.x == b.x) { for (int i = Math.min(a.y, b.y) + 1; i < Math.max(a.y, b.y); i++) {
if (arr[a.x][i].getStatus() != 0) {
return false;
}
}
// 可以连通
return true;
} // 纵向: a.y == b.y
if (a.y == b.y) {
for (int i = Math.min(a.x, b.x) + 1; i < Math.max(a.x, b.x); i++) {
if (arr[i][a.y].getStatus() != 0) {
return false;
}
}
// 可以连通
return true;
} return false;
} public static void main(String[] args) {
} }

5、LinkUpMainFrame.java

package Linkup;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.util.Random; import javax.swing.ImageIcon;
import javax.swing.JFrame; public class LinkUpMainFrame extends JFrame {
MapPanel mapPanel = new MapPanel(); public LinkUpMainFrame() {
this.add(mapPanel);
this.setTitle("连连看");// 设置 标题 this.setSize(1000, 650);// 设置宽高 this.setLocationRelativeTo(null);// 自动适配到屏幕中间 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置关闭模式
this.setResizable(false); this.setVisible(true);// 设置可见 ImageIcon imageIcon = new ImageIcon("Images/Photos/serverstop.gif");
Image image = imageIcon.getImage();
this.setIconImage(image);// 设置连连看窗体图标
} public static void main(String[] args) { new LinkUpMainFrame(); }
}

运行效果:

接下来就要开始做进度条,时间限制,如何实现洗牌啦!期待~~

java—连连看-实现消除的更多相关文章

  1. 【代码笔记】Java连连看项目的实现(2)——JTable 、TableModel的使用

    博客有时间就写写,所以一篇可能会拆成很多篇,写完后计划再合在一起. 首先肯定是要实现连连看的界面. 先准备连连看要的图片.. “LianLianKan”就是项目名称. 当然,如果小白看我的博客想学到什 ...

  2. 【代码笔记】Java连连看项目的实现(1)——JTable 、TableModel的使用

    javax.swing.table.TableModel和javax.swing.JTable JTable .TableModel是Java里面画表格的包. TableModel:为Table提供显 ...

  3. 台哥原创:java 连连看源码

    2010年,迷上了玩连连看 随手就做了这个,正好手头有这些图片素材 ​ 游戏启动时,界面先铺上了一层透明幕布,然后这些兵器图片交替从上到下,从左到右出现.. ​ 鼠标停在兵器格子上时,所在格子会有红色 ...

  4. java连连看小项目

    /* *本人也是刚入门,希望各位多多指教 *该项目主要代码在于连线 *1.2个连线没有拐弯 *2.2个连线有一个拐弯 *3.2个连线有2个拐弯 *采用递归算法 */ package llk; impo ...

  5. java—连连看-实现封装

    1.封装 Chess.java package Linkup; /** * 棋子封装类 * * @author laixl * */ public class Chess { // 图片的 状态 // ...

  6. java—连连看GUI

    1.连连看棋盘图形化 package Link; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; impo ...

  7. 代码重构----使用java有限状态机来消除太多的if else判断

    1. 状态机基本概念 http://zh.wikipedia.org/wiki/%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA 状态存储关于过去的信息,就是 ...

  8. Java中的浮点数-科学计数法-加减乘除

    上次,提到"元转分"这个浮点数问题,boss倾向于手动把1.23元这种格式,转换成123分.    但实际上,浮点数很容易遇到精度问题.    比如,System.out.prin ...

  9. Java堆空间Vs栈内存

    之前我写了几篇有关Java垃圾收集的文章之后,我收到了很多电子邮件,请求解释Java堆空间,Java栈内存,Java中的内存分配以及它们之间的区别. 您可能在Java,Java EE书籍和教程中看到很 ...

随机推荐

  1. 对于gitHub的总结随笔

    作用:用于项目的版本管理     密切相关的是       git                操作  1.本地的文件上传到github上                              ...

  2. hadoop生态搭建(3节点)-15.Nginx_Keepalived_Tomcat配置

    # Nginx+Tomcat搭建高可用服务器名称 预装软件 IP地址Nginx服务器 Nginx1 192.168.6.131Nginx服务器 Nginx2 192.168.6.132 # ===== ...

  3. ES基础知识与高频考点梳理

    知识点梳理目录列表 变量类型 JS的数据类型分类和判断 值类型和引用类型 原型与原型链(继承) 原型和原型链的定义 继承写法 作用域和闭包 执行上下文 this 闭包是什么 异步 同步VS异步 异步和 ...

  4. 常用贴片三极管型号与丝印的对应关系(SOT23)

    个人常用贴片三极管型号与丝印的对应关系(SOT23): 丝印:Y1          型号:8050,NPN型三极管 丝印:Y2          型号:8550,PNP型三极管 丝印:L6     ...

  5. 指针小白:修改*p与p会对相应的地址的变量产生什么影响?各个变量指针的长度为多少?

    这两天敲代码碰到了一个这样的问题 代码如下: #include <stdio.h> #include <stdlib.h> int main() { ; int* p=& ...

  6. TensorFlow之tf.nn.dropout():防止模型训练过程中的过拟合问题

    一:适用范围: tf.nn.dropout是TensorFlow里面为了防止或减轻过拟合而使用的函数,它一般用在全连接层 二:原理: dropout就是在不同的训练过程中随机扔掉一部分神经元.也就是让 ...

  7. 在线接口文档工具——ShowDoc

    ShowDoc:https://www.showdoc.cc/ --待更.

  8. 20145202马超《java》实验5

    两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 结对实现中缀表达式转后缀表达式的功能 MyBC.java 结对实现从上面 ...

  9. Spring的cache缓存介绍

    从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...

  10. git 取消commit

    git如何撤销上一次commit操作 1.第一种情况:还没有push,只是在本地commit git reset --soft|--mixed|--hard <commit_id> git ...