`

连连看小游戏控制台版

阅读更多

      看到师兄在玩连连看的游戏,于是乎突然想写一个自己的连连看游戏。我写的这个没有界面,只是一个控制台演示版,当然在这个基础上,用SWING或者Android的GridView扩充界面我想应该很容易吧。不再啰嗦赘述。

     连连看游戏关键还是算法问题,任何两个棋子之多经过两个直角的折角连通就可以消去。能消去的两个棋子分以下三种情况:

     1 可以用一条直线直接相连

     2  经过一个折角相连

     3  经过两个折角相连

     在设计可以考虑,采用递归的思想,3-->2,2--->1 ,我的程序仅仅使用了3--->2而对于2,我没用递归。下面分享我的代码,欢迎拍砖。

import java.awt.Point;
import java.util.Random;
import java.util.Scanner;


public class Test {
	private int row_len;//行数(开始和结束行值为辅助作用)
	private int colunm_len;//列数(开始和结束列值为辅助作用)
	private int a[][];//存储整个棋盘值
	private static final int NUMBER_SIZE=10;//图片的数目
	public static void main(String[] args) {
		Test t=new Test();
		Point p1 =new Point();
		Point p2 =new Point();
		t.showQiPan();
		while(true){
			t.getPoint(p1,p2);
			t.docheck(p1, p2);
			if(p1.x==0)
				break;
		}
	}
	/*
	 * 得到输入点的坐标
	 */
	private void getPoint(Point p1, Point p2) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("输入选择的两个点的坐标值(以空格隔开,以0 0 0 0 结束)");
		p1.x=scanner.nextInt();
		p1.y=scanner.nextInt();
		p2.x=scanner.nextInt();
		p2.y=scanner.nextInt();	
	}
	/*
	 * 初始化并显示棋盘
	 */
	public void showQiPan(){
		init();
		show_array();
	}
	/*
	 * 初始化
	 */
	public void init(){
		Scanner scanner=new Scanner(System.in);
		System.out.println("难度系数控制:");
		System.out.println("行数:");
		row_len=scanner.nextInt();
		System.out.println("列数");
		colunm_len=scanner.nextInt();
		if(colunm_len%2!=0){
			System.err.println("请保证输入的列号为偶数");
			System.exit(0);
		}
		a=new int[row_len][colunm_len];
		for(int j=0;j<colunm_len;j++){
			a[0][j]=0;
			a[row_len-1][j]=0;
		}
		for(int j=0;j<row_len;j++){
			a[j][0]=0;
			a[j][colunm_len-1]=0;
		}
		for(int i=1;i<row_len-1;i++)
			for(int j=1;j<colunm_len-1;j=j+2){
				int value=0;
				while(value==0){
					Random r=new Random();
					value=r.nextInt(NUMBER_SIZE);
				}				
				a[i][j]=value;
				a[i][j+1]=value;
			}
		/*
		 * 随机调换a[][]中的值
		 */
		for(int i=1;i<(row_len-2)*(colunm_len-2);i++){
				int index_x1=0;
				int index_y1=0;
				int index_x2=0;
				int index_y2=0;				
				Random r=new Random();
				while(index_x1==0){
					index_x1=r.nextInt(row_len-1);
				}	
				while(index_x2==0){
					index_x2=r.nextInt(row_len-1);
				}
				while(index_y1==0){
					index_y1=r.nextInt(colunm_len-1);
				}
				while(index_y2==0){
					index_y2=r.nextInt(colunm_len-1);
				}
				int tmp=a[index_x1][index_y1];
				a[index_x1][index_y1]=a[index_x2][index_y2];
				a[index_x2][index_y2]=tmp;
		}
	}
	/*
	 * 显示数组值
	 */
	public void show_array(){
		System.out.print("    ");
		for(int i=1;i<colunm_len-1;i++)
			System.out.print("*"+i+"*");
		System.out.print("\n");
		for(int i=0;i<row_len;i++){
			if(i!=0&&i!=row_len-1)
				System.out.print(i);
			else System.out.print(" ");
			for(int j=0;j<colunm_len;j++){
				System.out.print(" "+a[i][j]+" ");
			}				
			System.out.print("\n");
		}
	}
	/*
	 * 验证两点是否可以取消
	 */
	public void docheck(Point p1,Point p2){
		Point p3=new Point(-1,-1);
		if(a[p1.x][p1.y]==a[p2.x][p2.y]){
			if(isSameLine(p1, p2)||isSingleBrokenLine(p1, p2)||isDoubleBreakLine(p1, p2, p3)){
				a[p1.x][p1.y]=0;
				a[p2.x][p2.y]=0;
			}
			show_array();
		}else System.out.println("输入两点值不同,请重新选择");
		
	}
	/*
	 * 是否直接可以连通
	 */
	public boolean isSameLine(Point p1,Point p2){
		int i;
		if(p1.x==p2.x){
			int min_y=Math.min(p1.y, p2.y);
			int max_y=Math.max(p1.y, p2.y);
			for(i=min_y+1;i<max_y;i++)
				if(a[p1.x][i]!=0)
					return false;	
			if(i==max_y)
				return true;
		}else if(p1.y==p2.y){
			int min_x=Math.min(p1.x, p2.x);
			int max_x=Math.max(p1.x, p2.x);
			for(i=min_x+1;i<max_x;i++)
				if(a[i][p1.y]!=0)
					return false;	
			if(i==max_x)
				return true;
		}			
		return false;
	}
	/*
	 * 是否一个折线可以连通
	 */
	public boolean isSingleBrokenLine(Point p1,Point p2){
		
		int min_y=Math.min(p1.y, p2.y);
		int max_y=Math.max(p1.y, p2.y);
		int min_x=Math.min(p1.x, p2.x);
		int max_x=Math.max(p1.x, p2.x);
		
		Point tmp=new Point();
		tmp.x=min_x;
		tmp.y=min_y;
		if(p1.equals(tmp)||p2.equals(tmp)){
			
			boolean flag=true;
			if(a[min_x][max_y]!=0&&a[max_x][min_y]!=0)
				return false;
			else if(a[min_x][max_y]==0){
			   for(int i=min_y+1;i<max_y;i++){
				   if(a[min_x][i]!=0){
					   flag=false;
					   break;
				   }
				if(flag)
					for(int j=min_x+1;j<max_x;j++){
						if(a[j][max_y]!=0){
							flag=false;
							break;
						}							
					}
			   }
			   if(flag){
				  /* for(int j=min_x+1;j<max_x;j++){
						System.out.print(a[j][max_y]);
				   }	
				   System.out.println("\n");
				   for(int i=min_y+1;i<max_y;i++){
					   System.out.print(a[min_x][i]);
				   }
				   System.out.println("\n");*/
				   return true;
			   }
				  
			}
			else if(a[max_x][min_y]==0){
				 flag=true;
				 for(int i=min_y+1;i<max_y;i++){
					   if(a[max_x][i]!=0){
						   flag=false;
						   break;
					   }
					if(flag)
						for(int j=min_x+1;j<max_x;j++){
							if(a[j][min_y]!=0){
								flag=false;
								break;
							}							
						}
				   }
				   if(flag){
					  /* for(int j=min_x+1;j<max_x;j++){
							System.out.print(a[j][min_y]);
					   }	
					   System.out.println("\n");
					   for(int i=min_y+1;i<max_y;i++){
						   System.out.print(a[max_x][i]);
					   }
					   System.out.println("\n");*/
					   return true;
				   }
			}
		}else if(p1.x!=p2.x&&p1.y!=p2.y){
			
			boolean flag=true;
			if(a[min_x][min_y]!=0&&a[max_x][max_y]!=0)
				return false;
			else if(a[min_x][min_y]==0){
			   for(int i=min_y+1;i<max_y;i++){
				   if(a[min_x][i]!=0){
					   flag=false;
					   break;
				   }
				if(flag)
					for(int j=min_x+1;j<max_x;j++){
						if(a[j][min_y]!=0){
							flag=false;
							break;
						}							
					}
			   }
			   if(flag)
				   return true;
			}
			
			else if(a[max_x][max_y]==0){
				 flag=true;
				 for(int i=min_y+1;i<max_y;i++){
					   if(a[max_x][i]!=0){
						   flag=false;
						   break;
					   }
					if(flag)
						for(int j=min_x+1;j<max_x;j++){
							if(a[j][max_y]!=0){
								flag=false;
								break;
							}							
						}
				   }
				   if(flag)
					   return true;
			}	
		}	
		return false;
	}
	
	public boolean isDoubleBreakLine(Point p1,Point p2,Point p3){
		boolean flag=false;
		if(p1.y==p2.y){
			if(p1.x<p2.x) 
				flag=horizonVerify(p1,p2,p3);
			else
				flag=horizonVerify(p2,p1,p3);
		}else if(p1.x==p2.x){
			if(p1.y<p2.y) 
				flag=verticalVerify(p1,p2,p3);
			else
				flag=verticalVerify(p2,p1,p3);
		}else {
			if(p1.x<p2.x) 
				flag=horizonVerify(p1,p2,p3);
			else
				flag=horizonVerify(p2,p1,p3);
			if(!flag){
				if(p1.y<p2.y) 
					flag=verticalVerify(p1,p2,p3);
				else
					flag=verticalVerify(p2,p1,p3);
			}else 
				return true;		
		}
		return flag;
	}
	/*
	 * 水平判定 
	 */
	private boolean horizonVerify(Point p1,Point p2,Point p3){
		for(int i=0;i<colunm_len;i++){
			if(i!=p1.y&&a[p1.x][i]==0){
				Point p=new Point(p1.x,i);
				if(isSingleBrokenLine(p, p1)&&isSingleBrokenLine(p, p2)){
					p3.x=p1.x;
					p3.y=i;
					return true;
				}
			}
		}
		return false;
	}	
		
	/*
	 * 垂直判定
	 */
	private boolean verticalVerify(Point p1,Point p2,Point p3){
		for(int i=0;i<row_len;i++){
			if(i!=p1.x&&a[i][p1.y]==0){
				Point p=new Point(i,p1.y);
				if(isSingleBrokenLine(p, p1)&&isSingleBrokenLine(p, p2)){
					p3.x=p1.x;
					p3.y=i;
					return true;
				}
			}
		}
		return false;
	}
}
难度系数控制:
行数:
5
列数
6
    *1**2**3**4*
  0  0  0  0  0  0 
1 0  5  5  6  9  0 
2 0  1  6  1  4  0 
3 0  9  4  5  5  0 
  0  0  0  0  0  0 
输入选择的两个点的坐标值(以空格隔开,以0 0 0 0 结束)
1 1 1 2
    *1**2**3**4*
  0  0  0  0  0  0 
1 0  0  0  6  9  0 
2 0  1  6  1  4  0 
3 0  9  4  5  5  0 
  0  0  0  0  0  0 
输入选择的两个点的坐标值(以空格隔开,以0 0 0 0 结束)
2 2 1 3
    *1**2**3**4*
  0  0  0  0  0  0 
1 0  0  0  0  9  0 
2 0  1  0  1  4  0 
3 0  9  4  5  5  0 
  0  0  0  0  0  0 
输入选择的两个点的坐标值(以空格隔开,以0 0 0 0 结束)
2 1 2 3
    *1**2**3**4*
  0  0  0  0  0  0 
1 0  0  0  0  9  0 
2 0  0  0  0  4  0 
3 0  9  4  5  5  0 
  0  0  0  0  0  0 
输入选择的两个点的坐标值(以空格隔开,以0 0 0 0 结束)
3 1 1 4
    *1**2**3**4*
  0  0  0  0  0  0 
1 0  0  0  0  0  0 
2 0  0  0  0  4  0 
3 0  0  4  5  5  0 
  0  0  0  0  0  0 
输入选择的两个点的坐标值(以空格隔开,以0 0 0 0 结束)
3 2 2 4
    *1**2**3**4*
  0  0  0  0  0  0 
1 0  0  0  0  0  0 
2 0  0  0  0  0  0 
3 0  0  0  5  5  0 
  0  0  0  0  0  0 
输入选择的两个点的坐标值(以空格隔开,以0 0 0 0 结束)
3 3 3 4
    *1**2**3**4*
  0  0  0  0  0  0 
1 0  0  0  0  0  0 
2 0  0  0  0  0  0 
3 0  0  0  0  0  0 
  0  0  0  0  0  0 
输入选择的两个点的坐标值(以空格隔开,以0 0 0 0 结束)
0 0 0 0
    *1**2**3**4*
  0  0  0  0  0  0 
1 0  0  0  0  0  0 
2 0  0  0  0  0  0 
3 0  0  0  0  0  0 
  0  0  0  0  0  0 

  结果中第一行是行号,第一列是列号,输入是坐标值,如果输入点的坐标值相同并且满足上面的三个情况之一,既可以消去,

   并将值改为0.

   当然程序也有不足之处,当出现死局时,应当重新将剩余的棋子摆盘。你还可以加上提示功能,对棋盘中非零的坐标点进行遍    历。当棋盘值全为零时,既可以获胜。如果向更加完善,加一个计时器来倒计时也可以增加趣味性。


 

分享到:
评论

相关推荐

    连连看游戏JAVA版(纯记事本编写)

    连连看游戏JAVA版是针对初学者设计的一个编程项目,它完全使用记事本进行编写,展示了基础的JAVA编程技巧和游戏开发逻辑。这个项目对于学习JAVA语言和理解面向对象编程概念有着极大的帮助。 首先,我们要了解JAVA...

    vb开发的连连看游戏

    **VB(Visual Basic)开发的连连看游戏** VB(Visual Basic)是微软公司推出的一种基于事件驱动的编程语言,尤其适合初学者学习。它具有直观的界面设计工具和易读的代码结构,使得开发像连连看这样的游戏变得相对...

    VC++6.0小游戏之连连看源代码

    在本文中,我们将深入探讨如何使用Microsoft Visual C++ 6.0(简称VC++6.0)开发一款经典的小游戏——连连看。连连看是一款深受玩家喜爱的益智游戏,其核心玩法是寻找并消除两个相同的图案,直到消除所有图案为止。 ...

    java编写的连连看

    本篇文章将围绕“Java编写的连连看”这一主题,深入探讨如何利用Java语言开发一款动漫版的连连看游戏。 首先,我们需要了解Java语言的基础特性。Java是一种面向对象的编程语言,以其“一次编写,到处运行”的特性而...

    c语言连连看游戏源码.zip

    在本资源"C语言连连看游戏源码.zip"中,我们可以深入学习C语言编程技术以及游戏开发的基本原理。C语言作为一款强大的系统级编程语言,它的灵活性和效率使其成为编写小型游戏的理想选择。连连看游戏是一种广受欢迎的...

    连连看 C语言

    "连连看 C语言"是一个基于C语言开发的控制台应用程序,旨在为初学者提供一个学习C语言编程的实践项目。这个程序实现了经典游戏连连看的基本功能,包括图像表示、匹配逻辑以及用户交互,同时增加了背景音乐和鼠标操作...

    连连看

    总结,"连连看"游戏的开发涉及了VS的CLR窗口编程,利用.NET框架构建图形用户界面,并结合游戏设计原理实现了一款桌面版的连连看小游戏。开发过程中,开发者需要掌握C#或VB.NET编程,理解Windows Forms编程,以及具备...

    C# 连连看 源码

    在连连看项目中,C#用于编写控制台程序或Windows Forms应用,构建游戏逻辑和用户交互。 2. **Windows Forms**: Windows Forms是.NET框架的一部分,提供了一种创建桌面应用程序的方法。在这个连连看游戏中,开发者...

    连连看代码+资源,包含注册账号,计时,用户排名等等,以及可视化界面

    (1)绘制画图区域,加载图片文件,作为背景和消除图块,不同于使用单纯的控制台输出连连看矩阵,实现游戏的可视化,界面美观,交互方便。 (2)在菜单中提供注册和登录功能,便于保存用户的信息与成绩,对用户的...

    连连看源代码

    连连看是一款广受欢迎的休闲消除类游戏,其基本玩法是找到并消除两个相同的图案,直至所有图案都被消除。本项目提供了连连看的源代码,基于C++编程语言,并使用Visual Studio(VS)作为开发环境。下面我们将深入探讨...

    flash游戏课件论文

    这类课件能够通过拼图、连连看、找茬等小游戏,寓教于乐,让学生在轻松愉快的氛围中学习知识。 【设计方案】 设计平台:Flash游戏课件的开发通常基于Adobe Flash软件,这是一个强大的创作环境,支持创建交互式矢量...

    EasyX 2013霜降版(VC 绘图库,带 graphics.h 配置包)

    这个绘图库简化了 VC 下的绘图,可以在 VC 下像 TC 那么简单的绘图(其实比 TC 还简单强大)(内附范例),使初学者也能很容易的做出来贪吃蛇、俄罗斯方块、推箱子、连连看等经典小游戏。 【官方介绍】  许多学编程...

    java课程设计实战项目及课后练习

    gobang: 第1章 控制台五子棋 cal: 第2章 仿Windows计算器 viewer: 第3章 图片浏览器 ball: 第4章 桌面弹球 tetris: 第5章 俄罗斯方块 image: 第6章 仿Windows画图 linkgame: 第7章 单机连连看 ...

    生产实习register

    本项目“生产实习register”是一个基于Java编写的连连看游戏,旨在为初学者提供一个实践平台,帮助他们更好地理解和掌握Java编程的基础知识。 首先,我们来谈谈Java的基本概念。Java是由Sun Microsystems(现已被...

Global site tag (gtag.js) - Google Analytics