java连连看含代码Word文件下载.docx
- 文档编号:8215450
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:15
- 大小:404.75KB
java连连看含代码Word文件下载.docx
《java连连看含代码Word文件下载.docx》由会员分享,可在线阅读,更多相关《java连连看含代码Word文件下载.docx(15页珍藏版)》请在冰点文库上搜索。
把Settings.java放入一层文件加的\cn\elva文件夹下(如:
\lianliankan\cn\elva)。
把ArrayPoint.java和Map.java放入文件夹的\cn\elva\model文件夹中。
在文件夹中建立一个叫Resource的文件夹存放图片。
运行JCreatorPro编译JAVA程序,生成相应的字节码文件(.class)文件。
然后,用java解释器运行主类:
\lianliankan\javaMainFrame。
功能模块图如上。
程序通过对用户点击的图片进行判断,确定两张图片的路径,判断两张图片是否相同,是否可以相连,如果可以相连并且两张图片相同,那么消除两张图片,否则认为用户没点图片,重新选择。
系统会在用户开始的时候进行计时,如果用户在限定时间内没有完成(还有图片枚消除),那么系统提示用户失败信息,反之(图片全部消除),提示用户胜利信息。
在游戏过程中,用户可以使用炸弹,如果炸弹存在(炸弹数部为零)那么消除2块同样的图片,否则提示用户没有炸弹。
定义程序的必要变量的初值使每回开始新游戏,这些初值都会还原:
行数:
publicstaticfinalintROWS=8;
列数:
publicstaticfinalintCOLUMNS=8;
图片后缀名:
publicstaticfinalStringRELEX="
.gif"
;
每局所花时间(秒):
publicstaticfinalintPERTIME=600;
判断的时间间隔:
publicstaticfinalintPER=1;
炸弹的使用次数:
publicstaticfinalintBOMBCOUNT=3;
把每一个图片位置都定义为一个按钮,这样在鼠标点击的时候就能确定用户点击的是哪张图片。
publicclassChessButtonextendsJButton
{
//按钮所对应的数组中的值和位置,用ArrayPoint结构来表示
protectedArrayPointpoint=null;
/**
*构造函数,指定按钮所代表的值和位置
*@paramrow所在行号
*@paramcol所在列号
*@paramvalue代表的值
*/
publicChessButton(introw,intcol,intvalue)
{this(newArrayPoint(row,col,value));
}
/**
*构造函数
*@parampoint值和位置的数据结构
publicChessButton(ArrayPointpoint)
{this.point=point;
Stringname="
Resource/"
+point.getValue()+Settings.RELEX;
URLurl=ChessButton.class.getResource(name);
//System.out.println(url);
ImageIconicon=newImageIcon(url);
this.setIcon(icon);
}
*构造函数,使用默认值
publicChessButton()
{this(newArrayPoint(0,0,0));
*返回当前按钮代表的位置和值
*@returnpoint
publicArrayPointgetPoint()
{returnpoint;
*设置此按钮所代表的位置和值
*@parampoint要设置的point
publicvoidsetPoint(ArrayPointpoint)
}}
设计算法排列图片,设计算法判断两张图片是否可以相连
/*@authorAXL数据部分,一个内部数组来表示页面上的具体情况/
publicclassMap
{publicstaticintLEFTCOUNT=Settings.ROWS*Settings.COLUMNS;
//让其最外层的数据不显示,可以解决边框消除不掉的情况
privateint[][]map=newint[Settings.ROWS+2][Settings.COLUMNS+2];
//privateArrayPointprePoint;
//privateArrayPointcurrPoint;
//出现的不同图片个数
privateintmaxKinds=4;
publicMap()
{init();
publicint[][]getMap()
{returnmap;
/*实现了二维数组的产生/
privatevoidinit()
{int[]tempArr=newint[Settings.ROWS*Settings.COLUMNS];
intlen=tempArr.length;
//根据图片的种类数来确定数组大小,如有64张图片,每四个为一样的,则需要图片数为64/4=16
for(inti=0;
i<
len/maxKinds;
i++)
{tempArr[i*4]=i+1;
tempArr[i*4+1]=i+1;
tempArr[i*4+2]=i+1;
tempArr[i*4+3]=i+1;
//打乱一维数组内数据的排列
random(tempArr);
//填充到二维数组中
for(inti=1;
Settings.ROWS+1;
{for(intj=1;
j<
Settings.COLUMNS+1;
j++)
{this.map[i][j]=tempArr[(i-1)*Settings.COLUMNS
+(j-1)];
}}}
/*将数组进行重排,使其成无序状态
*@paramarray要重排的数组/
privatevoidrandom(int[]array)
{Randomrandom=newRandom();
intlen=array.length;
for(inti=len;
i>
0;
i--)
{intj=random.nextInt(i);
inttemp=array[i-1];
array[i-1]=array[j];
array[j]=temp;
/*判断是否在一条直线上,这里不去比较两者值是否相等,主要用于后面两个拐点的情况
*@paramp1之前的点
*@paramp2当前所点的点
*@returntrue相通,false不通/
publicbooleanoneLineWithoutValue(ArrayPointp1,ArrayPointp2)
{if(horizonMatch(p1,p2))
{returntrue;
elseif(verticalMatch(p1,p2))
returnfalse;
/*判断是否在一条直线上,其中包括了垂直和水平两种情况
publicbooleanoneLine(ArrayPointp1,ArrayPointp2)
{if(p1.value!
=p2.value)
if(oneLineWithoutValue(p1,p2))
returntrue;
/*竖线上的判断
*@paramp1之前的点
*@paramp2当前所点的点
*@returntrue相通,false不通/
publicbooleanverticalMatch(ArrayPointp1,ArrayPointp2)
{if(p1.j!
=p2.j)
returnfalse;
if(p1.i>
p2.i)
{ArrayPointtemp=null;
temp=p1;
p1=p2;
p2=temp;
//之间的相隔的棋子数
intspaceCount=p2.i-p1.i;
//如果相邻,直接消除
if(spaceCount==1&
&
p1.value==p2.value)
for(inti=p1.i+1;
p2.i;
{ArrayPointpoint=newArrayPoint(i,p1.j,map[i][p1.j]);
//只要其值为0就表示没有棋子
if(point.value!
=0)
returnfalse;
returntrue;
/*水平方向的判断
*@paramp1之前所选的点
*@paramp2当前选中的点
publicbooleanhorizonMatch(ArrayPointp1,ArrayPointp2)
{//如果行行号不等的话,刚不是水平方向的结果
if(p1.i!
=p2.i)
if(p1.j>
p2.j)
//水平相隔棋子数
intspaceCount=p2.j-p1.j;
if(spaceCount==1&
for(inti=p1.j+1;
p2.j;
{ArrayPointp=newArrayPoint(p1.i,i,map[p1.i][i]);
if(p.value!
/*判断前后点击的是不是同一个点,i,j相同就是一个点
*@paramp1之前所选的点
*@paramp2当前选中的点
*@returntrue同一个点,false不同点/
privatebooleanisSameOne(ArrayPointp1,ArrayPointp2)
{if(p1.i==p2.i&
p1.j==p2.j)
else
/*带一个拐点的情况,但不比较值的大小是否相等
*@paramp1初始点
*@paramp2结束点
*@returntrue相通,false不通*/
publicbooleanoneConnerWithoutValue(ArrayPointp1,ArrayPointp2)
{//获取P1水平方向的拐点
ArrayPointp1H=newArrayPoint(p1.i,p2.j,map[p1.i][p2.j]);
//获取P1垂直方向的拐点
ArrayPointp1V=newArrayPoint(p2.i,p1.j,map[p2.i][p1.j]);
if(horizonMatch(p1,p1H)&
(p1H.value==0))
{if(this.verticalMatch(p1H,p2))
returntrue;
if(verticalMatch(p1,p1V)&
(p1V.value==0))
{if(horizonMatch(p1V,p2))
/*带一个拐点的情况
*@paramp1初始点
publicbooleanoneConner(ArrayPointp1,ArrayPointp2)
{//获取P1水平方向的拐点
if(p1.value!
if(oneConnerWithoutValue(p1,p2))
/*带两个拐点的情况,分四个方向走,上下左右,只要一个方向通过,即通过
*@paramp2结束点
publicbooleantwoConner(ArrayPointp1,ArrayPointp2)
{if(p1.value!
intcount=0;
ArrayPointtemp=null;
//左
for(intcol=p1.j-1;
col>
=0;
col--)
{temp=newArrayPoint(p1.i,col,map[p1.i][col]);
if((temp.value==0)&
this.oneLineWithoutValue(p1,temp))
{if(this.oneConnerWithoutValue(temp,p2))
returntrue;
else
break;
右、上和下的方法一样,代码相似。
在此不给出方法。
/*判断两点是否匹配,包括直线,一个拐点,两个拐点三种情况
*@returntrue相通,false不通*/
publicbooleanmatch(ArrayPointp1,ArrayPointp2)
{if(this.isSameOne(p1,p2))
if(oneLine(p1,p2))
{map[p1.i][p1.j]=0;
map[p2.i][p2.j]=0;
LEFTCOUNT-=2;
if(oneConner(p1,p2))
if(twoConner(p1,p2))
returntrue;
设计算法是图片可以消除,设计炸弹算法,使用户可以使用炸弹。
publicclassMapUIextendsJPanelimplementsActionListener
{privatestaticfinallongserialVersionUID=1L;
//privateintbombCount=Settings.BOMBCOUNT;
//棋子数组,用按钮来表示
privateChessButton[]chesses=null;
//数据模型
privateMapmap=newMap();
//判断当前点击的棋子是否是第二次选中的
privatebooleantwo=false;
//前面点的那个棋子
privateArrayPointpriviousPoint;
//第二次选中的棋子
privateArrayPointcurrPoint;
/**构造函数*/
publicMapUI()
{super();
initialize();
/**初始化函数
*@returnvoid/
privatevoidinitialize(){
initChesses();
GridLayoutgridLayout=newGridLayout(Settings.ROWS+2,
Settings.COLUMNS+2);
gridLayout.setHgap
(2);
gridLayout.setVgap
(2);
this.setLayout(gridLayout);
this.setSize(300,200);
//放置按钮,按行
for(introw=0;
row<
Settings.ROWS+2;
row++)
{for(intcol=0;
col<
Settings.COLUMNS+2;
col++)
add(chesses[row*(Settings.COLUMNS+2)+col]);
privatevoidinitChesses()
{int[][]values=map.getMap();
//初始化棋子,和数据模型里保持一样
this.chesses=newChessButton[(Settings.ROWS+2)
*(Settings.COLUMNS+2)];
10;
{//通过二维的数据模型坐标得到一维的棋子坐标
intindex=row*(Settings.COLUMNS+2)+col;
//对棋子的数据模型,即ArrayPoint对象进行设置,指定此棋子具体的位置和值
chesses[index]=newChessButton(row,col,values[row][col]);
//添加监听器
chesses[index].addActionListener(this);
//将外围的一圈设为不可见,行,列为0和为最大值的情况
if(row==0||row==(Settings.ROWS+2-1)||col==0
||col==(Settings.COLUMNS+2-1))
chesses[index].setVisible(false);
publicvoidclearCheese(ArrayPointpriviousPoint,ArrayPointcurrPoint)
{//处理匹配,看两点中否联通获得数据模型中的数组
int[][]values=map.getMap();
//将模型中对应的棋子设为0
values[priviousPoint.getI()][priviousPoint.getJ()]=0;
values[currPoint.getI()][currPoint.getJ()]=0;
//使两个已经消除的按钮不可见
intindex1=priviousPoint.getI()*(Settings.COLUMNS+2)
+priviousPoint.getJ();
intindex2=currPoint.getI()*(Settings.COLUMNS+2)
+currPoint.getJ();
chesses[index1].setVisible(false);
chesses[index2].setVisible(false);
//如果棋子总数已为0,则程序结束
if(map.LEFTCOUNT==0)
{JOptionPane.showMessageDialog(this,"
恭喜您通过!
!
"
);
/*事件监听器处理函数,也是处理棋子消除的地方/
publicvoidactionPerformed(ActionEvente)
{//获得当前的柜子
ChessButtonbutton=(ChessButton)e.getSource();
//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 连连 代码