`
ronaldoLY
  • 浏览: 41978 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

连连看第一节课总结

 
阅读更多

多的不说,先上注释好的代码

主类:package 连连看V02;

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
/*
 * 
 * 连连看程序1.0
 * 主类
 * 本版本是从简单黑白棋版本过渡而来
 */



public class ChessUI extends JFrame implements Config{
	static{
		//创建一个随机数d对象
		java.util.Random random=new java.util.Random();
		//将随机数加到一个队列中去
		ArrayList<Integer> list=new ArrayList<Integer>();
		for(int i=0;i<CHESSES.length*CHESSES[0].length/2;i++){
			//随机一个数字,在1到10范围内
			int number=random.nextInt(10)+1;
			//向队列中加两次,保证每个数字出现的次数为偶数
			list.add(number);
			list.add(number);
		}
		/*
		 * 创建图片时的理解:
		 * 要求:1.图片总数比较是偶数,每一张图片的个数也必须是偶数
		 * 操作:将每一个类型的图片对应到队列的每一个数,CHESSES[i][j]表示的是在图形中的位置,CHESSES
		 * 二维数组可以指向一个数,通过这个数,然后通过CHESSES_image[][]数组将图片按顺序存进去,
		 * 这个1到10的随机数起到的是一个中间的过渡作用
		 */
		for(int i=0;i<CHESSES.length;i++){
			for(int j=0;j<CHESSES[i].length;j++){
				//取一个随机的队列中的下标
				int index=random.nextInt(list.size());
				int t=list.remove(index);//从队列中移除这个随机数
				//对二维数组中这个位置就行赋值,下一次循环时,代表这个t值的CHESSES[i][j]就取不到了,
				//因为这个t值已经从list中除去了
				CHESSES[i][j]=t;
				CHESSES_image[i][j]=new ImageIcon("src/我的连连看V01/image/"+t+".gif");	
			}	
		}
		
	}
	
	
	
	public static void main(String[] args){
		ChessUI UI=new ChessUI();
		UI.initChessUI();
		
	}
	
	
	/*
	 * 初始化界面的方法
	 */
	
	
	public void initChessUI(){
		this.setTitle("连连看v01");
		this.setLocation(200, 200);
		this.setSize(600,600);
		//设置背景色
		this.getContentPane().setBackground(new Color(134,224,13));
		this.setResizable(false);//设置不可更改大小
		this.setDefaultCloseOperation(3);
		this.setVisible(true);
		//setVisible之后就行抓取画布
		Graphics g=this.getGraphics();
		//给画布加上监听器
		ChessListener csl=new ChessListener(g,this);
		//这里直接写UI是不行的,因为UI只是主类中的,并不能在方法中调用,所以用this表示ChessUI的对象
		this.addMouseListener(csl);
		
		
	}
	
	
	
	/*
	 * 编写一个重绘的方法
	 * 
	 * 
	 */
	public void paint(Graphics g){
		super.paint(g);
		this.paintTable(g);
		this.paintImage(g);
	}
	
	//重写一个画棋盘的方法
	public void paintTable(Graphics g){
		//画棋盘
				//画横线
				for(int i=0;i<ROWS;i++){
					g.drawLine(X0, Y0+SIZE*i, X0+SIZE*(COLUMNS-1), Y0+SIZE*i);
				}
				//画竖线
				for(int j=0;j<COLUMNS;j++){
					g.drawLine(X0+SIZE*j,Y0,X0+SIZE*j,Y0+SIZE*(COLUMNS-1));
				}
	}
    
	
	
	
	//重写一个画图片,其实也相当于棋子的方法
	public void paintImage(Graphics g){
		//重绘图片
		for(int i=0;i<CHESSES.length;i++){
			for(int j=0;j<CHESSES[i].length;j++){
				//根据下标计算图片左上角的坐标
				int X1=X0+SIZE*j;
				int Y1=Y0+SIZE*i;
				//如果数组值不等于0,就进行重绘
				if(CHESSES[i][j]!=0){
					g.drawImage(CHESSES_image[i][j].getImage(), X1, Y1, SIZE, SIZE, null);
					
				}
				
			}
		}
	}	
}

 

监听器类:

 

package 连连看V02;


import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/*
 * 监听器
 * 
 * 
 * 
 * 
 */
public class ChessListener extends MouseAdapter implements Config{
	private Graphics g;
	private ChessUI UI;
	int count=0;//用一个计数器使每两次相邻的点击在一个"组"内,再进行判断
	int r1,c1,r2,c2;//两次点击的下标
	int number1,number2;
	
	
	
	//构造函数,传入Graphics g这个变量
	public ChessListener(Graphics g,ChessUI UI){
		this.g=g;
		this.UI=UI;
	}
    //监听鼠标点击的地方,就行放子
	//count的作用就是将这两次相邻的点击分为一组,避免了第二次点击的图形会和第三次点击的进行判断
	public void mouseReleased(MouseEvent e){
		int x=e.getX();
		int y=e.getY();
		if(count==0){
			//算出是图片在在哪个单元格内
			c1=(x-X0)/SIZE;
			r1=(y-Y0)/SIZE;
			number1=CHESSES[r1][c1];
			count++;
		}else{
			int c2=(x-X0)/SIZE;
			int r2=(y-Y0)/SIZE;
			number2=CHESSES[r2][c2];
		    count--;
		    //如果是相同的图片,不是自己本身,而且不为空,则再进行算法的判断
		    if(number1==number2&(r1!= r2 || c1 != c2)&number1!=0){
				

		    	//算法只要满足一个,就可以消去,消去就将对应位置的数组数据变为0
		    	if(Suanfa.checkRow(r1,c1,r2,c2)||Suanfa.checkCulumn(r1,c1,r2,c2)){
		   
		    	    CHESSES[r1][c1]=0;
		    		CHESSES[r2][c2]=0;
		    		// 刷新窗体,是个终极办法?但是要传入UI对象,所以要通过Listener()括号内传入UI
					javax.swing.SwingUtilities.updateComponentTreeUI(UI);
		    	}
		    }
		    
		    
		    
		    
		    
		}
		
		
		
		
	}
	
	
}

 

 

算法类:

 

package 连连看V02;
/*
 * 算法类:判断两个图片是否会被消掉
 * 有以下几种情况:
 * 1.同行;2同列;
 * 3.两个图片只用2条线连起来(4种情况):
 * 4.两个图片用3条线连起来(这个是最复杂的,8种情况):
 * 
 * 
 * 
 * 
 */

   
public class Suanfa implements Config{	
	
	//同行的情况,算法
	public static boolean checkRow(int r1,int c1,int r2,int c2){
	    //如果不同行,则返回false
		if(r1!=r2){
	    	return false;
	    }
		//同行时,那么这两个图片中间的都必须为空,否则返回false
		for(int i=Math.min(c1, c2)+1;i<Math.max(c1, c2);i++){
			if(CHESSES[r1][i]!=0){
				return false;
			}
		}
		//如果上面都成立则返回true
		
		return true;
	}
	
	
	//同列的情况,算法
	public static boolean checkCulumn(int r1,int c1,int r2,int c2){
		//同上
		if(c1!=c2){
			return false;
		}
		//同列时,两个图片的中间必须为空,否则返回false
		for(int j=Math.min(r1, r2)+1;j<Math.max(r1, r2);j++){
			if(CHESSES[j][c1]!=0){
				return false;
			}
		}
		//如果上面都成立则返回true
		
		return true;
	}
	

}

 

 

保存常用参数的接口:package 连连看V02;

import javax.swing.ImageIcon;

/*
 * 这是初级版本,画线只是为了方便标记位置
 * 到后面的版本会去掉的
 * 
 * 
 * 
 */



//定义为接口,里面的属性可以被全局使用
public interface Config {
     public final int X0=50,Y0=50;//左上角的那个点的坐标
     public final int ROWS=9,COLUMNS = 9;//定义横线和竖线的条数都为9
     public final int SIZE=60;//定义单元格的大小为60
     public final int CHESSSIZE=50;//定义棋子大小为50
     
     
     //设置标记“棋子”的数组
     public int[][] CHESSES=new int[ROWS-1][COLUMNS-1];
     //设置放置图片的数组,与“棋子”位置对应
     public ImageIcon[][] CHESSES_image=new ImageIcon[ROWS-1][COLUMNS-1];
	
	
	
}

 

 

       这是代码,注释都在里面,今天学到了一个比较实用的自我检测错误的方法:打印。刚开始写完第一编。发现图片可以显示,但是点击鼠标无反应。这样我就在监听器类中就行打印。最后发现在将对应的数组赋值为0的操作中没有打印,说明那个if条件判断出了点问题,if条件判断里面是算法中的方法,找到根源,果然发现是在for循环中,i,j的下限是从两个数最小值+1开始的,因为忘记+1,所以导致无法判断。

         下一步将对连连看进行改进吧:

        1.背景换个好看点的。

     2.算法写好,有许多种情况。

     3.在鼠标按下的时候图片需要换一种状态,加个边框或者其他,今天在讲导入图片时,我记得有一个方法在后面是可以加上鼠标点击后的图片的。可以查下

       上面是比较容易修改的。下面写几个扩展的,难一点吧

      4.在图形消去的同时,画出比较淡的线连起这两个图片(初步想法觉得是在消去图形的前面调用drawLine的方法,具体要画什么样的线,当然可以根据上面判断的到底是调用的哪个算法来进行画线)   这里面还存在一个问题,有些情况会同时满足几个算法,例如2个在一行的,并且中间没有图形的,需要一个优先选择,选择那个最简单的来画线(想了下,在如果可以想消之后,套用3个if,就可以解决优先级顺序问题)

   if(最简单的成立){

    用最简单的算法

}else if(次简单的成立){

     用次简单的方法

}else if{

   用最麻烦的方法

}

    5.消去的同时加个声音? 呵呵

      6.提示和自动消除,重排序,当没有可消的时候,进行处理(1.直接随机换位置。2.提示不可消,自己手动用重排序功能)

      7.倒计时,更高级的就是如果自己连的比较好,那么时间可以往上加。

      8.不一定是一出来就是矩形,可以各种图形,像QQ连连看,随机的

      9.是否可以弄个登陆界面,有几个选项,选择游戏难度,是否有声音,还有排行榜,或者可以选择用什么样的图形去排列图片

      扩展功能还可以有很多吧,不想再多说了。因为我QQ连连看也有7W多分。所以对这个功能的多样性还是比较了解的。就看能实现多少了。慢慢来吧

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 110 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics