java—连连看-实现消除
实现消除
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—连连看-实现消除的更多相关文章
- 【代码笔记】Java连连看项目的实现(2)——JTable 、TableModel的使用
博客有时间就写写,所以一篇可能会拆成很多篇,写完后计划再合在一起. 首先肯定是要实现连连看的界面. 先准备连连看要的图片.. “LianLianKan”就是项目名称. 当然,如果小白看我的博客想学到什 ...
- 【代码笔记】Java连连看项目的实现(1)——JTable 、TableModel的使用
javax.swing.table.TableModel和javax.swing.JTable JTable .TableModel是Java里面画表格的包. TableModel:为Table提供显 ...
- 台哥原创:java 连连看源码
2010年,迷上了玩连连看 随手就做了这个,正好手头有这些图片素材 游戏启动时,界面先铺上了一层透明幕布,然后这些兵器图片交替从上到下,从左到右出现.. 鼠标停在兵器格子上时,所在格子会有红色 ...
- java连连看小项目
/* *本人也是刚入门,希望各位多多指教 *该项目主要代码在于连线 *1.2个连线没有拐弯 *2.2个连线有一个拐弯 *3.2个连线有2个拐弯 *采用递归算法 */ package llk; impo ...
- java—连连看-实现封装
1.封装 Chess.java package Linkup; /** * 棋子封装类 * * @author laixl * */ public class Chess { // 图片的 状态 // ...
- java—连连看GUI
1.连连看棋盘图形化 package Link; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; impo ...
- 代码重构----使用java有限状态机来消除太多的if else判断
1. 状态机基本概念 http://zh.wikipedia.org/wiki/%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA 状态存储关于过去的信息,就是 ...
- Java中的浮点数-科学计数法-加减乘除
上次,提到"元转分"这个浮点数问题,boss倾向于手动把1.23元这种格式,转换成123分. 但实际上,浮点数很容易遇到精度问题. 比如,System.out.prin ...
- Java堆空间Vs栈内存
之前我写了几篇有关Java垃圾收集的文章之后,我收到了很多电子邮件,请求解释Java堆空间,Java栈内存,Java中的内存分配以及它们之间的区别. 您可能在Java,Java EE书籍和教程中看到很 ...
随机推荐
- ACM 2003~2005
ACM 2003 求实数的绝对值 import java.util.Scanner; public class Lengxc { public static void main(String[] ar ...
- jQuery获取Select option 选择的Text和 Value
获取一组radio被选中项的值:var item = $('input[name=items][checked]').val();获取select被选中项的文本var item = $("s ...
- 原生js实现简单轮播的淡入淡出效果
实现这种淡入淡出的轮播关键在于css的一种设置 首先它不能像传统的轮播显示隐藏 或者左右浮动 他应该让其固定定位使其重叠在一起 达到这种效果 然后设置c3动画属性 transition:1s; ...
- scala中“=>”的4种使用场景
一直以来都对scala中"=>"的使用比较迷茫,也不知道他表示什么意思.今天就它的使用场景列举如下,希望可以共同探讨. 表示函数的返回类型(Function Type) sc ...
- 5、GDB调试工具的使用
GDB是GNU发布的一款功能强大的程序调试工具.GDB主要完成下面三个方面的功能: 1.启动被调试程序. 2.让被调试的程序在指定的位置停住. 3.当程序被停住时,可以检查程序状态(如变量值). #i ...
- python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说
使用cmd创建一个scrapy项目: scrapy startproject project_name (project_name 必须以字母开头,只能包含字母.数字以及下划线<undersco ...
- ruby 爬虫爬取拉钩网职位信息,产生词云报告
思路:1.获取拉勾网搜索到职位的页数 2.调用接口获取职位id 3.根据职位id访问页面,匹配出关键字 url访问采用unirest,由于拉钩反爬虫,短时间内频繁访问会被限制访问,所以没有采用多线程, ...
- 使用bison和yacc制作脚本语言(2)
我们先来想一下语法 一般脚本语言不需要定义类型直接在赋值的时候确定 我们主要考虑一下变量的类型 a = 1; b = 1.1; c = "str"; 一般来讲,我们使用这三种类型, ...
- windows7 服务中上找不到mysql
问题:之前在Windows7明明安装过mysql的,现在想要确在服务中寻找不到mysql相关的服务了. 解决方案: 第一步: 在cmd窗口中输入==> mysqld --stall 第二步: 继 ...
- 从官网下载centos
今天想从官网下载6.5版本的CentOS,结果找了好一会儿才找到,赶紧记录下来,以备以后查询. 第一步在百度搜索centos,点击"Download CentOS",如下图所示. ...