用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - android代码库

连连看Android版 源代码下载

2013-11-21 作者: 免费源代码下载整理举报

[android]代码库

package games.llk;

import java.util.Random;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Bitmap.Config;
import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;

public class GameView extends View {

	private int m_w;
	private int m_h;
	private int top_client;
	private int right_client;
	private int bottom_client;
	private int left_client;
	private Rect client_r;
	private Paint p_client_r;
	private boolean display_moreInfo;
	private boolean isInited;
	private Paint p;
	private Paint p_line;
	private Paint p_line_2;
	private Paint p_text;
	private Paint p_pross_b;
	private Paint p_pross;
	private int point_w;
	private int point_h;
	private Rect btn_r_1;
	private Rect btn_r_2;
	private Rect btn_r_close;
	private Bitmap bmp_btn;
	private Rect pross_r;
	private Rect pross_r_2;
	private Rect t_r;
	private Rect t_r_2;

	private boolean ispause = false;
	private boolean isstart = false;
	private String s_pause = "暂停中。";

	private Bitmap buff;
	private Bitmap bmp_point;
	private Bitmap bmp_hint;
	private Canvas buff_Canvas;
	private int flevel;
	private int ffen = 0;
	private int timecount = 0;
	private int timecountper_l = 480;
	private boolean isdrawing = false;
	private Random random = new Random();
	private Resources res;
	private Point[] pointlist_tmp;
	private int pointlist_tmp_count = 0;
	private RefreshHandler mRedrawHandler = new RefreshHandler();
	private Point mousept;
	private Point lastpt;
	private Point hintpt_1;
	private Point hintpt_2;
	private boolean isontimering = false;
	private boolean isonmousedown = false;
	private int ontimercount = 0;

	class RefreshHandler extends Handler {
		@Override
		public void handleMessage(android.os.Message msg) {
			GameView.this.ontimer();
			nexttimer(240);
		}

		public void nexttimer(long delayMillis) {
			this.removeMessages(0);
			sendMessageDelayed(obtainMessage(0), delayMillis);
		}
	};

	private Pointlist fpointlist = new Pointlist();

	class Pointlist {
		private int fxcount;
		private int fycount;
		private int[] l1;
		private int[] l2;
		private PointData[][] fpointreclist;

		class PointData {
			public int x;
			public int y;
			public boolean value;
			public Object data;
			public Rect rect;
			public int stat;
			public int imgidx;

		}

		private Point[] plist_1;
		private int plist_1_len;
		private Point[] plist_2;
		private int plist_2_len;
		private Point[] pathlist;
		public int pcount = 0;

		public void init(int xcount, int ycount) {
			fxcount = xcount;
			fycount = ycount;
			fpointreclist = new PointData[fxcount + 2][fycount + 2];
			for (int x_i = 0; x_i < fpointreclist.length; x_i++) {
				for (int y_i = 0; y_i < fpointreclist[x_i].length; y_i++) {
					fpointreclist[x_i][y_i] = new PointData();
					fpointreclist[x_i][y_i].x = x_i;
					fpointreclist[x_i][y_i].y = y_i;
					fpointreclist[x_i][y_i].value = false;
					fpointreclist[x_i][y_i].data = null;
					fpointreclist[x_i][y_i].rect = new Rect(0, 0, 0, 0);
					fpointreclist[x_i][y_i].stat = -1;
					fpointreclist[x_i][y_i].imgidx = -1;
				}
			}
			plist_1 = new Point[(fxcount + fycount + 2) * 4];
			for (int i = 0; i < plist_1.length; i++) {
				plist_1[i] = new Point(0, 0);
			}
			plist_1_len = 0;
			plist_2 = new Point[(fxcount + fycount + 2) * 4];
			for (int i = 0; i < plist_2.length; i++) {
				plist_2[i] = new Point(0, 0);
			}
			plist_2_len = 0;
			pathlist = new Point[2];
			for (int i = 0; i < pathlist.length; i++) {
				pathlist[i] = new Point(0, 0);
			}
			l1 = new int[fxcount * 2];
			l2 = new int[fxcount * 2];
		}

		public void setValue(int x, int y, Boolean value) {
			fpointreclist[x][y].value = value;
		}

		public boolean getValue(int x, int y) {
			return fpointreclist[x][y].value;
		}

		public void setData(int x, int y, Object data) {
			fpointreclist[x][y].data = data;
		}

		public void setrect(int x, int y, Rect r) {
			fpointreclist[x][y].rect.left = r.left;
			fpointreclist[x][y].rect.top = r.top;
			fpointreclist[x][y].rect.right = r.right;
			fpointreclist[x][y].rect.bottom = r.bottom;
		}

		public Rect getrect(int x, int y) {
			return fpointreclist[x][y].rect;
		}

		public void setstat(int x, int y, int v) {
			fpointreclist[x][y].stat = v;
		}

		public int getstat(int x, int y) {
			return fpointreclist[x][y].stat;
		}

		public void setimgidx(int x, int y, int v) {
			fpointreclist[x][y].imgidx = v;
		}

		public int getimgidx(int x, int y) {
			return fpointreclist[x][y].imgidx;
		}

		public boolean checkpp(Point p1, Point p2) {
			boolean result = false;
			if ((p1.x == p2.x) && (p1.y == p2.y)) {
				return true;
			}
			if (p1.y == p2.y) {
				int x1 = p1.x < p2.x ? p1.x : p2.x;
				int x2 = p1.x > p2.x ? p1.x : p2.x;
				for (int i = x1 + 1; i <= x2 - 1; i++) {
					if (fpointreclist[i][p1.y].value) {
						return false;
					}
				}
				result = true;
			}
			if (p1.x == p2.x) {
				int y1 = p1.y < p2.y ? p1.y : p2.y;
				int y2 = p1.y > p2.y ? p1.y : p2.y;
				for (int i = y1 + 1; i <= y2 - 1; i++) {
					if (fpointreclist[p1.x][i].value) {
						return false;
					}
				}
				result = true;
			}
			return result;
		}

		public void mousetoxy(int x, int y, Point pt) {
			for (int x_i = 1; x_i <= fxcount; x_i++) {
				for (int y_i = 1; y_i <= fycount; y_i++) {
					if (fpointreclist[x_i][y_i].rect.contains(x, y)) {
						pt.x = x_i;
						pt.y = y_i;
						return;
					}
				}
			}
			pt.x = -1;
			pt.y = -1;
		}

		public boolean isallok() {
			for (int x_i = 1; x_i <= fxcount; x_i++) {
				for (int y_i = 1; y_i <= fycount; y_i++) {
					if (fpointreclist[x_i][y_i].stat >= 0) {
						return false;
					}
				}
			}
			return true;
		}

		public void changeplace(int v) {
			int idx = 0;
			if ((v == 2) || (v == 6)) {
				for (int i = 1; i <= fxcount; i++) {
					idx = 0;
					for (int j = 1; j <= fycount; j++) {
						if (getstat(i, j) >= 0) {
							idx = idx + 1;
							l1[idx] = getimgidx(i, j);
							l2[idx] = getstat(i, j);
						}
					}
					for (int j = 1; j <= fycount; j++) {
						if (j > idx) {
							setimgidx(i, j, -1);
							setstat(i, j, -1);
							setValue(i, j, false);
						} else {
							setimgidx(i, j, l1[j]);
							setstat(i, j, l2[j]);
							setValue(i, j, true);
						}
					}
				}
			}
			if ((v == 3) || (v == 7)) {
				for (int i = 1; i <= fxcount; i++) {
					idx = fycount + 1;
					for (int j = fycount; j >= 1; j--) {
						if (getstat(i, j) >= 0) {
							idx = idx - 1;
							l1[idx] = getimgidx(i, j);
							l2[idx] = getstat(i, j);
						}
					}
					for (int j = fycount; j >= 1; j--) {
						if (j < idx) {
							setimgidx(i, j, -1);
							setstat(i, j, -1);
							setValue(i, j, false);
						} else {
							setimgidx(i, j, l1[j]);
							setstat(i, j, l2[j]);
							setValue(i, j, true);
						}
					}
				}
			}
			if ((v == 4) || (v == 8)) {
				for (int j = 1; j <= fycount; j++) {
					idx = 0;
					for (int i = 1; i <= fxcount; i++) {
						if (getstat(i, j) >= 0) {
							idx = idx + 1;
							l1[idx] = getimgidx(i, j);
							l2[idx] = getstat(i, j);
						}
					}
					for (int i = 1; i <= fxcount; i++) {
						if (i > idx) {
							setimgidx(i, j, -1);
							setstat(i, j, -1);
							setValue(i, j, false);
						} else {
							setimgidx(i, j, l1[i]);
							setstat(i, j, l2[i]);
							setValue(i, j, true);
						}
					}
				}
			}

			if ((v == 5) || (v == 9)) {
				for (int j = 1; j <= fycount; j++) {
					idx = fxcount + 1;
					for (int i = fxcount; i >= 1; i--) {
						if (getstat(i, j) >= 0) {
							idx = idx - 1;
							l1[idx] = getimgidx(i, j);
							l2[idx] = getstat(i, j);
						}
					}
					for (int i = fxcount; i >= 1; i--) {
						if (i < idx) {
							setimgidx(i, j, -1);
							setstat(i, j, -1);
							setValue(i, j, false);
						} else {
							setimgidx(i, j, l1[i]);
							setstat(i, j, l2[i]);
							setValue(i, j, true);
						}
					}
				}
			}
		}

		public void findstat(int v, Point pt) {
			for (int x_i = 0; x_i < fpointreclist.length; x_i++) {
				for (int y_i = 0; y_i < fpointreclist[x_i].length; y_i++) {
					if (fpointreclist[x_i][y_i].stat == v) {
						pt.x = x_i;
						pt.y = y_i;
						return;
					}
				}
			}
			pt.x = -1;
			pt.y = -1;
		}

		public boolean getpath(int x1, int y1, int x2, int y2) {
			boolean result = false;
			pcount = 0;
			if ((x1 == x2) && (y1 == y2)) {
				return false;
			}
			plist_1[0].x = x1;
			plist_1[0].y = y1;
			plist_1_len = 1;

			plist_2[0].x = x2;
			plist_2[0].y = y2;
			plist_2_len = 1;
			int x;
			int y;

			for (int i = y1 - 1; i >= 0; i--) {
				x = x1;
				y = i;
				if (fpointreclist[x][y].value) {
					break;
				} else {
					plist_1[plist_1_len].x = x;
					plist_1[plist_1_len].y = y;
					plist_1_len = plist_1_len + 1;
				}
			}

			for (int i = y1 + 1; i <= fycount + 1; i++) {
				x = x1;
				y = i;
				if (fpointreclist[x][y].value) {
					break;
				} else {
					plist_1[plist_1_len].x = x;
					plist_1[plist_1_len].y = y;
					plist_1_len = plist_1_len + 1;
				}
			}
			for (int i = x1 - 1; i >= 0; i--) {
				x = i;
				y = y1;
				if (fpointreclist[x][y].value) {
					break;
				} else {
					plist_1[plist_1_len].x = x;
					plist_1[plist_1_len].y = y;
					plist_1_len = plist_1_len + 1;
				}
			}
			for (int i = x1 + 1; i <= fxcount + 1; i++) {
				x = i;
				y = y1;
				if (fpointreclist[x][y].value) {
					break;
				} else {
					plist_1[plist_1_len].x = x;
					plist_1[plist_1_len].y = y;
					plist_1_len = plist_1_len + 1;

				}
			}

			for (int i = y2 - 1; i >= 0; i--) {
				x = x2;
				y = i;
				if (fpointreclist[x][y].value) {
					break;
				} else {
					plist_2[plist_2_len].x = x;
					plist_2[plist_2_len].y = y;
					plist_2_len = plist_2_len + 1;
				}
			}
			for (int i = y2 + 1; i <= fycount + 1; i++) {
				x = x2;
				y = i;
				if (fpointreclist[x][y].value) {
					break;
				} else {
					plist_2[plist_2_len].x = x;
					plist_2[plist_2_len].y = y;
					plist_2_len = plist_2_len + 1;
				}
			}
			for (int i = x2 - 1; i >= 0; i--) {
				x = i;
				y = y2;
				if (fpointreclist[x][y].value) {
					break;
				} else {
					plist_2[plist_2_len].x = x;
					plist_2[plist_2_len].y = y;
					plist_2_len = plist_2_len + 1;
				}
			}

			for (int i = x2 + 1; i <= fxcount + 1; i++) {
				x = i;
				y = y2;
				if (fpointreclist[x][y].value) {
					break;
				} else {
					plist_2[plist_2_len].x = x;
					plist_2[plist_2_len].y = y;
					plist_2_len = plist_2_len + 1;
				}
			}
			pcount = 0;
			for (int i = 0; i < plist_1_len; i++) {
				for (int j = 0; j < plist_2_len; j++) {
					if (checkpp(plist_1[i], plist_2[j])) {
						result = true;
						if (i > 0) {
							pathlist[pcount].x = plist_1[i].x;
							pathlist[pcount].y = plist_1[i].y;
							pcount = pcount + 1;
						}

						if (j > 0) {
							pathlist[pcount].x = plist_2[j].x;
							pathlist[pcount].y = plist_2[j].y;
							pcount = pcount + 1;
						}
						return result;
					}
				}
			}
			return result;
		}

		private boolean getPHint(Point p1, Point p2) {
			for (int i_1 = 1; i_1 <= fxcount; i_1++) {
				for (int j_1 = 1; j_1 <= fycount; j_1++) {
					p1.x = i_1;
					p1.y = j_1;

					if (getimgidx(p1.x, p1.y) < 0)
						continue;
					if (getstat(p1.x, p1.y) < 0)
						continue;

					for (int i_2 = i_1; i_2 <= fxcount; i_2++) {
						for (int j_2 = 1; j_2 <= fycount; j_2++) {
							if ((i_2 == i_1) && (j_2 <= j_1))
								continue;

							p2.x = i_2;
							p2.y = j_2;

							if (getimgidx(p2.x, p2.y) < 0)
								continue;
							if (getstat(p2.x, p2.y) < 0)
								continue;

							if (getimgidx(p1.x, p1.y) != getimgidx(p2.x, p2.y))
								continue;

							if (getpath(p1.x, p1.y, p2.x, p2.y)) {
								return true;
							}
						}
					}
				}
			}
			p1.x = -1;
			p1.y = -1;
			p2.x = -1;
			p2.y = -1;

			return false;
		}
	}

	public GameView(Context context) {
		super(context);
		display_moreInfo = false;
		// TODO Auto-generated constructor stub
		mousept = new Point(0, 0);
		lastpt = new Point(0, 0);
		p = new Paint();
		p_line = new Paint();
		p_line.setARGB(255, 255, 0, 0);
		p_line_2 = new Paint();
		p_line_2.setARGB(255, 0, 0, 255);
		p_text = new Paint();
		p_text.setARGB(255, 0, 0, 0);
		p_text.setTextSize(13);
		p_text.setFlags(Paint.ANTI_ALIAS_FLAG);
		p_pross_b = new Paint();
		p_pross_b.setARGB(255, 210, 210, 210);
		p_pross = new Paint();
		p_pross.setARGB(255, 0, 0, 210);
		p_client_r = new Paint();
		p_client_r.setARGB(255, 255, 255, 255);
		hintpt_1 = new Point(-1, -1);
		hintpt_2 = new Point(-1, -1);

		res = context.getResources();
		isInited = false;
		setFocusable(true);
	}

	public void ontimer() {
		if (isontimering) {
			return;
		}
		if (isonmousedown) {
			return;
		}
		isontimering = true;

		if ((isstart) && (!ispause)) {
			if (timecount > 0) {
				timecount = timecount - 1;
			} else {
				beginlevel(flevel);
			}
		}
		if (ontimercount > 0) {
			ontimercount = ontimercount - 1;
		}

		if (ontimercount <= 0) {
			drawall();
			invalidate();
			ontimercount = 10;
		}

		isontimering = false;
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub

		super.onDraw(canvas);
		canvas.drawBitmap(buff, 1, 1, p);
	}

	@Override
	protected void onLayout(boolean changed, int left, int top, int right,
			int bottom) {
		// TODO Auto-generated method stub
		super.onLayout(changed, left, top, right, bottom);
		init(right - left, bottom - top);
	}

	private void drawblank() {
		buff_Canvas.drawRect(client_r, p_client_r);
	}

	private void drawtext() {
		buff_Canvas.drawBitmap(bmp_btn, btn_r_1.left, btn_r_1.top, p);
		if (!isstart) {
			buff_Canvas.drawText("开始", btn_r_1.left + 14, btn_r_1.top + 14,
					p_text);
		} else {
			if (ispause) {
				buff_Canvas.drawText("继续", btn_r_1.left + 14, btn_r_1.top + 14,
						p_text);
				buff_Canvas.drawText(s_pause, left_client, top_client + 20,
						p_text);
			} else {
				buff_Canvas.drawText("暂停", btn_r_1.left + 14, btn_r_1.top + 14,
						p_text);
			}
		}

		buff_Canvas.drawRect(t_r, p_client_r);
		buff_Canvas.drawRect(t_r_2, p_client_r);
		buff_Canvas.drawText("级数:" + String.valueOf(flevel), t_r.left,
				t_r.bottom, p_text);
		buff_Canvas.drawText("分数:" + String.valueOf(ffen), t_r_2.left,
				t_r_2.bottom, p_text);
	}

	private void drawpross() {
		buff_Canvas.drawRect(pross_r, p_client_r);
		buff_Canvas.drawLine(pross_r.left, pross_r.top, pross_r.right,
				pross_r.top, p_pross_b);
		buff_Canvas.drawLine(pross_r.right, pross_r.top, pross_r.right,
				pross_r.bottom, p_pross_b);
		buff_Canvas.drawLine(pross_r.right, pross_r.bottom, pross_r.left,
				pross_r.bottom, p_pross_b);
		buff_Canvas.drawLine(pross_r.left, pross_r.bottom, pross_r.left,
				pross_r.top, p_pross_b);
		pross_r_2.right = pross_r_2.left + (pross_r.right - pross_r.left - 1)
				* timecount / timecountper_l;
		buff_Canvas.drawRect(pross_r_2, p_pross);

	}

	private void drawpoint() {

		Rect dst_r;
		Rect src_r = new Rect(0, 0, 0, 0);
		for (int i = 1; i <= fpointlist.fxcount; i++) {
			for (int j = 1; j <= fpointlist.fycount; j++) {
				if (fpointlist.getstat(i, j) < 0)
					continue;
				if (fpointlist.getimgidx(i, j) < 0)
					continue;
				dst_r = fpointlist.getrect(i, j);
				getbmp_pointRect(fpointlist.getimgidx(i, j),
						fpointlist.getstat(i, j), src_r);
				buff_Canvas.drawBitmap(bmp_point, src_r, dst_r, p);
				if (((hintpt_1.x == i) && (hintpt_1.y == j))
						|| ((hintpt_2.x == i) && (hintpt_2.y == j))) {
					buff_Canvas.drawBitmap(bmp_hint, dst_r.left + 10,
							dst_r.bottom - 40, p);
				}
			}
		}
	}

	private void drawall() {
		if (isdrawing) {
			return;
		}
		isdrawing = true;
		drawblank();
		drawtext();
		drawpross();
		if (isstart) {
			if (!ispause) {
				drawpoint();
				// drawPointForHint;
				// drawPointForMouse;
			} else {
				buff_Canvas.drawText("程序制作:H&J", left_client,
						bottom_client - 50, p_text);
				buff_Canvas.drawText("email:hjsoft2006@sohu.com", left_client,
						bottom_client - 30, p_text);
				buff_Canvas.drawText("QQ:253377572", left_client,
						bottom_client - 10, p_text);
			}
		} else {
			buff_Canvas.drawText("程序制作:H&J", left_client, bottom_client - 50,
					p_text);
			buff_Canvas.drawText("email:hjsoft2006@sohu.com", left_client,
					bottom_client - 30, p_text);
			buff_Canvas.drawText("QQ:253377572", left_client,
					bottom_client - 10, p_text);

		}
		if (display_moreInfo) {
			String s = String.valueOf(m_w) + "*" + String.valueOf(m_h);
			p.setARGB(255, 0, 0, 255);
			buff_Canvas.drawText(s, 1, 50, p_text);

			s = String.valueOf(System.currentTimeMillis());
			buff_Canvas.drawText(s, 1, 100, p_text);

		}
		isdrawing = false;
	}

	private void getbmp_pointRect(int idx, int stat, Rect r) {
		r.left = 0 + (point_w) * stat;
		r.right = r.left + point_w;
		r.top = 0 + (point_h) * idx;
		r.bottom = r.top + point_h;
	}

	private void init(int w, int h) {
		if (isInited) {
			return;
		}
		isInited = true;
		m_w = w;
		m_h = h;
		if (buff != null) {
			buff = null;
		}
		Bitmap b_ground;
		int topleft_w = 0;
		int topleft_h = 0;
		int topright_w = 0;
		int topright_h = 0;
		int bottomleft_w = 0;
		int bottomleft_h = 0;
		int bottomright_w = 0;
		int bottomright_h = 0;
		int btn_left = 0;
		Rect src = null;
		Rect dst = null;
		Config config = Config.RGB_565;
		buff = Bitmap.createBitmap(m_w, m_h, config);
		buff_Canvas = new Canvas(buff);
		b_ground = Bitmap.createBitmap(m_w, m_h, config);
		Canvas b_ground_Canvas = new Canvas(b_ground);

		Bitmap tmp = BitmapFactory.decodeResource(res, R.drawable.topleft);
		Paint tmppaint = new Paint();
		b_ground_Canvas.drawBitmap(tmp, 0, 0, tmppaint);
		topleft_w = tmp.getWidth();
		topleft_h = tmp.getHeight();
		btn_left = topleft_w - 1;
		tmp = null;
		tmp = BitmapFactory.decodeResource(res, R.drawable.topright);
		topright_w = tmp.getWidth();
		topright_h = tmp.getHeight();
		b_ground_Canvas.drawBitmap(tmp, m_w - topright_w, 0, tmppaint);
		btn_r_close = new Rect(m_w - topright_w + 18, 12,
				m_w - topright_w + 33, 28);

		tmp = null;
		tmp = BitmapFactory.decodeResource(res, R.drawable.top);
		src = new Rect(0, 0, tmp.getWidth(), tmp.getHeight());
		dst = new Rect(topleft_w, 0, m_w - topright_w, tmp.getHeight());
		b_ground_Canvas.drawBitmap(tmp, src, dst, tmppaint);
		top_client = tmp.getHeight();
		tmp = null;
		tmp = BitmapFactory.decodeResource(res, R.drawable.bottomleft);
		bottomleft_w = tmp.getWidth();
		bottomleft_h = tmp.getHeight();
		b_ground_Canvas.drawBitmap(tmp, 0, m_h - bottomleft_h, tmppaint);
		tmp = null;
		tmp = BitmapFactory.decodeResource(res, R.drawable.bottomright);
		bottomright_w = tmp.getWidth();
		bottomright_h = tmp.getHeight();
		b_ground_Canvas.drawBitmap(tmp, m_w - bottomright_w, m_h
				- bottomright_h, tmppaint);
		tmp = null;
		tmp = BitmapFactory.decodeResource(res, R.drawable.bottom);
		src = new Rect(0, 0, tmp.getWidth(), tmp.getHeight());
		dst = new Rect(bottomleft_w, m_h - tmp.getHeight(),
				m_w - bottomright_w, m_h);
		b_ground_Canvas.drawBitmap(tmp, src, dst, tmppaint);
		bottom_client = m_h - tmp.getHeight();
		tmp = null;
		tmp = BitmapFactory.decodeResource(res, R.drawable.left);
		src = new Rect(0, 0, tmp.getWidth(), tmp.getHeight());
		dst = new Rect(0, topleft_h, tmp.getWidth(), m_h - bottomleft_h);
		b_ground_Canvas.drawBitmap(tmp, src, dst, tmppaint);
		left_client = tmp.getWidth();
		tmp = null;
		tmp = BitmapFactory.decodeResource(res, R.drawable.right);
		src = new Rect(0, 0, tmp.getWidth(), tmp.getHeight());
		dst = new Rect(m_w - tmp.getWidth(), topright_h, m_w, m_h
				- bottomright_h);
		b_ground_Canvas.drawBitmap(tmp, src, dst, tmppaint);
		right_client = m_w - tmp.getWidth();

		tmp = null;
		bmp_btn = BitmapFactory.decodeResource(res, R.drawable.btn);
		tmp = BitmapFactory.decodeResource(res, R.drawable.btn);
		src = new Rect(0, 0, tmp.getWidth(), tmp.getHeight());
		btn_left = btn_left - 2;
		btn_r_1 = new Rect(btn_left, 15, btn_left + tmp.getWidth(),
				15 + tmp.getHeight());
		b_ground_Canvas.drawBitmap(tmp, src, btn_r_1, tmppaint);
		btn_left = btn_r_1.right;
		tmp = null;
		tmp = BitmapFactory.decodeResource(res, R.drawable.btn);
		src = new Rect(0, 0, tmp.getWidth(), tmp.getHeight());
		btn_left = btn_left - 1;
		btn_r_2 = new Rect(btn_left, 15, btn_left + tmp.getWidth(),
				15 + tmp.getHeight());
		b_ground_Canvas.drawBitmap(tmp, src, btn_r_2, tmppaint);

		client_r = new Rect(left_client, top_client, right_client,
				bottom_client);
		pross_r = new Rect(left_client - 1, top_client - 15,
				right_client - 140, top_client - 4);
		pross_r_2 = new Rect(pross_r.left + 1, pross_r.top + 1,
				pross_r.right - 1, pross_r.bottom);
		t_r = new Rect(pross_r.right + 5, pross_r.top - 2, pross_r.right + 55,
				pross_r.bottom);
		t_r_2 = new Rect(t_r.right + 5, pross_r.top - 2, right_client + 10,
				pross_r.bottom);

		point_w = 45;
		point_h = 51;

		int w_client = right_client - left_client;
		w_client = w_client / point_w;
		int h_client = bottom_client - top_client;
		h_client = h_client / point_h;
		if (w_client * h_client % 2 == 1) {
			h_client = h_client - 1;
		}

		fpointlist.init(w_client, h_client);
		pointlist_tmp = new Point[w_client * h_client];
		for (int i = 0; i < w_client * h_client; i++) {
			pointlist_tmp[i] = new Point(0, 0);
		}
		int x0 = left_client
				+ ((right_client - left_client) - (point_w * w_client)) / 2 + 1;
		int y0 = top_client
				+ ((bottom_client - top_client) - (point_h * h_client)) / 2 + 1;
		Rect r = new Rect(0, 0, 0, 0);
		for (int i = 1; i <= w_client; i++) {
			for (int j = 1; j <= h_client; j++) {
				r.top = y0 + (j - 1) * point_h;
				r.bottom = r.top + point_h;
				r.left = x0 + (i - 1) * point_w;
				r.right = r.left + point_w;
				fpointlist.setrect(i, j, r);
				fpointlist.setstat(i, j, -1);
				fpointlist.setimgidx(i, j, -1);
			}
		}
		Rect r_tmp;
		for (int i = 1; i <= w_client; i++) {
			r_tmp = fpointlist.getrect(i, 1);
			r.top = r_tmp.top - 1 - (r_tmp.bottom - r_tmp.top);
			r.bottom = r_tmp.top - 1;
			r.left = r_tmp.left;
			r.right = r_tmp.right;
			fpointlist.setrect(i, 0, r);
			fpointlist.setstat(i, 0, -1);
			fpointlist.setimgidx(i, 0, -1);

			r_tmp = fpointlist.getrect(i, h_client);
			r.bottom = r_tmp.bottom + 1 + (r_tmp.bottom - r_tmp.top);
			r.top = r_tmp.bottom + 1;
			r.left = r_tmp.left;
			r.right = r_tmp.right;
			fpointlist.setrect(i, h_client + 1, r);
			fpointlist.setstat(i, h_client + 1, -1);
			fpointlist.setimgidx(i, h_client + 1, -1);
		}
		for (int j = 0; j <= h_client + 1; j++) {
			r_tmp = fpointlist.getrect(1, j);
			r.left = r_tmp.left - 1 - (r_tmp.right - r_tmp.left);
			r.right = r_tmp.left - 1;
			r.top = r_tmp.top;
			r.bottom = r_tmp.bottom;
			fpointlist.setrect(0, j, r);
			fpointlist.setstat(0, j, -1);
			fpointlist.setimgidx(0, j, -1);

			r_tmp = fpointlist.getrect(w_client, j);
			r.right = r_tmp.right + 1 + (r_tmp.right - r_tmp.left);
			r.left = r_tmp.right + 1;
			r.top = r_tmp.top;
			r.bottom = r_tmp.bottom;
			fpointlist.setrect(w_client + 1, j, r);
			fpointlist.setstat(w_client + 1, j, -1);
			fpointlist.setimgidx(w_client + 1, j, -1);
		}

		bmp_point = BitmapFactory.decodeResource(res, R.drawable.point);
		bmp_hint = BitmapFactory.decodeResource(res, R.drawable.hint);
		buff_Canvas.drawBitmap(b_ground, 0, 0, tmppaint);
		buff_Canvas.drawText("提示", btn_r_2.left + 14, btn_r_2.top + 14, p_text);
		mRedrawHandler.nexttimer(500);
		b_ground = null;
		// System.gc();
	}

	private void setispause(boolean v) {
		ispause = v;
		if (ispause) {
			// RzBitBtn_pause.Caption := '继续';
		} else {
			// RzBitBtn_pause.Caption := '暂停';
		}

	}

	private void setimgidx(int imgidx) {
		int idx = random.nextInt(pointlist_tmp_count) % pointlist_tmp_count;
		fpointlist
				.setimgidx(pointlist_tmp[idx].x, pointlist_tmp[idx].y, imgidx);
		fpointlist.setstat(pointlist_tmp[idx].x, pointlist_tmp[idx].y, 0);
		fpointlist.setValue(pointlist_tmp[idx].x, pointlist_tmp[idx].y, true);
		for (int i = idx; i < pointlist_tmp_count - 1; i++) {
			pointlist_tmp[i].x = pointlist_tmp[i + 1].x;
			pointlist_tmp[i].y = pointlist_tmp[i + 1].y;
		}
		pointlist_tmp_count = pointlist_tmp_count - 1;
	}

	private void beginlevel(int l) {
		if (l >= 10) {
			flevel = 1;
		} else {
			flevel = l;
		}
		setispause(false);
		// mouesePoint := Point(-1, -1);
		// clearFHintPoint
		hintpt_1.x = -1;
		hintpt_1.y = -1;
		hintpt_2.x = -1;
		hintpt_2.y = -1;
		int idx = 0;
		for (int x = 1; x <= fpointlist.fxcount; x++) {
			for (int y = 1; y <= fpointlist.fycount; y++) {
				pointlist_tmp[idx].x = x;
				pointlist_tmp[idx].y = y;
				idx = idx + 1;
			}
		}
		pointlist_tmp_count = idx;
		int imgcount = 16 + flevel * 2;
		int imgidx = 0;
		for (int i = 1; i <= fpointlist.fxcount * fpointlist.fycount / 2; i++) {
			imgidx = random.nextInt(imgcount) % imgcount;
			setimgidx(imgidx);
			setimgidx(imgidx);
		}
		timecount = timecountper_l;
		isstart = true;
		drawall();
		invalidate();
	}

	private void changecolor() {
		for (int k = 0; k < 10; k++) {
			int idx = 0;
			for (int x = 1; x <= fpointlist.fxcount; x++) {
				for (int y = 1; y <= fpointlist.fycount; y++) {
					if ((fpointlist.getstat(x, y) >= 0)
							&& (fpointlist.getValue(x, y) == true)
							&& (fpointlist.getimgidx(x, y) >= 0)) {
						pointlist_tmp[idx].x = x;
						pointlist_tmp[idx].y = y;
						idx = idx + 1;
					}
				}
			}
			pointlist_tmp_count = idx;
			int imgcount = 16 + flevel * 2;
			int imgidx = 0;
			int c = pointlist_tmp_count / 2;
			for (int i = 1; i <= c; i++) {
				imgidx = random.nextInt(imgcount) % imgcount;
				setimgidx(imgidx);
				setimgidx(imgidx);
			}
			if (fpointlist.getPHint(hintpt_1, hintpt_2)) {
				break;
			}
		}
	}

	private void dobtn_1() {
		if (isstart) {
			if (ispause) {
				setispause(false);
			} else {
				setispause(true);
			}
		} else {
			beginlevel(1);

		}
	}

	private void dobtn_2() {
		if (ffen > 200) {
			ffen = ffen - 200;
		}
		if (!fpointlist.getPHint(hintpt_1, hintpt_2)) {
			hintpt_1.x = -1;
			hintpt_1.y = -1;
			hintpt_2.x = -1;
			hintpt_1.y = -1;
			changecolor();
			ontimercount = 1;
		} else {
			// changecolor();

			ontimercount = 1;
			if (timecount > 80) {
				timecount = timecount - 80;
			} else {
				timecount = 40;
			}

		}
	}

	private int changtor_x(int x, Rect r) {
		if (x < r.left + 2) {
			return r.left + 2;
		}
		if (x > r.right - 2) {
			return r.right - 2;
		}
		return x;
	}

	private int changtor_y(int y, Rect r) {
		if (y < r.top + 2) {
			return r.top + 2;
		}
		if (y > r.bottom - 2) {
			return r.bottom - 2;
		}
		return y;
	}

	private void drawlinerect(Point p1, Point p2) {

		Rect r1 = fpointlist.getrect(p1.x, p1.y);
		Rect r2 = fpointlist.getrect(p2.x, p2.y);
		int x1 = changtor_x((r1.left + r1.right) / 2, client_r);
		int y1 = changtor_y((r1.top + r1.bottom) / 2, client_r);
		int x2 = changtor_x((r2.left + r2.right) / 2, client_r);
		int y2 = changtor_y((r2.top + r2.bottom) / 2, client_r);

		buff_Canvas.drawLine(x1, y1, x2, y2, p_line);
		if (x1 == x2) {
			buff_Canvas.drawLine(x1 - 1, y1, x2 - 1, y2, p_line);
			buff_Canvas.drawLine(x1 + 1, y1, x2 + 1, y2, p_line);
		}
		if (y1 == y2) {
			buff_Canvas.drawLine(x1, y1 - 1, x2, y2 - 1, p_line);
			buff_Canvas.drawLine(x1, y1 + 1, x2, y2 + 1, p_line);
		}

	}

	private void dopoint() {

		if (fpointlist.getstat(mousept.x, mousept.y) < 0) {

			return;
		}

		fpointlist.findstat(1, lastpt);
		if (lastpt.x >= 0) {
			fpointlist.setstat(lastpt.x, lastpt.y, 0);
		}

		if (fpointlist.getstat(mousept.x, mousept.y) >= 0) {
			fpointlist.setstat(mousept.x, mousept.y, 1);
		}
		hintpt_1.x = -1;
		hintpt_1.y = -1;
		hintpt_2.x = -1;
		hintpt_2.y = -1;
		drawpoint();
		if ((lastpt.x >= 0)
				&& ((lastpt.x != mousept.x) || (lastpt.y != mousept.y))) {
			int lastimgidx = fpointlist.getimgidx(lastpt.x, lastpt.y);
			if ((fpointlist.getstat(mousept.x, mousept.y) >= 0)
					&& (fpointlist.getstat(lastpt.x, lastpt.y) >= 0)
					&& (lastimgidx >= 0)
					&& (lastimgidx == fpointlist
							.getimgidx(mousept.x, mousept.y))) {
				if (fpointlist
						.getpath(lastpt.x, lastpt.y, mousept.x, mousept.y)) {
					ffen = ffen + 100;
					if (timecount < timecountper_l - 40) {
						timecount = timecount + 40;
					} else {
						timecount = timecountper_l;
					}
					if (fpointlist.pcount == 0) {
						drawlinerect(lastpt, mousept);
					}
					if (fpointlist.pcount == 1) {
						drawlinerect(lastpt, fpointlist.pathlist[0]);
						drawlinerect(fpointlist.pathlist[0], mousept);

					}
					if (fpointlist.pcount == 2) {
						drawlinerect(lastpt, fpointlist.pathlist[0]);
						drawlinerect(fpointlist.pathlist[0],
								fpointlist.pathlist[1]);
						drawlinerect(fpointlist.pathlist[1], mousept);
					}

					fpointlist.setstat(lastpt.x, lastpt.y, -1);
					fpointlist.setstat(mousept.x, mousept.y, -1);
					fpointlist.setValue(lastpt.x, lastpt.y, false);
					fpointlist.setValue(mousept.x, mousept.y, false);
					ontimercount = 3;
					if (fpointlist.isallok()) {
						timecount = timecountper_l;
						beginlevel(flevel + 1);
					} else {
						fpointlist.changeplace(flevel);

					}
				}
			}
		}
		invalidate();
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		if (isonmousedown)
			return super.onTouchEvent(event);

		isontimering = true;
		isonmousedown = true;

		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			int ax = (int) event.getX();
			int ay = (int) event.getY();

			if (btn_r_close.contains(ax, ay)) {
				android.os.Process.killProcess(android.os.Process.myPid());
			}
			if (btn_r_1.contains(ax, ay)) {
				dobtn_1();
			}
			if (btn_r_2.contains(ax, ay)) {
				dobtn_2();
			}
			if (client_r.contains(ax, ay)) {
				fpointlist.mousetoxy(ax, ay, mousept);
				if (mousept.x >= 1) {
					dopoint();

				}
			}

		}
		isonmousedown = false;
		isontimering = false;
		return super.onTouchEvent(event);
	}
}

[代码运行效果截图]


连连看Android版 源代码下载

[源代码打包下载]




网友评论    (发表评论)

共11 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...