用 JAVA 开发游戏连连看(之三)将算法与界面结合起来

(之三)将算法与界面结合起来

用布局和按钮来实现算法的界面

上面已经说完了算法,相信大家也迫不及待的想进入界面的设计了吧,好了,多的不说,我们开始吧。

既然我们的算法是基于二维数组的,那么我们也应该在界面使用一个能反映二维数组的控件。这里有两种方式,一种使用表格来实现,第二种是使用布局来实现。

相对而言,用表格来实现二维数组要简单一些, JAVA 提供的布局方式可能是令大家都不习惯的一种界面设计方式,不过,在这里,我还是选用了布局的方式来实现界面,因为,当你设计完界面后,你会发现 JAVA 的布局也是有它的优点的。

JAVA 提供了 BorderLyout 、 GridLayout 、 FlowLayout 等布局,而在这些布局中, GridLayout 布局是最接近于表格方式的一种布局,同时,我们使用 Jbutton 控件来作为数组中的元素。

//MapUI.java

public class MapUI extends JPanel implements ActionListener {

JButton[] dots = new JButton[Setting.ROW * Setting.COLUMN];

public MapUI() {

// 设计布局

GridLayout gridLayout = new GridLayout();

gridLayout.setRows(Setting.ROW);

gridLayout.setColumns(Setting.COLUMN);

gridLayout.setHgap(2); // 设置纵向间距

gridLayout.setVgap(2); // 设置横向间距

this.setLayout(gridLayout);

// 放置按钮

for (int row = 0; row < Setting.ROW; row++) {

for (int col = 0; col < Setting.COLUMN; col++) {

int index = row * Setting.COLUMN + col;

dots[index].addActionListener(this); // 添加事件处理

this.add(dots[index]);

}

}

}

}


当然了,上面的代码太简单了,简单得连一些基本的事情也没有做,比如说在按钮上加上文字,并且,要保证每个按钮上的文字与算法中二维数组中相对位置的元素的值相对应。现在我们运行一下看看,怎么样,像不像?
 

界面出来了,那我们怎么知道用户点击的是哪个按钮呢。其实这也不难的,我们在放置按钮的时候,对每个按钮的 CommandName 属性赋一个值,通过这个值,我们就可以知道该按钮对应二维数组中元素的具体位置了,现在,我们按放置按钮的代码改动一下:

// 放置按钮

for (int row = 0; row < Setting.ROW; row++) {

for (int col = 0; col < Setting.COLUMN; col++) {

int index = row * Setting.COLUMN + col;

dots
.setActionCommand("" + i);

}

}


在按钮的事情处理中,再把这个值取出来,并且还原到坐标上,

public void actionPerformed(ActionEvent e) {

JButton button = (JButton) e.getSource();

int offset = Integer.parseInt(button.getActionCommand());

int row, col;

row = Math.round(offset / Setting.COLUMN);

col = offset - row * Setting.COLUMN;

}


怎么样,是不是如此简单?已经知道了用户是按的哪个按钮,并且知道了该按钮对应的二维数组中的值,剩下的事情就不用我说了吧:)

现在,我们需要用 JButton 控件来将算法中二维数组中每个元素的值区别出来,最简单的就是用不同的数字来显示,有了这个功能后,我们就可以很方便的实现界面与算法的同步了。

// 根据数组来绘置画面

private void paint() {

for (int row = 0; row < Setting.ROW; row++) {

for (int col = 0; col < Setting.COLUMN; col++) {

int index = row * Setting.COLUMN + col;

if (map.getMap()[row][col] > 0) {

dots[index].setIcon(Kyodai.BlocksIcon[map.getMap()[row][col] - 1]);

dots[index].setEnabled(true);

}

else {

dots[index].setIcon(null);

dots[index].setText(“” + index);

}

}

}

}


设计用户界面

好了,到现在为止,不管怎么说,我们已经大体上实现了与算法有关的界面,虽然还很难看,但总算是有了个界面,也算是对自己的一点安慰吧。

现在,我们要设计用户的界面了,用户的界面也无需让我们多考虑了,既然已经有现成的,我们就抄吧(其实是我天生缺乏美术天份,与其自己做得难看,还不如抄抄别人现成的)。这部分没有太多要说的,我就用图来说明一下吧。



同样,整个界面也是使用了 JAVA 提供的布局方式,这里使用的是 BorderLayout 布局,我们需要注意的就是先算计好每个区域所需要尺寸的大小,并且使用 JPanel 的 setPreferredSize 方法来固定好大小,同时,根据自己的需要,添加命令按钮如开始、退出等。

为用户界面添加功能

用户界面的设计已经出来了,但是相应的功能我们还没有实现,现在,让我们来一起实现这些功能吧。

同样,我们还是参照一下别人游戏中有哪些功能,并且根据自己的需要来进行选择,在这里,我们只需要提供开始游戏、刷新地图、提示、炸弹等功能就好了(其它的暂时可以不管,以后需要的时候可以再添加)。

开始游戏: 当用户开始游戏的时候,我们需要将地图初始化并且显示出游戏界面 。

刷新地图: 此功能我们在算法部分中已经实现了,现在要做的就是使显示部分能够同步进行。

提示功能: 此功能在算法中也已经实现,我们需要做的就是怎么样将找到的这两个并且向别人指出。

炸弹功能: 此功能其实 就是在提示功能的基础上,加上自动消除两个点。

好了,相信这些对我们并非难事,我们还是继续下一步吧。
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
跟我学Java Swing之游戏设计 一 谁知道通天的巴比伦塔耗费了多少沙石?又有谁知道罗马的建成经历了多少个日夜?我 们惟一知道的是,没有一块块砖石的垒砌,就没有蜿蜒万里的长城;没有巨石和黏土的堆 集,就没有亘古不变的金字塔。由此可见,基础知识的准备对于我们学习任何事物都至 关重要,那么,就让我们从认识Swing的一些基础功能开始,启动我们建造罗马的伟大工 程吧! 前言   Java咖啡馆已经开张不少时日了,如果你已经喜欢上了Java这杯咖啡的味道,那么 记得常来哦。这一次,我们为大家准备了一大杯香浓的咖啡——将以开发一个"连连看"游 戏为蓝本,和大家共同学习Java中Swing的用法,当你细心品味这杯咖啡后,你会发现, 不但Java这杯咖啡还别有一番风味,而且还学会了专业游戏开发方法,真是两全其美 !   为了让大家先睹为快,下图便是游戏的截图。大家可以下载游戏试玩(下载游戏程 序;下载源文件),然后在命令行方式下使用java -jar kyodai.jar来运行。此外,还可以到我的主页http://www.ismyway.com上下载这个游戏 的单机版以及手机版进行试玩(见图1)。   Java咖啡馆以前介绍过AWT的知识,那么Swing和AWT究竟有什么区别呢?学习Java的 人都可能听到或看到过重量级控件和轻量级控件这个字眼,AWT就是我们通常所指的重量 级控件,Swing则是轻量级控件。我们都知道Java的口号是"一次编写,到处运行",这也 就要求在我们的程序中,尽量使用纯Java的代码。很不幸的是,AWT依赖与本地平台的接 口,因此,在不同的操作系统上,使用AWT制作的界面起来可能会有些细微区别。Swi ng则完全不同了,Swing是用纯Java编写的,因此,使用Swing编写的界面能保证在所有 平台上有着同样的外观。这里还有一个窍门:在JDK中,为便于区别,所有Swing控件都以 大写字母J开头,比如说JButton(AWT 中对应的是Button),这样你就很容易区分Swing控件和AWT控件了。 Swing初体验   对于想学习Swing编程的朋友,我们特地为大家准备了一些小窍门。首先,下载并阅 读代码是极有必要的。由于这是一篇关于Swing的教程,所以,我们只是尽可能讲解一些 与Swing有关的内容,与Swing无关的内容一般不会涉及,例如算法部分。其次,受篇幅 限制,也不可能在这里将每部分代码都写得完完整整的,所以,大家也需要对照完整代 码来看。最后,为了使大家更容易把精力集中在Swing学习上,我们也将游戏开发中所需 资源放在下载文件中,大家下载后便能够编译运行,看到执行结果。( 下载游戏源文件)   1.顶层容器   什么是顶层容器?当我们使用Java进行图形编程的时候,图在哪里绘制呢?我们需 要一个能够提供图形绘制的容器,这个容器就被称为顶层容器,你也可以把它想象成一 个窗口。顶层容器是进行图形编程的基础,一切图形化的东西,都必然包括在顶层容器 中。在Swing中,我们有三种可以使用的顶层容器,它们分别是:   ·JFrame:用来设计类似于Windows系统中的窗口形式的应用程序。   ·JDialog:和JFrame类似,只不过JDialog是用来设计对话框。   ·JApplet:用来设计可以在嵌入在网页中的Java小程序。   如果需要使用Swing制作一个窗口类程序,我们的代码看起来应该是这样: import javax.swing.*; public class KyodaiUI extends JFrame { …… }   2.控件   控件是构成应用程序界面的基本元素,按钮、文本框、进度条等,这些都是控件。 控件(这里我们只讨论可视化控件)又可以分为容器控件和非容器控件。从字面意义上来 理解,容器控件就是能包含其他控件的特殊控件,例如,Java中的JPanel控件就属于容 器型控件,我们可以在JPanel中放置按钮、文本框等非容器控件,你甚至可以在JPanel 中再放置若干个JPanel控件(值得注意的是,顶层容器也是容器型控件,每一个窗口应用 程序中有且只能有一个顶层容器控件,换句话说,顶层容器不能包括在其他的控件中)。   Java中的容器控件有很多,除刚才提到的JPanel外,还有JTabbedPane、JScrollPa ne等,非容器控件有JButton、JLabel、JTextField等。如果你需要向某个容器型的控件 中添加控件,你可以使用 add(Component comp) 方法来实现,如: JPanel panel = new JPanel(); JButton button = new JButton(); panel.add(button);   3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值