AIDE手机编程初级教程(零基础向) 2.6.3 开发一个游戏之产生随机数

第二章 第一个游戏

系列教程导航

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;
		}
	}
}

感谢你的阅读!本教程会长期不定时更新。本人不是大神,也会犯错,如果有建议或者提问的话,欢迎评论留言!

作者头像

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值