基于java的连连看游戏Word下载.doc
《基于java的连连看游戏Word下载.doc》由会员分享,可在线阅读,更多相关《基于java的连连看游戏Word下载.doc(15页珍藏版)》请在冰豆网上搜索。
系统菜单区放置菜单即可,用户游戏区放置一个8*9的按钮数组来构成游戏界面,用户交互区放置开始,暂停等功能按钮以及提示信息。
2、生成游戏区
运行程序后,游戏区并不显示按钮数组,当点击开始按钮后,再自动生成。
在生成按钮时要求按钮上的图案是随机的,且每个图案必须是偶数,否则会出现无法消除的按钮。
如何实现呢?
我们可以这样考虑:
假设有12个图片,把图片名字按照数字序号从0到11命名;
假设游戏区共72个按钮,那么产生36个12以内的随机数字(每个随机数字代表一个图片),放入一个ArrayList中,最后使用ArrayList的addAll方法对已经产生的36个随机数字复制一份,这样就获得了72个随机数字,并且是成对的。
因为一个数字对应一个图片,所以72个按钮需要的图片就生成了。
代码如下:
Randomrandom=newRandom();
intimagenum=ROW*COL;
for(inti=0;
i<
imagenum/2;
i++){
imageIndex.add(random.nextInt(12)+"
"
);
//生成随机数索引放入集合
}
imageIndex.addAll(imageIndex);
//连接集合使每个索引都是成偶数的
3、联通消除
点击相连且图片相同的两个按钮可以把两个按钮消除掉。
相连有三种情况:
直线相连,直角相连,双折线相连。
要消掉相同图标的按钮,首先要想办法判断两个按钮的图标是否相同,这里提示大家一个方法:
按钮有个setActionCommand方法和getActionCommand,把图标名字设置为一个按钮的ActionCommand,然后通过对比两个按钮的ActionCommand就可以知道是否具有相同的图标。
消除按钮就要判断两个按钮是否连通,连通有三种情况,对应三种算法,下面详细说明。
算法判断两个点是否连通,那如何跟两个按钮建立联系呢?
按钮的位置就可以视作一个点(java中用Point类表示一个点)。
这样用一个点代表按钮位置,用ActionCommand代表按钮上的图标。
就很容易操作了。
下面我们先说清楚实现原理,具体代码一会在给出。
(1)直线相连:
只要两点之间横坐标或纵坐标相同,即表示两点在同行或同列;
然后判断两点之间有没有障碍,无则联通。
(2)直角相连:
两个点的坐标可以生成一个新的点,如果两点都可以与该新点联通,则说明联通。
注意:
新点有两个,如图所示一个,另外喇叭图标处也可以生成一个,但是因为喇叭图标处不是空点,因此不用该点。
但在实际中,新点的两种可能都要考虑到,那个能用用那个。
(3)双折线相连:
在单击的第一点处,向四个方向搜索有无空点,如果有则生成一个新点,如果该新点与另一个按钮联通(直角联通),则说明联通。
如果该新点不能与按钮连通,则继续向该新点的方向前进一个位置,再次判断该位置是否为空点,是否可以和另一个按钮连通,以此类推。
4、重排
当游戏进行到一定程度,剩余的按钮无法消掉,这时就需要对按钮位置进行重新排列,从而让游戏继续进行。
解决这一问题的思路如下:
首先对所有按钮进行搜索,把剩余按钮的ActionCommand(ActionCommand和该按钮显示的图片序号一致,如果按钮被消掉则ActionCommand为空)放入一个集合内;
然后依次搜索剩余按钮,找到一个剩余按钮后,保持按钮的位置不动,从集合中随机取出一个ActionCommand赋给该按钮,这样就完成了对剩余按钮的重排。
四具体实现
打开Eclipse,新建一个类LinkGame,该类继承自JFrame,并且需要实现ActionListener方法。
publicclassLinkGameextendsJFrameimplementsActionListener{
}
在该类中添加如下变量和方法,见表1和表2。
表1LinkGame类中的成员变量
变量类型
变量名
说明
finalstaticint
ROW
游戏区8行9列共72个按钮
COL
JPanel
functionPanel
功能区面板
gamePanel
游戏区面板
JButton[][]
dots
按钮数组
JLabel
timestr
内容是“剩余时间”
timecount
计时
Timer
timer
JButton
start
开始按钮
pause
暂停
conti
继续
hint
重排
staticint
count
记录鼠标单击次数
time
记录游戏剩余时间
Point
p1,p2
保存两个被单击按钮的坐标
LinkedList<
Point>
list
按钮坐标集合
ArrayList<
String>
imageIndex
存放图像索引
linklist
重排时存放按钮
表2LinkGame类中的方法
方法名
方法功能
publicvoidaddmyMenu()
添加菜单
publicvoidaddFunctionPanel()
添加功能区
publicvoidaddGamePanel()
添加游戏区
privateclassButtonEventsimplementsActionListener
游戏区按钮被单击
publicbooleanlineCheck(Pointp1,Pointp2)
是否直线联通
publicbooleansecendLine(Pointp1,Pointp2)
是否直角联通
publicbooleantriLine(Pointp1,Pointp2)
是否双折线联通
publicvoidreSet()
当剩余按钮无法消除时进行重排
publicvoidactionPerformed(ActionEvente)
功能区按钮被单击时
上述方法的具体实现如下:
1、构造方法
//构造方法建立游戏界面
publicLinkGame(){
this.setSize(780,500);
this.setTitle("
连连看游戏"
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addmyMenu();
//添加菜单
addFunctionPanel();
//添加功能区
this.setVisible(true);
}
2、菜单
菜单的功能均没有实现,读者可以自行添加。
//添加菜单
publicvoidaddmyMenu(){
JMenuBarmenuBar=newJMenuBar();
this.setJMenuBar(menuBar);
JMenumenuGame=newJMenu("
游戏"
JMenumenuSet=newJMenu("
设置"
JMenumenuHelp=newJMenu("
帮助"
menuBar.add(menuGame);
menuBar.add(menuSet);
menuBar.add(menuHelp);
menuGame.add(newJMenuItem("
打开"
));
保存"
退出"
menuSet.add(newJCheckBoxMenuItem("
音乐开关"
JMenuchoice=newJMenu("
难度选择"
menuSet.add(choice);
menuSet.add(newJMenuItem("
背景色"
提示"
menuHelp.add(newJMenuItem("
关于"
newImageIcon("
image/2.gif"
)));
menuHelp.addSeparator();
ButtonGroupgroup=newButtonGroup();
JRadioButtonMenuItemrbm1=newJRadioButtonMenuItem("
初级难度"
JRadioButtonMenuItemrbm2=newJRadioButtonMenuItem("
中级难度"
JRadioButtonMenuItemrbm3=newJRadioButtonMenuItem("
高级难度"
group.add(rbm1);
group.add(rbm2);
group.add(rbm3);
choice.add(rbm1);
choice.add(rbm2);
choice.add(rbm3);
3、功能区和游戏区的界面
//添加功能区
publicvoidaddFunctionPanel(){
start.setPreferredSize(newDimension(150,50));
pause.setPreferredSize(newDimension(150,50));
conti.setPreferredSize(newDimension(150,50));
hint.setPreferredSize(newDimension(150,50));
timecount.setPreferredSize(newDimension(150,50));
timestr.setPreferredSize(newDimension(150,50));
timestr.setFon