⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stage.java

📁 一个JAVA写的连连看游戏,非常不错,是学习JAVA的好资料,值得下载
💻 JAVA
字号:
/*
 * Created on 2005-3-16
 */
package jcase.lianliankan;
import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Point;
import java.awt.event.*;
/**
 * @author javacat 
 * 游戏舞台,提供绘制图片的功能
 */
public class Stage extends JComponent{

	public static void main(String[] args) {
		String[] lines = new String[6];
		lines[0] = "------------";
		lines[1] = "-BCDEFGHBAD-";
		lines[2] = "-CDEFGNMHAD-";
		lines[3] = "-POIDLWLSSL-";
		lines[4] = "-KLMMSJKKEF-";
		lines[5] = "------------";
		
		JFrame frame = new JFrame("游戏舞台测试");
		frame.getContentPane().setLayout(new BorderLayout());
		frame.getContentPane().add(new Stage(Model.createModel(lines)),BorderLayout.CENTER);
		Timer timer = new Timer(180);
		frame.getContentPane().add(timer,BorderLayout.SOUTH);
		frame.pack();
		frame.show();		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		timer.start();
	}
	int iw = Configuration.getIconWidth();
	int ih = Configuration.getIconHeight();
	private StageListener listener;
	private Model model;
	private Point[] points = new Point[2];	
	private boolean hintFlag;
	public Stage(Model model){			
		this.setOpaque(false);
		this.addMouseListener(new ClickListener());
		resetPoints();	
		this.model = model;
	}
	
	public Model getModel(){
		return model;
	}
		
	/**
	 * @return Returns the listener.
	 */
	public StageListener getListener() {
		return listener;
	}
	/**
	 * @param listener The listener to set.
	 */
	public void setListener(StageListener listener) {
		this.listener = listener;
	}
	public Dimension getMaximumSize() {
		return getPreferredSize();
	}
	
	public Dimension getMinimumSize() {		
		return getPreferredSize();
	}
	/* (non-Javadoc)
	 * @see java.awt.Component#getPreferredSize()
	 */
	public Dimension getPreferredSize() {		
		return new Dimension(model.getColumns()*iw+getInsets().left+getInsets().right,
				model.getRows()*ih+getInsets().top+getInsets().bottom);
	}
	
	/**
	 * empty insets
	 */	
	public Insets getInsets() {
		return new Insets(0,0,0,0);
	}
	
	/**
	 * 绘制图形
	 * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
	 */
	protected void paintComponent(Graphics g) {
	    //Log.debug("painting stage");
	    g.setColor(Color.blue);
	    g.drawRect(0,0,getSize().width,getSize().height);		
		for(int y=0;y<model.getRows();y++){
			for(int x=0;x<model.getColumns();x++){
				char ch = model.getChar(x,y);
				if(ch==Model.EMPTY) continue;
				CharIcon icon=Configuration.getIcon(ch);
				icon.setSelected(isSelected(x,y));				
				icon.paintIcon(this,g,
						x*iw+getInsets().left,
						y*ih+getInsets().top);				
			}		
		}
	}
	
	void hint(){		
		int[] next = model.getNextPair();		
		if(next!=null){
			hintFlag = true;
			new Thread(new HintThread(next)).start();
		}
	}
	/**
	 * 检测当前单元是否被选中
	 * @param x
	 * @param y
	 * @return
	 */
	private boolean isSelected(int x,int y){		
		if(points[0].x == x && points[0].y == y){
			return true;
		}
		if(points[1].x == x && points[1].y == y){
			return true;
		}
		return false;
	}
	/**
	 * 处理鼠标点击事件。
	 * @param e
	 */
	private void clicked(MouseEvent e){
	    int x= e.getX()/iw;
	    int y= e.getY()/ih;
	    if(x>=model.getColumns() || y>=model.getRows()){
	        return;
	    }
		Point p = new Point(x,y);
		//System.out.println(p);
		if(points[0].x<0){
			points[0] = p;
		}else if(points[0].equals(p)){
			resetPoints();
		}else{
			points[1] = p;
			new Thread(new LinkThread()).start();
		}
		repaint();
	}
	
	private void resetPoints(){
		points[0] = new Point(-1,-1);
		points[1] = new Point(-1,-1);
	}
	private void drawLine(Graphics g,int x1,int y1,int x2,int y2){		
		g.drawLine(x1*iw+iw/2,y1*ih+ih/2,x2*iw+iw/2,y2*ih+ih/2);
	}
	public void wash(boolean force){
		if(force)
			model.wash();
		while(!model.check()){					
			Log.debug("washing");
			model.wash();
		}
		repaint();
	}
	
	class LinkThread implements Runnable{
		public void run(){			
			//TODO get the path and draw the path
			int x1=points[0].x;
			int y1=points[0].y;
			int x2=points[1].x;
			int y2=points[1].y;
			int[] result = model.defuse(x1,y1,x2,y2);
			if(null != result){
				int x,y;
				Graphics2D g = (Graphics2D)getGraphics();
				g.setStroke(Configuration.getLinkStroke());			
				g.setColor(Color.GREEN);
				if(result[0]<0){
					y= result[1];
					drawLine(g,x1,y1,x1,y);
					drawLine(g,x1,y,x2,y);
					drawLine(g,x2,y,x2,y2);
				}else{
					x= result[0];
					drawLine(g,x1,y1,x,y1);
					drawLine(g,x,y1,x,y2);
					drawLine(g,x,y2,x2,y2);
				}
				try {					
					Thread.sleep(200);
				} catch (InterruptedException e) {
					//do nothing
				}
			}
			//release points
			resetPoints();
			repaint();
			if(model.isAllDefused()){
				listener.congratulate();
			}else{
				wash(false);
				listener.credit(Configuration.getCredit());
			}
		}
	}
	
	class HintThread implements Runnable{
		int[] hints;
		public HintThread(int[] pts){
			hints=pts;
		}
		public void run(){
			while(hintFlag){
				if(points[0].x<0){
					points[0]= new Point(hints[0],hints[1]);
					points[1]= new Point(hints[2],hints[3]);
				}else{
					resetPoints();
				}
				repaint();
				try{
					Thread.sleep(200);
				}catch(InterruptedException ie){
					
				}
			}			
		}
	}
	class ClickListener extends MouseAdapter{
		public void mousePressed(MouseEvent e){
		    if(hintFlag){
			    hintFlag = false;			
			    resetPoints();
		    }
		}
		public void mouseClicked(MouseEvent e) {			
			clicked(e);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -