首页 理论教育 实现数码Puzzle游戏:Java程序设计与应用开发成果

实现数码Puzzle游戏:Java程序设计与应用开发成果

时间:2023-11-26 理论教育 版权反馈
【摘要】:现在需要加入移动数字的功能,达到游戏的目的。加入KeyListener移动数字,完成数码Puzzle游戏程序。图15-4 数码Puzzle游戏程序a)初始生成图 b)按<PageUP>键结果4.[编程说明]关于引入语句“import java.awt.Label;”本程序继承了父类DigitPuzzle_2,而DigitPuzzle_2继承了DigitPuzzle_1。在简单的程序中使用,将awt类库中的所有类都引入,并不会有什么影响。但在要求速度和需要大量资源的程序中,比如,图像或视频的实时处理中,用将可能出现影响。

实现数码Puzzle游戏:Java程序设计与应用开发成果

现在需要加入移动数字的功能,达到游戏的目的。通常有两个方法,使用键盘和鼠标。下面的程序使用向上、下、左、右箭头键使用命令,移动空格。使用键盘的好处是可以移植到在没有鼠标的手机上进行游戏操作。我们还将程序改写成使用鼠标,适于计算机上运行。

1.移动算法

为建立移动算法,需要建立坐标。为与编程一致,采用纵坐标向下的计算机平面坐标表示,为与计算机数组下标从0开始一致,标签的编号(今后称为块编号)从0开始,见图15-1。这种块编号表示与其在图15-2所示的标签中文本数字,除了最后一个空白标签外均相差1。

如图15-2中所示,实际上有两种坐标,除了通常的平面坐标(x,y)外,还有所谓块坐标(u,v)。它表示每块的左上角在uv平面上的坐标。比如,块编号为0的块,其左上角在uv平面上的坐标是(0,0),所以,它的块坐标就是(0,0)。又如,块编号为5的块,其左上角在uv平面上的坐标是(2,1),所以(2,1)就是它的块坐标。如图15-2所示,标出了各块的编号及其块坐标。

显然对于3行3列排列,块编号n与块坐标(u,v)有如下关系

978-7-111-44824-2-Part02-224.jpg

相反地,有

978-7-111-44824-2-Part02-225.jpg

成立。此处,“%”是Java中取模符号,即取其相除的余数,而“[x]”是数学中取不超过x的最大整数符号。

978-7-111-44824-2-Part02-226.jpg

图15-2 块编号与块坐标

设uv平面的原点在xy平面中的坐标是(p,q),如图15-2所示。设各块的宽度和高度都是50,显然,块坐标(u,v)与通常的计算机坐标(x,y)之间有如下关系式成立

978-7-111-44824-2-Part02-227.jpg

公式(15.1.6)将在15.2节,用鼠标作为命令键的游戏编号得到应用。

至此,建立移动算法就很简单了。若采用向上箭头键作为命令空白的向上移动,空白块上方的块,简称为上方块则向下移动。在实际编程中,并不需要移动标签,只要移动这些标签上面的数字即可。

空白块称为当前块,其块坐标为(u,v),由(15.1.4)相应块编号记为curNum=u+3*v,则其上方块,即移动“目标块”的块坐标是(u,v-1),其块编号记为next=u+3*(v-1)。于是,移动标签文本数字的算法如下:

1)获取目标块的“文本数字”,并将其设置为当前块的“文本数字”。语句为

978-7-111-44824-2-Part02-228.jpg

2)将目标块的“文本数字”设置为空白。语句为

978-7-111-44824-2-Part02-229.jpg

3)改变当前块的块坐标。语句为

978-7-111-44824-2-Part02-230.jpg(www.xing528.com)

注意,垂直移动块坐标u不变。对于当前块的下移,左移,右移,方法是类似的。

2.设置移动限制

空白的当前块的移动是受到限制的。比如,向上移动时,当块坐标v=0时是不允许移动的。如图15-3所示。所以,对于向上移动时,只要设置条件“y>0”即可。对于其他方向移动,其条件是类似的。

978-7-111-44824-2-Part02-231.jpg

图15-3 向上移动的限制

3.程序实现

根据以上分析,再加入一些游戏程序必要的如移动步数、信息提示等就能基本完成本程序了。

【例15-2】加入KeyListener移动数字,完成数码Puzzle游戏程序。

978-7-111-44824-2-Part02-232.jpg

978-7-111-44824-2-Part02-233.jpg

运行程序结果如图15-4所示。

978-7-111-44824-2-Part02-234.jpg

图15-4 数码Puzzle游戏程序

a)初始生成图 b)按<PageUP>键结果

4.[编程说明]

(1)关于引入语句“import java.awt.Label;”

本程序继承了父类DigitPuzzle_2,而DigitPuzzle_2继承了DigitPuzzle_1。DigitPuzzle_1中虽然有引入语句“import java.awt.*;”,但本类需要定义新的Label infor,根据Java的继承规则需要引入语句(15.1.4),或者语句

978-7-111-44824-2-Part02-235.jpg

使用(15.1.6)的结果是仅引入awt的Label类,节省资源,速度快。在简单的程序中使用(15.1.7),将awt类库中的所有类都引入,并不会有什么影响。但在要求速度和需要大量资源的程序中,比如,图像或视频的实时处理中,用(15.1.7)将可能出现影响。

(2)KeyListener的引入

本程序需要引入键盘事件监视器KeyLister,因此需要语句(15.1.5)和(15.1.6)。这个监视器有3个响应函数keyPressed()、keyReleased()和keyTyped(),必须全部重载。在本程序中,只为keyPressed()设计了功能,对其他两个函数没有设计,所以其函数体是空的。但是,即使是空的函数体语句,必须写入程序中。这是Java语言的规定,否则,在编译时将出现错误

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈