第二章 第一个游戏
系列教程导航2.6 开发一个游戏
2.6.4 判断相似度
文章目录
过程分析
上一节,我们设计了一个产生随机数的工具函数。这一节,我们接着设计第二个工具函数:判断两个数字的相似度。输出的结果就是综述篇里面说的几A几B。
为了设计这个函数,我们首先需要获取两个数字的各个数位上的数字,然后分别进行判断。上一节我们是采用模运算和除法相结合的方式取各个数位的,但是此时用这个方法不太好。首先,我们输入的数字是字符串(可能首位是0,所以不能用数字),所以要转为整数;其次,两个数字需要用8个变量来分别记录其各个数位,需要比较4*4=16次(每两位都需要比较一次),写出来就会很复杂。为此,我们使用另一个方法来获取数位上的数字。
根据面向对象的思想,Java中的一切都可以是对象,字符串也不例外。字符串作为对象,也许就有很多函数(当然,这些函数都是早就由别人写好了的)。事实上,字符串本身就有这样的一个函数:charAt,可以用来获取给定位置的字符。
由于字符串可以看成是由字符一个个连起来的,所以自然可以把每一个字符从左到右编一个号,也就是它们的“位置”。注意编号是从0开始的。举个例子,对于字符串"5468",字符'5'的“位置”是0,字符'4'在1位置,'6'在2位置,'8'在3位置。于是假如我们想要获取2位置的字符,就可以这样
char a = “5468”.charAt(2);
这样就很方便了,我们可以很容易地获取到各个数位上的数字。不过,更重要的是,有了它,我们就可以很方便地比较两个数字的各个数位。
接下来,我们来分析如何比较两个数字的各个数位。一个很自然的思路是,假设两个数字分别是a和b,我们首先获取数字a的第一个数位,记作x,然后依次获取数字b的各个数位,都与x比较一次。然后再取数字a的第二个数位,重复刚才的步骤。看出来了吗?这里已经出现了循环,而且有两个循环:一个循环控制a的数位,另一个循环控制b的数位。
接下来,我们结合代码具体实现一下以上的思路。
实现
我们首先把函数定义出来。如下:
这个函数输出的是A和B的值,所以我们需要定义两个变量来记录A和B:
Java严格区分大小写,故此处A,B和a,b不冲突
然后,我们回忆一下循环结构的知识。此处应该用for语句还是while语句呢?事实上,两者都可以用,不过我觉得for语句看起来会更优美一些。于是我们写下一个for语句,用于控制数字a的数位。
接着,我们再写一个循环,用于控制数字b的数位:
现在我们只需比较x和y就可以了,因为它们会分别取遍a和b的各个数位。
如果此时i和j相等的话,说明a和b的这个数位上的数字是一样的,A加1;反之,说明a和b存在相同的数字,但是位置不一样,B加1。所以此处我们使用if else结构:
最后,我们把判断结果返回:
注意此处A和B是变量,而"A"和"B"是字符串,中间的加号是连接符。假如A是2,B是1,那么返回的结果是"2A1B"
后记
在本节,我们完成了第二个工具函数。事实上,根据综述篇的分析,我们已经完成了这个游戏的一大半了。下一篇文章,我们会逐步完成游戏的核心部分:对玩家的不同输入做出回复。
由于本节没有修改MainActivity.java的其他部分 故我只放出本节所涉及的函数的代码,其他的代码可以在上一篇文章的末尾找到。
//比较两个数字相似度的函数
private String getSimilarity(String a, String b){
int A = 0;
int B = 0;
//外循环,控制数字a的数位
for(int i = 0 ; i < 4 ; ++i){
//获取数字a位置i上的数字
char x = a.charAt(i);
//内循环,控制数字b的数位
for(int j = 0 ; j < 4 ; ++j){
//获取数字b位置j上的数字
char y = b.charAt(j);
//比较x和y
if(x == y){
if(i == j){
//x和y在相同的位置
A++;
}else{
//x和y不在相同的位置
B++;
}
}
}
}
//返回判断结果
return A + "A" + B + "B";
}
感谢你的阅读!本教程会长期不定时更新。本人不是大神,也会犯错,如果有建议或者提问的话,欢迎评论留言!