- 浏览: 226565 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
itway:
很棒的小demo
nodejs 之模拟登录 -
zgc123123:
阿斯达是事实上事实上事实上
利用java反射机制,实现对类的私有变量和私有方法的访问 -
Jabbar2011:
...
httpwatch的在IE8版本的开启 -
铁拳无敌孙中山:
试了下新浪微博的登录, 没有成功啊登录后重定向public S ...
腾讯,新浪微博模拟登录爬取数据 程序 ,无偿奉献了(java版本) -
sunshinan2013:
请问腾讯微博 p_skey这个cookie怎么取?
腾讯,新浪微博模拟登录爬取数据 程序 ,无偿奉献了(java版本)
看到师兄在玩连连看的游戏,于是乎突然想写一个自己的连连看游戏。我写的这个没有界面,只是一个控制台演示版,当然在这个基础上,用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版本)
2013-05-28 17:03 15850要毕业了,看到好多人在研究新浪,腾讯微博的模拟登录获取数据 ... -
memcache 之windows下的使用
2013-03-07 10:55 5005memcached 是一个高效的分布式的内存对象缓存系统 , ... -
java构造方法与成员初始化分析
2012-11-14 10:11 1623package ibm; public class T ... -
浅谈servlet
2012-05-30 12:43 1432一个Servlet的生命周期如 ... -
flex页面初始化后,无法聚焦文本框
2012-05-28 19:54 1733转自 :博客园 Flex页面初始化creationCompl ... -
透过源码和实例学习CountDownLatch类
2012-04-23 10:03 1220最近在做一个程序的 时候遇到了这样的情况,在 主类中需要执行一 ... -
一套笔试小题
2012-04-17 16:56 990有这样一道笔试题目,请问str1,str2,str3,str4 ... -
java中的字符编码
2012-04-01 11:11 1627转自http://www.blogjava.net/z ... -
jdom解析xml抛出Invalid byte 2 of 2-byte UTF-8 sequence.异常的解决方法
2012-04-01 22:33 6399最近做一个项目的时候,老是报com.sun.org.apach ... -
httpclient中GzipDecompressingEntity 类的使用
2012-03-22 15:19 9577在用httpclient做网页提取的过程中,通过抓包工具发现了 ... -
log4j的简单学习
2012-03-22 15:19 9201.LOG4J的配置:采用log4j.properties文件 ... -
练练看小游戏SWING的实现
2011-12-04 17:09 1752前一段时间发了一个控制台版的练练看小游戏,后来同学说做一个有界 ... -
利用人人网去获取世界各地的大学信息
2011-12-01 22:02 1405最近登录校内在搜索一个大学老乡的时候,点击搜索时弹出一个框,这 ... -
由新水浒到htmlparser的一次运用
2011-09-12 21:56 1411最近在看新水浒,被108好汉的英雄气概所折服了,这里面的些许台 ... -
利用java反射机制,实现对类的私有变量和私有方法的访问
2011-09-08 22:05 16423记得有一句很有名的话:No reflection ,no fr ...
相关推荐
连连看游戏JAVA版是针对初学者设计的一个编程项目,它完全使用记事本进行编写,展示了基础的JAVA编程技巧和游戏开发逻辑。这个项目对于学习JAVA语言和理解面向对象编程概念有着极大的帮助。 首先,我们要了解JAVA...
**VB(Visual Basic)开发的连连看游戏** VB(Visual Basic)是微软公司推出的一种基于事件驱动的编程语言,尤其适合初学者学习。它具有直观的界面设计工具和易读的代码结构,使得开发像连连看这样的游戏变得相对...
在本文中,我们将深入探讨如何使用Microsoft Visual C++ 6.0(简称VC++6.0)开发一款经典的小游戏——连连看。连连看是一款深受玩家喜爱的益智游戏,其核心玩法是寻找并消除两个相同的图案,直到消除所有图案为止。 ...
本篇文章将围绕“Java编写的连连看”这一主题,深入探讨如何利用Java语言开发一款动漫版的连连看游戏。 首先,我们需要了解Java语言的基础特性。Java是一种面向对象的编程语言,以其“一次编写,到处运行”的特性而...
在本资源"C语言连连看游戏源码.zip"中,我们可以深入学习C语言编程技术以及游戏开发的基本原理。C语言作为一款强大的系统级编程语言,它的灵活性和效率使其成为编写小型游戏的理想选择。连连看游戏是一种广受欢迎的...
"连连看 C语言"是一个基于C语言开发的控制台应用程序,旨在为初学者提供一个学习C语言编程的实践项目。这个程序实现了经典游戏连连看的基本功能,包括图像表示、匹配逻辑以及用户交互,同时增加了背景音乐和鼠标操作...
总结,"连连看"游戏的开发涉及了VS的CLR窗口编程,利用.NET框架构建图形用户界面,并结合游戏设计原理实现了一款桌面版的连连看小游戏。开发过程中,开发者需要掌握C#或VB.NET编程,理解Windows Forms编程,以及具备...
在连连看项目中,C#用于编写控制台程序或Windows Forms应用,构建游戏逻辑和用户交互。 2. **Windows Forms**: Windows Forms是.NET框架的一部分,提供了一种创建桌面应用程序的方法。在这个连连看游戏中,开发者...
(1)绘制画图区域,加载图片文件,作为背景和消除图块,不同于使用单纯的控制台输出连连看矩阵,实现游戏的可视化,界面美观,交互方便。 (2)在菜单中提供注册和登录功能,便于保存用户的信息与成绩,对用户的...
连连看是一款广受欢迎的休闲消除类游戏,其基本玩法是找到并消除两个相同的图案,直至所有图案都被消除。本项目提供了连连看的源代码,基于C++编程语言,并使用Visual Studio(VS)作为开发环境。下面我们将深入探讨...
这类课件能够通过拼图、连连看、找茬等小游戏,寓教于乐,让学生在轻松愉快的氛围中学习知识。 【设计方案】 设计平台:Flash游戏课件的开发通常基于Adobe Flash软件,这是一个强大的创作环境,支持创建交互式矢量...
这个绘图库简化了 VC 下的绘图,可以在 VC 下像 TC 那么简单的绘图(其实比 TC 还简单强大)(内附范例),使初学者也能很容易的做出来贪吃蛇、俄罗斯方块、推箱子、连连看等经典小游戏。 【官方介绍】 许多学编程...
gobang: 第1章 控制台五子棋 cal: 第2章 仿Windows计算器 viewer: 第3章 图片浏览器 ball: 第4章 桌面弹球 tetris: 第5章 俄罗斯方块 image: 第6章 仿Windows画图 linkgame: 第7章 单机连连看 ...
本项目“生产实习register”是一个基于Java编写的连连看游戏,旨在为初学者提供一个实践平台,帮助他们更好地理解和掌握Java编程的基础知识。 首先,我们来谈谈Java的基本概念。Java是由Sun Microsystems(现已被...