[Java] 纯文本查看 复制代码
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
public class Lianliankan extends JFrame{
public static final int SQUARE_SIDE = 30; //每个格的大小
public static final int JFRAME_WIDTH = SQUARE_SIDE * 10; //窗休宽
public static final int JFRAME_HEIGHT = SQUARE_SIDE * 10; //窗体高
public static final String[] data = new String[]{
"田","畕","畾","土","圭","垚","十","卄","卅","卌",
"屮","艸","芔","茻","水","沝","淼","皕","兟","兢",
"競","夶","棗","棘","玨","竝","臸","玆","臦","林"}; //所有显示的数据 "字"
public static int[][] map = new int[][]{
// x 0 1 2 3 4 5 6 7 8 9 y
{0,0,0,0,0,0,0,0,0,0},//0
{0,1,1,1,1,1,1,1,1,0},//1
{0,1,1,1,1,1,1,1,1,0},//2
{0,1,1,1,1,1,1,1,1,0},//3
{0,1,1,1,1,1,1,1,1,0},//4
{0,1,1,1,1,1,1,1,1,0},//5
{0,1,1,1,1,1,1,1,1,0},//6
{0,1,1,1,1,1,1,1,1,0},//7
{0,1,1,1,1,1,1,1,1,0},//8
{0,0,0,0,0,0,0,0,0,0} //9
}; //虚拟地图
public static String[][] fonts = new String[map.length-2][map[0].length-2]; //实际抽出来的 "字"
public static List<Point> coordlist = new ArrayList<Point>(4); //存放已经找到的点
public static List<Point> sticklist = new ArrayList<Point>(2); //存放两个比较点
private GameArithmetic gameArithmetic = new GameArithmetic(); //查找点的算
private SquareMap square; //图形类
private Timer tirmer = new Timer(); //定时器
public static int totalTime = 60000*5; //游戏时间
public Lianliankan(){
//启动定时器来监听时间
TimerTask task = new TimerTask(){
@Override
public void run() {
totalTime -= 1000;
square.repaint();
}
};
tirmer.scheduleAtFixedRate(task, 1000, 1000);
//初始化代码
square = new SquareMap();
square.addMouseListener(new MouseListener());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(JFRAME_WIDTH+5, JFRAME_HEIGHT + 60);
setTitle("Lianliankan");
setLocationRelativeTo(null);
setResizable(false);
JMenuBar menu = new JMenuBar();
JMenu game = new JMenu("游戏");
JMenuItem newgame = game.add("新游戏");
JMenuItem pause = game.add("暂停");
JMenuItem goon = game.add("继续");
JMenuItem exit = game.add("退出");
JMenu help = new JMenu("帮助");
JMenuItem about = help.add("关于");
menu.add(game);
menu.add(help);
setJMenuBar(menu);
add(square);
setVisible(true);
init();
}
//初始化数据
public void init(){
boolean[] fontFalgs = new boolean[data.length];
int length = ((map.length-2)*(map[0].length-2))/4;
Random rn = new Random();
for(int i = 0; i < length; i++){
int num = 0;
do{
num = rn.nextInt(data.length);
}while(fontFalgs[num]);
String str = data[num];
fontFalgs[num] = true;
int colIndex = 0,rowIndex = 0;
for (int j = 0; j < 4; j++) { //随机放到4个不同位置
do{
rowIndex = rn.nextInt(fonts.length);
colIndex = rn.nextInt(fonts[0].length);
}while(fonts[rowIndex][colIndex] != null);
fonts[rowIndex][colIndex] = str;
}
}
}
//鼠标监听
class MouseListener extends MouseAdapter{
@Override
public void mouseClicked(MouseEvent e) {
if(e.getX() < SQUARE_SIDE || e.getX() > SQUARE_SIDE * 9 ||
e.getY() < SQUARE_SIDE || e.getY()> SQUARE_SIDE * 9 ||
map[(e.getY()/SQUARE_SIDE)][(e.getX()/SQUARE_SIDE)] == 0){
return;
} // 出了实际地图界限和已经找到就反回
//System.out.println("x : " + (e.getX()/SQUARE_SIDE) + " y : " + (e.getY()/SQUARE_SIDE));
if(sticklist.size() > 0){ //比较两个点
Point p1 = new Point(sticklist.get(0));
Point p2 = new Point((e.getX()/SQUARE_SIDE),(e.getY()/SQUARE_SIDE));
map[p1.y][p1.x] = 2; //比较两个点时把这两个点设成其它标识
map[p2.y][p2.x] = 2;
//查询两点是否相通如果找到 设成该两点为0
List<Point> ps = gameArithmetic.meet(p1.x < p2.x ? p1 : p2, p2.x > p1.x ? p2 : p1);
if(ps == null){
sticklist.clear();
sticklist.add(new Point((e.getX()/SQUARE_SIDE),(e.getY()/SQUARE_SIDE)));
map[p1.y][p1.x] = 1;
map[p2.y][p2.x] = 1;
}else{
coordlist.addAll(ps);
sticklist.add(p2);
square.repaint();
map[p1.y][p1.x] = 0;
map[p2.y][p2.x] = 0;
}
}else {
sticklist.add(new Point((e.getX()/SQUARE_SIDE),(e.getY()/SQUARE_SIDE)));
}
square.repaint();
}
}
public static void main(String[] args) {
new Lianliankan();
}
}
//图形类
class SquareMap extends JPanel{
Date startTime = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Color c = g.getColor();
g.setColor(Color.GREEN);
draw(g);
g.setColor(c);
}
//画显示在面板上的图形与时间
private void draw(Graphics g){
Font font = new Font("宋体",Font.PLAIN,25);
g.setFont(font);
for(int i = Lianliankan.SQUARE_SIDE ; i < Lianliankan.JFRAME_HEIGHT-Lianliankan.SQUARE_SIDE ; i+=Lianliankan.SQUARE_SIDE){
for (int j = Lianliankan.SQUARE_SIDE; j < Lianliankan.JFRAME_WIDTH - Lianliankan.SQUARE_SIDE; j+=Lianliankan.SQUARE_SIDE) {
if(Lianliankan.map[i/30][j/30]!=0){
g.draw3DRect(j, i, Lianliankan.SQUARE_SIDE, Lianliankan.SQUARE_SIDE, true);
g.drawString(Lianliankan.fonts[(i/Lianliankan.SQUARE_SIDE)-1][(j/Lianliankan.SQUARE_SIDE)-1], j+2, i+25);
}
}
}
if(Lianliankan.sticklist.size() > 0){
g.setColor(Color.RED);
for (int j2 = 0; j2 < Lianliankan.sticklist.size(); j2++) {
Point p = Lianliankan.sticklist.get(j2);
g.draw3DRect(p.x * (Lianliankan.SQUARE_SIDE),(p.y *Lianliankan.SQUARE_SIDE) , Lianliankan.SQUARE_SIDE, Lianliankan.SQUARE_SIDE, true);
}
if(Lianliankan.sticklist.size() >= 2){
Lianliankan.sticklist.clear();
}
}
if(Lianliankan.coordlist.size() > 0){
g.setColor(Color.RED);
int num = Lianliankan.SQUARE_SIDE/2;
for (int j2 = 1; j2 < Lianliankan.coordlist.size(); j2++) {
Point p1 = Lianliankan.coordlist.get(j2 - 1);
Point p2 = Lianliankan.coordlist.get(j2);
g.drawLine((p1.x * Lianliankan.SQUARE_SIDE + num) , (p1.y * Lianliankan.SQUARE_SIDE + num)
, (p2.x * Lianliankan.SQUARE_SIDE + num) , (p2.y * Lianliankan.SQUARE_SIDE + num));
}
if(Lianliankan.coordlist.size() >= 2){
Lianliankan.coordlist.clear();
}
}
g.setColor(Color.GRAY);
font = new Font("宋体",Font.PLAIN,15);
g.setFont(font);
startTime.setTime(Lianliankan.totalTime);
g.drawString(sdf.format(startTime), Lianliankan.JFRAME_WIDTH-Lianliankan.SQUARE_SIDE*2-5, 12);
}
}
//算法类
class GameArithmetic{
public List<Point> meet(Point p1,Point p2){
if(p1.equals(p2) || !Lianliankan.fonts[p1.y-1][p1.x-1].equals(Lianliankan.fonts[p2.y-1][p2.x-1])) return null;
int index = 0;
boolean left = true,right = true,up = true,down = true;
//分 上下左右四个方向查找 每次+1 移动的找有障碍物返回
while(left || right || up || down){
if(right && meetCols(p1,new Point(p1.x+index,p1.y))==0){
if(meetCols(p2,new Point(p1.x+index,p2.y))==0 &&
meetRows(new Point(p1.x+index,p1.y),new Point(p1.x+index,p2.y)) == 0){
return surveyPointer(p1,p2,new Point(p1.x+index,p1.y),new Point(p1.x+index,p2.y));
}
}else{
right = false;
}
if(left && meetCols(p1,new Point(p1.x-index,p1.y))==0){
if(meetCols(p2,new Point(p1.x-index,p2.y))==0 &&
meetRows(new Point(p1.x-index,p1.y),new Point(p1.x-index,p2.y)) == 0){
return surveyPointer(p1,p2,new Point(p1.x-index,p1.y),new Point(p1.x-index,p2.y));
}
}else{
left = false;
}
if(down && meetRows(p1,new Point(p1.x,p1.y+index))==0){
if(meetRows(p2,new Point(p2.x,p1.y+index))==0 &&
meetCols(new Point(p1.x,p1.y+index),new Point(p2.x,p1.y+index)) == 0){
return surveyPointer(p1,p2,new Point(p1.x,p1.y+index),new Point(p2.x,p1.y+index));
}
}else{
down = false;
}
if(up && meetRows(p1,new Point(p1.x,p1.y-index))==0){
if(meetRows(p2,new Point(p2.x,p1.y-index))==0 &&
meetCols(new Point(p1.x,p1.y-index),new Point(p2.x,p1.y-index)) == 0){
return surveyPointer(p1,p2,new Point(p1.x,p1.y-index),new Point(p2.x,p1.y-index));
}
}else{
up = false;
}
index ++;
}
return null;
}
private int meetCols(Point p1,Point p2){
int start = p1.x < p2.x ? p1.x : p2.x;
int end = p1.x < p2.x ? p2.x : p1.x;
if(start < 0 || end >= Lianliankan.map[0].length) return 1;
for (int i = start; i <= end ; i++) {
if(Lianliankan.map[p1.y][i]==1)
return Lianliankan.map[p1.y][i];
}
return 0;
}
private int meetRows(Point p1,Point p2){
int start = p1.y < p2.y ? p1.y : p2.y;
int end = p1.y < p2.y ? p2.y : p1.y;
if(start < 0 || end >= Lianliankan.map.length) return 1;
for (int i = start; i <= end ; i++) {
if(Lianliankan.map[i][p1.x]==1)
return Lianliankan.map[i][p1.x];
}
return 0;
}
private List<Point> surveyPointer(Point p1,Point p2,Point proxy1,Point proxy2){
List<Point> pList = new ArrayList<Point>();
pList.add(p1);
if(proxy1.equals(p1) && proxy2.equals(p2)){
}else if(proxy1.equals(p1)){
pList.add(proxy2);
}else if(proxy2.equals(p2)){
pList.add(proxy1);
}else{
pList.add(proxy1);
pList.add(proxy2);
}
pList.add(p2);
return pList;
}
}