第二章 第一个游戏
系列教程导航2.6 开发一个游戏
2.6.3 产生随机数
文章目录
获取控件对象
上一节我们完成了猜数字小游戏的界面设计。但是,我们现在是没有办法操作那些控件的。根据前文讲的面向对象的知识,我们若想要操作这些控件的话,应该获取它们的对象。于是,接下来我们就将获取控件的对象。
想要获取对象,首先要找到它。举个例子,万一一个应用的界面里有好几个按钮,我们如何精确地找到其中的某个按钮呢?很简单,取个名字就好了。更加准确地说,是给控件分配一个id。
我们这就来给控件分配id。首先打开res/layout目录下的main.xml文件,然后点击右上角的那个图片一样的按钮,进入这个界面:
点击文本框,找到ID一项。点击之后随意输入一个id(最好只写英文字母,如果有需要的话可以用下划线)。
按照同样的方法,我们给输入框和按钮都分配一个id,注意不同控件的id不要重复。
然后我们点击返回,然后打开src目录下面的MainActivity.java文件。注意,AIDE有快捷切换文件的功能,在应用左上角有这样的内容:
点击MAINACTI(显然,这个没显示全),我们就可以切换到MainActivity.java了,非常方便。
接下来,我们在这个Java文件里面,根据刚才分配的id来获取各个控件的对象。现在有一个很重要的问题,获取到的控件对象应该“放在”一个变量里面,那么这个变量应该写在哪里呢?
我们先分析一下这个Java文件的结构。前面的内容我们暂时不管,从第8行开始看。很明显,这是一个类,类名为MainActivity。在这个类里面有一个函数,函数名为onCreate,没有返回值。这个函数有点像之前的主函数,也是程序执行的“入口”。
由于控件的对象应该是一直都可以使用,所以我们会把“存放”它们的变量定义在onCreate函数的外面。这样的话,只要应用没被关闭,它们一直都可以使用。
搞清楚变量定义的位置之后,我们就开始写吧!这里要注意的是,我们最好把这个变量的声明和赋值分开写。首先在onCreate函数的外面声明”存放”文本框的变量,这个变量的数据类型是TextView。
然后,我们在onCreate函数里面获取文本框对象,并把它的值赋给刚刚定义的变量。
然后就又出现了一个问题:怎么获取控件的对象呢?事实上,有这样一个函数,函数名为findViewById,它的参数是一个整数类型的id,返回值是id对应的控件对象。于是我们这样:
找到你刚才给文本框分配的id,然后点击即可。最后添上右括号和分号。
但是现在还是有问题。出问题的原因简单的说就是,左边的变量的数据类型是TextView,而右边的函数返回值的数据类型不是TextView。为此,我们需要把右边获取到的控件对象的数据类型强制转换为TextView。方法如下:
也就是说,括号里面写一个数据类型A,就可以把后面的对象的数据类型B强制转换为数据类型A。
接下来,我们按照相同的方法获取编辑框和按钮的对象。编辑框的数据类型是EditText,按钮的数据类型是Button。
以后,如果我们想要操作这些控件的话,就可以直接使用这些变量。获取控件对象的内容到此结束。不出意外的话,之后我们就不用再编辑main.xml文件了。
产生随机数
接下来,我们来实现一个小小的工具函数:它产生一个随机的四位数,并且各个数位都不重复。
我们可以把这个函数分成两步来完成。第一步,产生一个四位随机数;第二步,判断这个随机数是否符合要求,如果符合要求,就直接将这个数返回;如果不符合要求,就回到开头,重新执行。为此,我们很容易想到,这个函数大体上应该使用循环结构。
首先定义函数,并在里面写一个无限循环:
(函数前面的private关键字可以省略)注意该函数的返回值类型是字符串而不是整数。这是因为四位数字可能以0开头,而整数类型的数字不能以0开头。接下来,我介绍一个可以生成随机数的函数:Math.random(),它可以生成一个小数x,x的范围是0≤x<1。为了生成一个四位或者三位的随机数(三位随机数的首位就可以看作是0),我们把x乘以9900,再加上100,x的范围就变成了100≤x<10000。具体的代码如下:
然后,我们来判断这个四位数有没有重复的数位。怎么办呢?一种可行的办法是,我们分别用四个变量来记录各个数位上的数字,然后依次判断是不是相等。比如说一个数字是1234,我们分别用a,b,c,d来记录1,2,3,4。然后分别比较a和b,a和c,a和d,b和c,b和d,c和d。只要有其中一组相等,我们就回到最开始,重新生成随机数。
那么,如何得到这四个数位上的数字呢?仔细回想,我们之前学过模运算,也就是取余数。我们只需要将一个数模10,就可以得到它的个位数。比如1234%10=4,因为1234÷10=123……4;而把一个整数直接除以10,就可以把个位去掉,比如1234/10=123,123/10=12。结合这两个运算,我们就可以得到一个四位数的各个数位上的数字了。
这个运算过程比较复杂,所以我再举个例子
假设生成的随机数是num = 7651
a = 7651 % 10 = 1
num = num / 10 = 7651 / 10 = 765
b = 765 % 10 = 5
num = num / 10 = 765 / 10 = 76
c = 76 % 10 = 6
num = num / 10 = 76 / 10 = 7
d = num = 7
于是,a,b,c,d依次就是1,5,6,7,刚好是7651的各个数位
代码如下:
然后,依次判断是否相等,如果相等的话,直接使用continue关键字结束本轮循环,并进入下一轮循环。代码如下:
最后,我们把这四个数位组合成四位数,并转换为字符串。(因为数据类型是字符串,所以此处的+不起加号的作用,而是起连接符的作用)
想一想,如果num是一个三位数,这个函数能正常地返回一个首位为0的四位随机数吗?
后记
从本节开始,我们就要真正实现游戏的内部逻辑了。本节所讲的产生随机数的函数,不一定就是最好的。以后大家学到的知识更多了,就可以使用其他的方法来产生随机数。
本节涉及的代码如下:
main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1.0">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/show"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:layout_width="wrap_content"
android:ems="10"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:id="@+id/edit"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/but"/>
</LinearLayout>
</LinearLayout>
MainActivity.java文件
package com.owen.caishuzi;
import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
public class MainActivity extends Activity{
//声明“存放”控件对象的变量
TextView show;
EditText edit;
Button button;
/* Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取控件对象
show = (TextView)findViewById(R.id.show);
edit = (EditText)findViewById(R.id.edit);
button = (Button)findViewById(R.id.but);
}
//获取四位随机数的工具函数
private String getRandomNum(){
while(true){
//获取四位随机数
int num = (int)(Math.random() * 9900 + 100);
//判断四位数有没有重复的数字
int a = num % 10;
num /= 10;
int b = num % 10;
if(a==b) continue;
num /= 10;
int c = num % 10;
if(a==c | b==c) continue;num /= 10;
int d = num;
if(a==d | b==d | c==d) continue;
//将产生的四位随机数返回
return "" + d + c + b + a;
}
}
}
感谢你的阅读!本教程会长期不定时更新。本人不是大神,也会犯错,如果有建议或者提问的话,欢迎评论留言!