0 0

连连看的算法用swing做的连连看谁能指点一下10

java 开发连连看主要用到是一个数组的运算。里面的判断中用到了。for  if 最为多

我听说。如果项目经理看到你的代码中if语句用得最,他就会叫你重写。说是思路的问题。谁能过来看看帮忙优化一下代码。或是有更好的方法。

 

在一下有一个已实现的游戏。希望大家看看。帮帮指点一下。 

 

public class Arithmetic {
	public static boolean opinion(Point p1, Point p2) {
		if (Main.map[p1.x][p1.y] == Main.map[p2.x][p2.y]) {
			if (horizontal(p1, p2) || vertical(p1, p2) || line2(p1, p2)||line3(p1,p2)) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}

	/**
	 * ||line2(p1,p2) 判断水平上的两点(一条直线的)
	 * 
	 * @param p1是弟一个点
	 * @param p2是弟二个点
	 * @return 反回是一个布尔如果是true 就是可以把这两点消除。
	 */
	public static boolean horizontal(Point p1, Point p2) {
		if (p1.x == p2.x) {
			Point temp = null;
			if (p1.y > p2.y) {
				temp = p1;
				p1 = p2;
				p2 = temp;
			}
			if (p1.y + 1 == p2.y) {// 在旁边
								return true;
			}
			for (int i = p1.y + 1; i < p2.y; i++) {// 在对面
				if (Main.map[p1.x][i] != -1) {
					return false;
				}
			}
						return true;
		}
		return false;
	}

	/**
	 * 判断垂直上的两点(一条直线的)
	 * 
	 * @param p1是弟一个点
	 * @param p2是弟二个点
	 * @return 反回是一个布尔如果是true 就是可以把这两点消除。
	 */
	public static  boolean vertical(Point p1, Point p2) {
		if (p1.y == p2.y) {
			Point temp = null;
			if (p1.x > p2.x) {
				temp = p1;
				p1 = p2;
				p2 = temp;
			}
			if (p1.x + 1 == p2.x) {//旁边
				
				return true;
			}
			for (int i = p1.x + 1; i < p2.x; i++) {
				if (Main.map[i][p1.y] != -1) {
					return false;
				}
			}
						return true;
		}
		return false;
	}

	/**
	 * 
	 * @param p1是弟一个点
	 * @param p2是弟二个点
	 * @return 反回是一个布尔如果是true 就是可以把这两点消除。 两条线的情况的下。有没有存在这两点
	 */
	public static boolean line2(Point p1, Point p2) {
		Point temp = null;
		if (p1.y > p2.y) {
			temp = p1;
			p1 = p2;
			p2 = temp;
		}
		
		Point p3, p4;
		if (Main.map[p2.x][p1.y] == -1) {// 左折角
			p3 = new Point(p2.x, p1.y);
			if(horizontal(p3, p2) && vertical(p1, p3)){
				
				return true;
			}
		}
		if (Main.map[p1.x][p2.y] == -1) {// 右折角
			p4 = new Point(p1.x, p2.y);
			if(horizontal(p1, p4) && vertical(p4, p2)){
								return true;
			}
		}
		return false;

	}

	/**
	 * 	 * @param p1是弟一个点
	 * @param p2是弟二个点
	 * @return 反回是一个布尔如果是true 就是可以把这两点消除。 三条线的情况的下。有没有存在这两点
	 */
	public static boolean line3(Point p1, Point p2) {
		Point temp = null;
		if (p1.y > p2.y) {
			temp = p1;
			p1 = p2;
			p2 = temp;
		}
		
		Point p3,p4;
		int i=0;
		
		if(p1.y==0){//判断边角的。p1在前面
			if(Main.map[p2.x][0]==-1){
				p3=new Point(p2.x,0);
				if(horizontal(p3,p2)){// p1在前面
					
					return true;
				}
			}
			 if(p1.y==p2.y&&p2.y==0){// p1---p2在前面
				 System.out.println("// p1---p2在前面");
					return true;
			}
		}	
		if(p2.y==Main.map[0].length-1){//p2在前面
						System.out.println(Main.map[p1.x][Main.map[0].length-1]);	
			if(Main.map[p1.x][Main.map[0].length-1]==-1){
					p3=new Point(p1.x,Main.map[0].length-1);
					if(horizontal(p3,p1)){
						
						return true;
					}
				}
				if(p2.y==Main.map[0].length-1&&p1.y==p2.y){
					
					return true;
				}
			
		}
		if(p1.x==0||p2.x==0){//p1---p2在上面
			if(p1.x==0){//p1---在上面
				if(Main.map[0][p2.y]==-1){
					p3=new Point(0,p2.y);
					if(vertical(p3,p2)){
						
						return true;
					}
				}
			} if(p2.x==0){//p2---在上面
				if(Main.map[0][p1.y]==-1){
					p3=new Point(0,p1.y);
					if(vertical(p3,p1)){
						
						return true;
					}
				}
			}if(p1.x==p2.x&&p2.x==0){////p1---p2都在上面
				
				return true;
			}
		}
		
		if(p1.x==Main.map.length-1||p2.x==Main.map.length-1){//p1--p2在下面
			if(p1.x==Main.map.length-1){//p1--在下面
				if(Main.map[Main.map.length-1][p2.y]==-1){
					p3=new Point(Main.map.length-1,p2.y);
					if(vertical(p2,p3)){
						
						return true;
					}
				}
			}
			if(p2.x==Main.map.length-1){//p2---在下面
				if(Main.map[Main.map.length-1][p1.y]==-1){
					p3=new Point(Main.map.length-1,p1.y);
					if(vertical(p1,p3)){
											return true;
					}
				}
			}
			if(p2.x==Main.map.length-1&&p1.x==p2.x){//p1--p2都在下面
				System.out.println("//p1--p2都在下面");
				return true;
			}
		}
		
		for(i=0;i<Main.map[0].length;i++){//第一种情况左到右
			if(i!=p1.y&&i!=p2.y){
				if(Main.map[p1.x][i]==-1&&Main.map[p2.x][i]==-1){
					p3=new Point(p1.x,i);
					p4=new Point(p2.x,i);
					if(line2(p1,p4)&&line2(p3,p2)){
						
						return true;
					}
				}
				
			}
		}
		
		for(i=0;i<Main.map.length;i++){//第二情况上到下
			if(i!=p1.x&&i!=p2.x){
				if(Main.map[i][p1.y]==-1&&Main.map[i][p2.y]==-1){
					p3=new Point(i,p1.y);
					p4=new Point(i,p2.y);
					if(line2(p1,p4)&&line2(p3,p2)){
						
						return true;
					}
				}
			}
		}
		
		for(i=p1.y+1;i<p2.y;i++){//水平  第三种情况p1 到 p2之间
			if(Main.map[p1.x][i]==-1&&Main.map[p2.x][p1.x]==-1){
				p3=new Point(p1.x,i);
				p4=new Point(p2.x,i);
				if(line2(p1,p4)&&line2(p3,p2)){
										return true;
				}
			}
		}
		
		for(i=p1.x+1;i<p2.x;i++){//垂直  第三种情况p1 到 p2之间
			if(Main.map[i][p1.y]==-1&&Main.map[i][p2.y]==-1){
				p3=new Point(i,p1.y);
				p4=new Point(i,p2.y);
				if(line2(p1,p4)&&line2(p3,p2)){
					
					return true;
				}
			}
		}
		
		//边界三折线
		if(Main.map[p1.x][0]==-1&&Main.map[p2.x][0]==-1){//第一种p1,p2到最左边界s
			p3=new Point(p1.x,0);p4=new Point(p2.x,0);
			if(horizontal(p1,p3)&&horizontal(p4,p2)){
				return true;
			}
		}
		
		if(Main.map[p1.x][Main.map[0].length-1]==-1&&Main.map[p2.x][Main.map[0].length-1]==-1){//第二种p1,p2到最右边界s
			p3=new Point(p1.x,Main.map[0].length-1);p4=new Point(p2.x,Main.map[0].length-1);
			if(horizontal(p1,p3)&&horizontal(p4,p2)){
				return true;
			}
		}
		
		if(Main.map[0][p1.y]==-1&&Main.map[0][p2.y]==-1){//第三种p1,p2到最上边界s
			p3=new Point(0,p1.y);p4=new Point(0,p2.y);
			if(vertical(p1,p3)&&vertical(p4,p2)){
				return true;
			}
		}
		
		if(Main.map[Main.map.length-1][p1.y]==-1&&Main.map[Main.map.length-1][p2.y]==-1){//第四种p1,p2到最下边界s
			p3=new Point(Main.map.length-1,p1.y);p4=new Point(Main.map.length-1,p2.y);
			if(vertical(p1,p3)&&vertical(p4,p2)){
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 地图初始化
	 * @param map
	 * @return
	 */
	public static int[][] initialize(int[][] map) {
		int[] _map = new int[(map.length) * (map[0].length)];
		int t = 0;
		/**
		 * 
		 * 生成地图
		 */
		for (int i = 0; i < _map.length - 3; i = i + 4) {
			for (int j = 0; j < 4; j++) {
				_map[i + j] = t;
			}
			t++;
		}
		/**
		 * 
		 * 打乱地图
		 */
		int temp = 0, a = 0, b = 0;
		for (int i = 0; i < _map.length; i++) {
			while (a == b) {
				a = (int) (Math.random() * _map.length);
				b = (int) (Math.random() * _map.length);
				temp = _map[a];
			}
			_map[a] = _map[b];
			_map[b] = temp;
			a = 0;
			b = 0;

		}
		/**
		 * 
		 * 
		 * 反回地图
		 * 
		 */
		t = 0;
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[0].length; j++) {
				map[i][j] = _map[t];
				t++;
			}
		}

		return map;
	}

 

2009年5月15日 10:57

1个答案 按时间排序 按投票排序

0 0

如果项目经理看到你的代码中if语句用得最
=====================================
项目经理不错嘛。。

2009年5月30日 13:00

相关推荐

Global site tag (gtag.js) - Google Analytics