主界面

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.util.Random; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel; /**
* 悲剧 长宽没有控制好 忘了给添加按钮留空间了
* @author Administrator
*
*/
public class MyFrame extends JFrame implements MouseListener { public static final int COL = 4; //图像列数
public static final int ROW = 4; //图像行数
public static final int ONE = 80; //每幅图像的宽度与高度
public static final int STANCE = 30;
private static final int WIDTH = COL*ONE; //界面的宽度
private static final int HEIGHT = ROW*ONE + STANCE; //界面的长度
public static final int number = COL*ROW/2; //图像数目
private JPanel functionJPanel = null; //最上方 用来保存功能键的panel
private JPanel imagesJPanel = null; // 中间用来保存图像的panel
private JPanel chooseJPanel = null; //下面用来选择重新开始和结束的panel
private JButton restartJButton = null; //重新开始的按钮
private JButton closeJButton = null; //关闭按钮
private JLabel functionJLabel = null;
private MyImages myImages ;
private int point1_x = -1; //第一下点击的x坐标
private int point1_y = -1; // 第一下点击的y坐标
private int point2_x = -1; //第二下点击的x坐标
private int point2_y = -1; //第二下点击的y坐标
private static Random random = new Random();
private CanGet canGet;
//用来存放图像的button 暂时不考虑用这种做法
// private JButton[][] myImageJButtons = new JButton[ROW][COL]; //用来保存地图的数组 素组下标表示位置 此位置上的值表示图像编号 0表示无图像
private int[][] myMap = new int[ROW][COL]; public int[][] getMyMap(){
return myMap;
} // 将一对一对的数随机到数组中 (1-8)随机生成地图
private void setMap(){ for(int i=0;i<number;i++){ for(int j=0 ;j<2;j++){
int x = random.nextInt(COL);
int y = random.nextInt(ROW);
while(myMap[x][y]!=0){
x = random.nextInt(COL);
y = random.nextInt(ROW);
}
myMap[x][y] = (i+1)/2+1; //在这里将每个位置上的图片编号设定好
}
} } private void init(){
setMap(); //将地图生成
//读图
myImages = new MyImages(this);
canGet = new CanGet(this);
//初始化JPanel
// functionJPanel = new JPanel();
// imagesJPanel = new JPanel();
// chooseJPanel = new JPanel(); //将JPanel放到适当的位置
// Container container = this.getContentPane();
// container.setLayout(new BorderLayout());
// container.add(imagesJPanel, "Center");
// container.add(functionJPanel, "North");
// container.add(chooseJPanel, "South"); //初始化JPanel上各个组件
// functionJLabel = new JLabel("00000000000");
// functionJPanel.add(functionJLabel);
// restartJButton = new JButton("重新开始");
// closeJButton = new JButton("退出游戏");
// chooseJPanel.add(restartJButton);
// chooseJPanel.add(closeJButton); //初始化frame的位置大小
Toolkit toolkit = Toolkit.getDefaultToolkit();
int width = toolkit.getScreenSize().width;
int height = toolkit.getScreenSize().height;
this.setLocation((width-WIDTH)/2, (height-HEIGHT)/2);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(WIDTH, HEIGHT);
this.addMouseListener(this);
this.setBackground(Color.WHITE);
this.setResizable(false);
this.setVisible(true);
} @Override
public void paint(Graphics g) { BufferedImage backScreen = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_3BYTE_BGR); Graphics g2 = backScreen.getGraphics();
Color c = g2.getColor();
g2.setColor(Color.WHITE);//設置背景顏色
g2.fillRect(0, 0, WIDTH, HEIGHT);
g2.setColor(c);
for(int i=0;i<ROW;i++){
for(int j=0;j<COL;j++){
if(0 != myMap[i][j]){
// System.out.println(myMap[i][j]);
myImages.drawAnImage(g2, i, j, myMap[i][j]);
}
}
}
c = g2.getColor();
g2.setColor(Color.BLACK);
if(point1_x != -1){
g2.drawRect( point1_y*ONE,point1_x*ONE, ONE, ONE);
}
if(point2_x != -1){
g2.drawRect( point2_y*ONE,point2_x*ONE, ONE, ONE);
}
g2.setColor(c);
g.drawImage(backScreen, 0, 30, null);
} public MyFrame(){
init();
} /**
* @param args
*/
public static void main(String[] args) {
new MyFrame();
} @Override
public void mouseClicked(MouseEvent e) {
int col = e.getX()/ONE;
int row = (e.getY()-STANCE)/ONE; if(-1 == point1_x || -1 == point1_y){
//System.out.println("sssssssssssssssss");
point1_x = row;
point1_y = col;
System.out.println("flag111111111");
}else if (-1 == point2_x || -1 == point2_y) {
point2_x = row;
point2_y = col;
canGet = new CanGet(this);
System.out.println("flag22222222222");
if(myMap[point1_x][point1_y] == myMap[point2_x][point2_y]
&&(point1_x != point2_x || point1_y != point2_y)
&&canGet.isConnect(point1_x,point1_y, point2_x,point2_y)){
//在此处检测是否联通
System.out.println("flag333333333");
//如果联通 则将两个位置的图片消去(变成0)
setMapPointNull(point1_x, point1_y);
setMapPointNull(point2_x, point2_y);
//重置第两个选中的点
resetPoint1();
resetPoint2();
//重画界面
}else{
System.out.println("flag44444444444444");
point1_x = point2_x;
point1_y = point2_y;
resetPoint2();
}
}else{
System.out.println("flag55555555555");
resetPoint1();
resetPoint2();
}
// System.out.println("point1 ("+point1_x + "," +point1_y+")");
// System.out.println("point2 ("+point2_x + "," +point2_y+")");
// System.out.println(row + "," +col);
repaint();
} //将一个点重置为0
private void setMapPointNull(int row,int col){
myMap[row][col] = 0;
} //重置所有的点 生成新的地图
private void resetMapAllPoints(){
setMap();
} //重置两个鼠标选择的点 为未选中状态
private void resetPoint1(){
point1_x = -1;
point1_y = -1;
} private void resetPoint2(){
point2_x = -1;
point2_y = -1;
} @Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub } @Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub } @Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub } @Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub } }

判断连通的类

import java.util.Stack;

public class CanGet {
private Stack<Node> mySteps = new Stack<>();
private Stack<Node> myRecord = new Stack<>();
private int[][] myMap;
private int current_row;
private int current_col;
private int rowNumber;
private int colNumber;
public CanGet(MyFrame myFrame){
this(myFrame.getMyMap());
}
public CanGet(int[][] map){
this.myMap = map;
this.rowNumber = this.myMap.length;
this.colNumber = this.myMap[0].length;
} private void setCurrent(int row ,int col){
current_col = col;
current_row = row;
} public boolean isConnect(int start_row,int start_col,int end_row,int end_col){
boolean flag = false;
setCurrent(start_row, start_col);
keepRecord();
while(!flag){
if(nextIsTarget(end_row, end_col)){
flag = true;
break;
}else {
if(mySteps.isEmpty()){
flag = false;
return flag;
}else if(goLeft() || goUp() || goRigth() || goDown()){
keepRecord();
}else {
Node node = mySteps.pop();
setCurrent(node.getRow(), node.getCol());
} }
}
return flag;
} private void keepRecord(){
Node node = new Node(current_row, current_col);
mySteps.push(node);
myRecord.push(node);
} private boolean goLeft(){
if(current_col-1 >= 0 &&
!myRecord.contains(new Node(current_row, current_col-1))
&& myMap[current_row][current_col-1] == 0){ current_col -= 1;
return true;
}
return false;
}
private boolean goUp(){
if(current_row-1 >= 0
&& !myRecord.contains(new Node(current_row-1, current_col))
&& myMap[current_row-1][current_col] == 0){ current_row -= 1;
return true;
}
return false;
}
private boolean goRigth(){
if(current_col+1 < this.colNumber
&& !myRecord.contains(new Node(current_row, current_col+1))
&& myMap[current_row][current_col+1] == 0){ current_col += 1;
return true;
}
return false;
}
//探测向下
private boolean goDown(){
if(current_row+1 < this.rowNumber
&& !myRecord.contains(new Node(current_row+1, current_col))
&& myMap[current_row+1][current_col] == 0){ current_row += 1;
return true;
}
return false;
} //用来判断当前点的周围是否是目标点
private boolean nextIsTarget(int target_row,int target_col){
int row = current_row;
int col = current_col;
boolean flag = false;
Node[] nodes = getNear(current_row,current_col);
for(int i=0;i<nodes.length;i++){
if(nodes[i] != null
&& (nodes[i].getRow() == target_row && nodes[i].getCol() == target_col)){
flag = true;
break;
}
}
return flag;
} private Node[] getNear(int row,int col){
Node[] nodes = new Node[4]; // 四个方向的临近点
if(row-1 >= 0){
nodes[0] = new Node(row-1, col);
}
if(col-1 >= 0){
nodes[1] = new Node(row, col-1);
}
if(row+1 < this.rowNumber){
nodes[2] = new Node(row+1, col);
}
if(col+1 < this.colNumber){
nodes[3] = new Node(row, col+1);
}
return nodes;
} private boolean isSmoothTo(int row,int col,Dir dir){
boolean isSmooth = false;
boolean flag = false;
int next_row = -1;
int next_col = -1;
switch(dir){
case L:
next_col = col - 1;
next_row = row ;
//当数组下表不越界 标识为真
if(next_col>=0){
flag = true;
}
break;
case U:
next_row = row - 1;
next_col = col;
//当数组下表不越界 标识为真
if(next_row>=0 ){
flag = true;
}
break;
case R:
next_col = col + 1;
next_row = row;
//当数组下表不越界 标识为真
if(next_col < this.colNumber){
flag = true;
}
break;
case D:
next_row = row + 1;
next_col = col;
//当数组下表不越界 标识为真
if(next_row < this.rowNumber){
flag = true;
}
break;
}
//当标识与 地图在这个位置没有障碍物 为0表示没有障碍物 且当前路线没有走过
if(flag && 0 == myMap[next_row][next_col]){
isSmooth = true;
}
return isSmooth;
} private boolean goToNextPoint(Dir dir){
boolean flag = false;
System.out.println("go to next point");
if (isSmoothTo(current_row, current_col, dir)) {
flag = true;
switch (dir) {
case R:
current_col += 1;
break;
case D:
current_row += 1;
break;
case L:
current_col -= 1;
break;
case U:
current_row -= 1;
break;
}
}
return flag;
} private class Node{
private int row;
private int col;
public Node(int row, int col){
this.row = row;
this.col = col;
}
public int getRow() {
return row;
}
public int getCol() {
return col;
}
@Override
public boolean equals(Object o) {
Node node = (Node)o;
return (node.getCol() == this.col && node.getRow() == this.row)? true:false;
} }
}

方向枚举

public enum Dir {
L,U,R,D
}

缓存绘制图像

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException; import javax.imageio.ImageIO; public class MyImages {
private static final int IMAGENUM = MyFrame.COL*MyFrame.ROW/2;
private BufferedImage[] images = new BufferedImage[IMAGENUM];
private MyFrame myFrame;
public MyImages(MyFrame myFrame){
this.myFrame = myFrame;
//将八幅图像读进来 每幅图像的编号与其名字相同 是下标加1
for(int i=0;i<IMAGENUM;i++){
try {
images[i] = ImageIO.read(new File((i+1)+".jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
//第一个参数是画笔 第二个参数是图像所在行数 第三个参数为列数 第四个参数是图像编号 为 1-8;
public void drawAnImage(Graphics g,int row,int col,int imageNum){
//根据行和列算出图像所在位置 画出图像
// System.out.println("image 编号:"+(imageNum));
g.drawImage(images[imageNum-1] , col*MyFrame.ONE,row*MyFrame.ONE, null);
}
}

放上去几张图片 点击这里下载

连连看java版的更多相关文章

  1. ArcGIS Server 10 Java 版的Rest服务手动配置方法

    Java版的Manager中发布的服务默认只发布了该服务的SOAP接口,而REST接口需要用户在信息服务器,如Tomcat. Apache.WebLogic等中手工配置.由于在Java版的Server ...

  2. PetaPojo —— JAVA版的PetaPoco

    背景 由于工作的一些原因,需要从C#转成JAVA.之前PetaPoco用得真是非常舒服,在学习JAVA的过程中熟悉了一下JAVA的数据组件: MyBatis 非常流行,代码生成也很成熟,性能也很好.但 ...

  3. 【转载】java版打字练习软件

    网上找到一个java版的打字的游戏 import java.applet.Applet; import java.applet.AudioClip; import java.awt.Dimension ...

  4. 微博地址url(id)与mid的相互转换 Java版

    原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分 ...

  5. JCEF3——谷歌浏览器内核Java版实现(一):使用jawt获取窗体句柄

    前言 最近一段时间研究谷歌浏览器内核.谷歌浏览器内核一直开源,并维护更新,它的开源项目中内核更新速度和Chrome浏览器版本更新进度一样!而且它不同于WebKit(值得一题的是谷歌浏览器已不使用Web ...

  6. Selenium关键字驱动测试框架Demo(Java版)

    Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html

  7. 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

    第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...

  8. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  9. 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...

随机推荐

  1. hdoj:2034

    #include <iostream> #include <vector> #include<algorithm> //包含sort函数 using namespa ...

  2. (笔记)Linux内核学习(三)之进程调度

    进程调度: 在可运行态进程之间分配有限处理器时间资源的内核子系统. 一 调度策略 1 进程类型 I/O消耗型进程:大部分时间用来提交I/O请求或是等待I/O请求,经常处于可运行状态,但运行时间短,等待 ...

  3. 第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置2,以及目录结构说明

    第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置2,以及目录结构说明 设置后台列表页面可以直接修改字段内容 在当前APP里的adminx.py文件里的 ...

  4. Java如何读取和下载网页?

    在Java编程中,如何读取和下载网页? 以下示例显示如何使用net.URL类的URL()构造函数来读取和下载网页. package com.yiibai; import java.io.Buffere ...

  5. python初级 1 数据类型和变量

    一.整数(int) 例:  0 1 2 3 -1 -2 –3 In [31]: print(type(0)) <class 'int'> In [32]: print(type(1)) & ...

  6. [Bayes] Point --> Line: Estimate "π" by R

    “半个数学系 + 一个计算机科学系 = Deep Learning初级班” simulation = function(sampleSize){ c = rep(0,sampleSize) // &l ...

  7. EventFlow.helper.js 事件流程控制

    /*! * 事件流程管理 * version: 1.0.0-2018.07.25 * Requires ES6 * Copyright (c) 2018 Tiac * http://www.cnblo ...

  8. [R]统计工具包

    Wilcoxon Rank Sum and Signed Rank Tests data <-read.csv('XX.csv') wilcox.test(data$value1, data$v ...

  9. QT 获取电脑时间

    使用环境: VS2010 & QT Designer5 #include <QDateTime>  //包含头文件 QDateTime local(QDateTime::curre ...

  10. Mac下利用Cordova打包 iOS App以及出现的问题

    安装 cordova sudo npm install cordova 创建项目 创建一个demo文件夹,里面自动加载基本的文件以及目录 cordova create demo com.test.de ...