`
叶紫夜子
  • 浏览: 10223 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

果蔬连连看

阅读更多
果蔬连连看

    像连连看、扫雷、五子棋等游戏从小就玩,我最爱玩的就是连连看了,闲下来就玩,连连看有很多种,像是宠物、石头、麻将、果蔬连连看等等,我最喜欢的还是果蔬连连看。当我们要做这个项目时,我第一个想做的就是连连看。
    其实这些游戏刚开始的做法都差不多,它们都是棋盘类游戏,就要先做一个界面,然后在画布上把棋盘画出来,有了前面的学习基础,这一步就很简单了。做这类游戏,最难的就是算法了。想连连看的算法,一定要事先想清楚,图片是怎样消掉的。还要清楚一点就是图片的消失只是一个表象,在幕后是操作数组。下面就是我做的果蔬连连看,一起看看吧。



    首先,要先做一个界面,然后将棋盘画在画布上。
    关于界面的做法,之前的几个项目中都有做过,要注意的是界面的布局设置,还有面板的放置位置。对于画棋盘,五子棋,黑白棋需要画出来,连连看其实没必要将棋盘显示的画出来,只需要将图片重绘在画布上即可。需要注意的是,重绘前一定要先获取画布。


1.定义配置信息的接口

/**
 * 
 * 配置信息的接口
 *
 */
public interface Config 
{
    // 左上角的点
     public static final int X0 = 10, Y0 = 30;   
    
    //简单
     public static final int ROWS0 = 7, COLUMNS0 = 9;   // 横线和竖线的条数
     int UI_WIDTH0 = 500;
    int UI_HEIGHT0 = 500; //初始界面大小

     //一般
     public static final int ROWS1 = 13, COLUMNS1 = 15;   // 横线和竖线的条数
     int UI_WIDTH1 = 800;
    int UI_HEIGHT1 = 800; //一般界面大小

     //困难
     public static final int ROWS2 = 13, COLUMNS2 = 19;   // 横线和竖线的条数
     int UI_WIDTH2 = 1000;
    int UI_HEIGHT2 = 800; //困难界面大小
	
     // 单元格大小
     public static final int SIZE = 50;

    // 图片大小
	public static final int CELL_SIZE = 50;
}



2.初始化中间的绘制面板

/**
 * 初始化中间绘制面板的方法
 */
    public DrawPanel()
     {
    	//设置大小
	this.setPreferredSize(new Dimension());
	    
         //设置背景色
	this.setBackground(new Color(0,255,255));
	   
	    	     
	//设置布局为流式居中对齐,间距为0
         FlowLayout flayout=new FlowLayout();
	this.setLayout(flayout);
	  
	//设置边框
	javax.swing.border.LineBorder border=new      javax.swing.border.LineBorder(Color.LIGHT_GRAY);
	this.setBorder(border);
      }


3.定义单元格和图片数组,并将图片放到数组中


 /**
 * 定义初始化数据的方法
 * @param rows 线的行数
 * @param columns 线的列数
 */
   
 public static void initData(int rows, int columns)
 {
   		
     //定义单元格和图片数组
      CELL = new int[rows + 1][columns + 1];
     CELL_IMG = new ImageIcon[rows - 1][columns - 1];
		
     // 创建随机数对象
      java.util.Random rd = new java.util.Random();

     //创建Integer型队列
      ArrayList<Integer> list = new ArrayList<Integer>();
		
//****************将元素加到队列中******************//
	    
     for (int i = 0; i < CELL_IMG.length * CELL_IMG[0].length / 2; i++) 
	{
			
	   // 随机一个数字
	   int num = rd.nextInt(30) + 1;
			
	   // 往队列中加两次,保证每个数字出现的次数都是偶数次
	   list.add(num);
	   list.add(num);
			
	}
       
     //将图片添加到图片数组中
      for (int i = 1; i < CELL.length - 1; i++) 
	{
	   for (int j = 1; j < CELL[i].length - 1; j++) 
	      {
	         // 取一个随机的下标
		int index = rd.nextInt(list.size());
				
		// 移除被随机到的下标对应的元素
		int t = list.remove(index);
		CELL[i][j] = t;
		CELL_IMG[i - 1][j - 1] = new ImageIcon("images/draw" + t + ".jpg");
						
	      }
	}
		
	//System.out.println(" "+CELL.length);
	}


4.重写paint()方法,将图片绘制到画布上


/**
 * 重写paint方法
 */
 public void paint(Graphics g)
  {
  	    
      //调用父类中的 paint方法
       super.paint(g);
  		
      if(!(DrawPanel.CELL==null))
  	    {
  		// 重绘图片
  		for (int i = 1; i < DrawPanel.CELL.length; i++) 
  		   {
  		      for (int j = 0; j <DrawPanel. CELL[i].length; j++) 
  			{

  			     // 根据下标计算每个单元格左上角的坐标
  			      int x1 = SIZE * j;
  			     int y1 = SIZE * i;

  			     if (DrawPanel.CELL[i][j] != 0) 
  			       {
  			          //如果单元格为空,画图片
  				 g.drawImage(DrawPanel.CELL_IMG[i-1][j-1].getImage(), x1, y1, SIZE,SIZE, null);

                                   }
  		        }
  		}
  	     }

  }




    然后就是给画布添加监听器,实现监听,当鼠标点击画布上的图标时,就会有相应的动作。


1.画布监听器要继承鼠标适配器

public class DrawListener extends MouseAdapter implements Config 



2.在鼠标点击式的方法中,获取鼠标点击处的坐标
3.计算该坐标在哪个单元格中
4.根据单元格,操作图片数组,即消去图片

/**
 * 鼠标点击时的方法
 */
public void mouseReleased(MouseEvent e)
    {
         //获得第一次点击的坐标
           int x=e.getX();
	int y=e.getY();
		
	if(count==0)
	{
	     //判断鼠标点击的位置是在哪个单元格中
	      r1=(y-Y0)/SIZE;
	     c1=(x-X0)/SIZE;
			
	     num1=DrawPanel.CELL[r1][c1];   
	     count++;
	}
	else
	{
	    r2=(y-Y0)/SIZE;
	    c2=(x-X0)/SIZE;
	    num2=DrawPanel.CELL[r2][c2];     
	    count--;
				
	//如果不是自己本身,是相同的图片,且不为空
	if((r1!=r2||c1!=c2)&&num1==num2&&num1!=0)
	{  
	    //如果某一个方法返回true
	    if(SuanFa.checkRow(r1,c1,r2,c2)
							||SuanFa.checkCulumn(r1,c1,r2,c2)||SuanFa.checkOne(r1, c1, r2, c2)
		 					||SuanFa.checkTwo1(r1, c1, r2, c2)||SuanFa.checkTwo2(r1, c1, r2, c2))
		{
						
		   //消去点击的图片
		    DrawPanel.CELL[r1][c1]=0;
		   DrawPanel.CELL[r2][c2]=0;
						
		   //刷新窗体
		   javax.swing.SwingUtilities.updateComponentTreeUI(fu);
		}
	  }
      }
		
  }



    最后就是算法了,关于算法,要先自己画图看看到底有几种消去图片的方式,搞清楚怎样才能消去,同行,同列,不同行,不同列,边界怎样消去等等,注意要用循环判断该单元格是否为空,只要途中遇到一个不为空,就不能连。

1.同行
/**
*同行的算法
*/
public static boolean checkRow(int r1,int c1,int r2,int c2)
	 {
		if(r1!=	r2)
		 {
			//如果不是同行,返回false
			return false;
		 }
		
		//如果是同行
		for(int i=Math.min(c1,c2)+1;i<Math.max(c1,c2);i++)
			{
				if(DrawPanel.CELL[r1][i]!=0)
				{
					//只要中途碰到一个不为空,就不能连
					return false;
				}
			}
			
			//如果该循环执行完,表示可以连
			return true;
		}

2.同列


/**
 * 判断同列可否相消的方法
 * @param r1点击的第一个点所在格子的下标
 * @param c1点击的第一个点所在格子的下标
 * @param r2点击的第二个点所在格子的下标
 * @param c2点击的第二个点所在格子的下标
 * @return  false或true
 */
public static boolean checkCulumn(int r1, int c1, int r2, int c2) 
	{

		if (c1 != c2) 
		{
			//如果不是同列,返回false
			return false;
		}
			
		//如果是同列
		for (int j = Math.min(r1, r2)+1; j < Math.max(r1, r2); j++) 
		{
			if (DrawPanel.CELL[j][c1] != 0) 
				{
				    //只要中途碰到一个不为空,就不能连
					return false;
				}
		}
			
			
			return true;
}

3.一个拐点

/**
* 有一个拐点的方法
* @param r1点击的第一个点所在格子的下标
* @param c1点击的第一个点所在格子的下标
* @param r2点击的第二个点所在格子的下标
* @param c2点击的第二个点所在格子的下标
* @return  false或true
*/
public static boolean checkOne(int r1, int c1, int r2, int c2) 
	{

	    if (DrawPanel.CELL[r1][c2] == 0 && checkRow(r1, c1, r1, c2)
				&& checkCulumn(r1, c2, r2, c2)) 
	    {
	    	//若果拐点为空,且连线上都为空  ,返回true
			
			return true;
        
		}
		
		if (DrawPanel.CELL[r2][c1] == 0 && checkRow(r2, c2, r2, c1)
				&& checkCulumn(r1, c1, r2, c1)) 
		{
			//若果拐点为空,且连线上都为空  ,返回true
		}
                  //否 则,返回false 
		return false;
	}

4.两个拐点
/**
* 有两个拐点的方法
* @param r1点击的第一个点所在格子的下标
* @param c1点击的第一个点所在格子的下标
* @param r2点击的第二个点所在格子的下标
* @param c2点击的第二个点所在格子的下标
* return false或true
*/
	
public static boolean checkTwo1(int r1, int c1, int r2, int c2) 
	{
		for (int i = 0; i < DrawPanel.CELL[0].length; i++) 
		{
			if (DrawPanel.CELL[r1][i] == 0 && DrawPanel.CELL[r2][i] == 0
					&& checkRow(r1, c1, r1, i) && checkRow(r2, c2, r2, i)
					&& checkCulumn(r1, i, r2, i)) 
			 {
				//若果拐点为空,且连线上都为空  ,返回true
				
				
				
				
				return true;
			 }
			
		}
		//否 则,返回false 
			return false;
	}	
    public static  boolean checkTwo2(int r1, int c1, int r2, int c2) 
     {
	     for(int j=0;j<DrawPanel.CELL.length;j++)
 
		   {
			  if(DrawPanel.CELL[j][c1]==0&&DrawPanel.CELL[j][c2]==0
					&&checkCulumn(r1,c1,j,c1)&&checkCulumn(r2,c2,j,c2)
					&& checkRow(j, c1, j, c2))
			 {
				//若果拐点为空,且连线上都为空  ,返回true
				
				return true;
			 }
		}
		//否 则,返回false 
		return false;
  }


整个项目中,最应该注意的问题就是传参的问题,像是在添加监听器是,一定要将画布传入。还有就是要注意单元格数组和图片数组的操作,数组初始化,当点击图片可以连接时,数组的值设为空等等。
分享到:
评论

相关推荐

    Android游戏源码-水果连连看源码

    【Android游戏源码-水果连连看源码】是一款适合安卓游戏开发初学者研究学习的开源项目,它提供了从基础到实践的宝贵经验。通过分析这个源码,我们可以深入理解Android游戏开发的核心技术,并掌握如何在Android平台上...

    android版水果连连看

    android版水果连连看小游戏,里面有源码,游戏分关数,每关的水果都是随机生成,适合于android课程设计,毕业设计等,当然看源码学习也可以的哦。

    连连看素材(水果连连看).zip

    《水果连连看》是一款深受大众喜爱的经典休闲游戏,它的素材制作是通过编程工具Scratch实现的。Scratch是由麻省理工学院(MIT)媒体实验室终身幼儿园团队开发的一款面向儿童的图形化编程工具,旨在帮助孩子们学习...

    水果连连看Android游戏源码

    《Android水果连连看游戏源码解析》 在移动设备领域,Android系统凭借其开放性和丰富的应用生态,吸引了众多开发者和玩家。"水果连连看"是一款深受用户喜爱的经典休闲游戏,将其移植到Android平台上,无疑为游戏...

    android 水果连连看游戏代码

    《Android 水果连连看游戏代码解析》 在Android平台上开发一款水果连连看游戏,对于初学者来说,是一个极好的实践项目。这个游戏不仅能够帮助开发者掌握基本的Android编程技能,还能深入理解游戏逻辑和用户交互设计...

    水果连连看闯关源码

    《水果连连看闯关源码解析》 "水果连连看"是一款广受欢迎的休闲益智游戏,其核心玩法是通过消除相同图案的水果,达到指定条件以过关。在这个专题中,我们将深入探讨“水果连连看闯关源码”,揭秘这款小游戏背后的...

    水果连连看源代码

    《水果连连看源代码解析与学习指南》 “水果连连看”是一款深受广大玩家喜爱的休闲益智游戏,尤其在大学生群体中具有很高的普及度,是很多初学者接触编程、理解游戏开发的入门实例。本篇文章将围绕“水果连连看源...

    精致的水果连连看源码

    《Android水果连连看源码详解》 在移动设备上,休闲益智类游戏深受用户喜爱,其中“连连看”作为一款经典游戏,以其简单的规则和趣味性吸引了大量玩家。本篇将详细介绍一个基于Android平台的水果连连看源码,帮助...

    iphone水果连连看源码

    《iPhone水果连连看源码解析》 在移动开发领域,iPhone平台因其优秀的用户体验和庞大的用户基础,一直是开发者的重要战场。本篇文章将深入探讨一款名为“FruitLink水果连连看”的游戏源码,帮助读者理解iOS应用开发...

    安卓水果连连看源码

    《安卓水果连连看源码解析与学习指南》 在安卓平台上,开发一款游戏是许多初学者踏入编程世界的重要步骤。本篇文章将详细解读一款名为“安卓水果连连看”的源码,帮助你理解安卓游戏开发的基本原理,提升你的编程...

    ios版本水果连连看

    《iOS版水果连连看》是一款基于苹果iOS平台的休闲益智游戏,深受用户喜爱。它以其独特的水果元素、简单的操作方式和丰富的关卡设计,为玩家带来无尽的乐趣。源码是开发人员学习和理解iOS游戏开发的重要参考资料,...

    C#水果连连看__小游戏

    《C#实现的水果连连看小游戏详解》 在IT领域,开发小游戏是许多程序员学习新语言或技术时的常见实践。本次我们关注的是一个由C#编程语言编写的水果连连看小游戏。C#,作为微软推出的面向对象的编程语言,以其高效、...

    小巧连连看 (C#开发,包括明星连连、水果连连看等)

    《小巧连连看》是一款基于C#编程语言开发的休闲益智游戏,包含了多个主题版本,如明星连连看、水果连连看以及鲜花连连看等。这款游戏的设计理念在于提供一个轻松愉快的游戏环境,锻炼玩家的观察力和反应速度。下面将...

    android水果连连看源码

    《Android水果连连看源码解析》 在移动应用开发领域,Android平台因其开源特性与丰富的功能,成为开发者们的热门选择。对于初学者来说,通过分析实际项目源码是提升技能的有效途径。今天我们将深入探讨一个名为...

    android实现游戏水果连连看

    《Android实现游戏“水果连连看”详解》 在移动设备领域,Android系统以其开源和高度定制性成为了开发者的重要平台,而游戏开发则是Android应用生态中的重要组成部分。本篇文章将深入探讨如何在Android环境下实现一...

    android水果连连看源代码

    《Android水果连连看源代码解析》 在移动设备上,Android平台因其开源和广泛的设备支持,成为了开发者们的重要战场。而“连连看”作为一款深受用户喜爱的经典休闲游戏,其在Android上的实现自然也是众多开发者关注...

    水果连连看

    《水果连连看》是一款经典的休闲益智游戏,深受玩家喜爱。该项目的核心是通过连连看的玩法,让玩家在视觉上识别各种水果图案,通过消除相同的水果来达成目标。在这个项目中,我们主要会探讨以下几个与IT相关的知识点...

    水果连连看文档android

    水果连连看文档android.doc

    --水果连连看.zip--

    《水果连连看》是一款经典的休闲益智游戏,其核心玩法是通过寻找并消除两个相同图案的水果,直至清空所有方块。在这个项目中,我们分析的是它的源代码实现,这将涉及到计算机图形学、算法设计、用户界面设计等多个IT...

Global site tag (gtag.js) - Google Analytics