Arduino 随机数
要生成随机数,可以使用Arduino随机数函数。我们有两个函数:
- randomSeed(seed)
- random()
randomSeed(seed)
randomSeed(seed)函数重置Arduino的伪随机数生成器。虽然random()返回的数字的分布本质上是随机的,但是顺序是可预测的。你应该将发生器重置为某个随机值。如果你有一个未连接的模拟引脚,它可能会从周围环境中拾取随机噪音。这些可能是无线电波,宇宙射线,手机的电磁干扰,荧光灯等。
例子
randomSeed(analogRead(5));
// randomize using noise from analog pin 5
random()
random函数生成伪随机数。以下是语法。
random()语法
long random(max) // it generate random numbers from 0 to max long random(min, max) // it generate random numbers from min to max
例子
long randNumber;
void setup()
{
Serial.begin(9600);
// if analog input pin 0 is unconnected, random analog
// noise will cause the call to randomSeed() to generate
// different seed numbers each time the sketch runs.
// randomSeed() will then shuffle the random function.
randomSeed(analogRead(0));
}
void loop()
{
// print a random number from 0 to 299
Serial.print("
random1="
);
randNumber = random(300);
Serial.println(randNumber);
// print a random number from 0to 299
Serial.print("
random2="
);
randNumber = random(10, 20);
// print a random number from 10 to 19
Serial.println (randNumber);
delay(50);
}
让我们现在重温我们对一些基本概念的知识,例如位和字节。
Bit(位)
位只是一个二进制数字。
-
二进制系统使用两个数字,0和1。
-
与十进制数字系统类似,数字的位数不具有相同的值,位的“意义"
取决于其在二进制数中的位置。例如,十进制数666中的数字相同,但具有不同的值。

字节
一个字节由8位组成。
-
如果一个位是一个数字,逻辑上字节表示数字。
-
可以对它们执行所有数学运算。
-
一个字节中的数字也不具有相同的意义。
-
最左边的位具有被称为最高有效位(MSB)的最大值。
-
最右边的位具有最小值,因此称为最低有效位(LSB)。
-
由于可以以256种不同的方式组合一个字节的八个0和1,所以可以由一个字节表示的最大十进制数是255(一个组合表示零)。
三个趣味化学小实验
点水成火
取干燥的蔗糖粉末5克与氯酸钾粉末5克在石棉网上混合,用玻璃棒搅匀,堆成小丘,加入过氧化钠3克,滴水,半分钟后,小丘冒出白烟,很快起火燃烧。
空杯生烟
两个洁净干燥的玻璃杯,一个滴入几滴浓盐酸,一个滴入几滴浓氨水,转动杯子使液滴沾湿杯壁,随机用玻璃片盖上,把浓盐酸的杯子倒置在浓氨水的杯子上,抽去玻璃片,便能看到满杯白烟。
雪球燃烧
把20毫升水加7克醋酸钙,制成饱和醋酸钙溶液,加到100毫升95%的酒精中,边加边搅拌,就析出像雪一样的固体,把析出的固体制成球状,点火即燃烧。
Arduino基础入门篇15—随机骰子
|
阅读本文大概需要5分钟。
|
上一篇介绍了数码管的使用,一位数码管可显示数字0到9。本篇使用random()函数产生随机数并在数码管上进行显示,制作一个随机骰子。
在Arduino中,random()函数用来产生伪随机数,可以传入一个区间,产生此区间内的随机数。通常情况下,在使用random()函数之前,需要使用randomSeed()来初始化随机数生成器,指定一个随机数种子。
1. 实验材料
-
Uno R3开发板
-
配套USB数据线
-
面包板及配套连接线
-
共阴极数码管
-
1个220Ω限流电阻
2. 实验步骤
-
根据原理图搭建电路。
数码管的A,B,C,D,E,F,G,DP引脚分别接入开发板的数字管脚7,6,5,10,11,8,9,4。数码管公共端接限流电阻,电阻另一端接GND。
实验原理图如下图所示:
实验原理图g 实物连接图如下图所示:
实物连接图 -
新建sketch,拷贝如下代码替换自动生成的代码并进行保存。
1/*
2 Random
3 通过Random随机显示0到9的数字
4*/
5
6//设置控制各段的数字IO脚,具体几号引脚对应哪一段,来源为数码管官方引脚图。
7int pin_a = 7;
8int pin_b = 6;
9int pin_c = 5;
10int pin_d = 10;
11int pin_e = 11;
12int pin_f = 8;
13int pin_g = 9;
14int pin_p = 4;
15
16int num;
17
18//根据共阴极数码管段码表定义0~9显示的各段开关状态
19int numTable[10][8] = {
20 //1为点亮,0为关闭
21 //a b c d e f g dp
22 {1, 1, 1, 1, 1, 1, 0, 0 }, //0
23 {0, 1, 1, 0, 0, 0, 0, 0 }, //1
24 {1, 1, 0, 1, 1, 0, 1, 0 }, //2
25 {1, 1, 1, 1, 0, 0, 1, 0 }, //3
26 {0, 1, 1, 0, 0, 1, 1, 0 }, //4
27 {1, 0, 1, 1, 0, 1, 1, 0 }, //5
28 {1, 0, 1, 1, 1, 1, 1, 0 }, //6
29 {1, 1, 1, 0, 0, 0, 0, 0 }, //7
30 {1, 1, 1, 1, 1, 1, 1, 0 }, //8
31 {1, 1, 1, 1, 0, 1, 1, 0 }, //9
32 };
33
34
35void setup()
36{
37 for (int i = 4; i <= 11; i++)
38 {
39 pinMode(i, OUTPUT); //设置4~11引脚为输出模式
40 }
41
42 randomSeed(analogRead(0));
43 }
44
45//根据索引显示数字
46void showNum(int index)
47{
48 digitalWrite(pin_a, numTable[index][0]); //设置a 引脚的电平
49 digitalWrite(pin_b, numTable[index][1]); //设置b 引脚的电平
50 digitalWrite(pin_c, numTable[index][2]); //设置c 引脚的电平
51 digitalWrite(pin_d, numTable[index][3]); //设置d 引脚的电平
52 digitalWrite(pin_e, numTable[index][4]); //设置e 引脚的电平
53 digitalWrite(pin_f, numTable[index][5]); //设置f 引脚的电平
54 digitalWrite(pin_g, numTable[index][6]); //设置g 引脚的电平
55 digitalWrite(pin_p, numTable[index][7]); //设置dp引脚的电平
56
57 }
58
59void loop()
60{
61 num = random(10); //产生随机数
62 showNum(num); //显示随机数
63 delay(500);
64 } -
连接开发板,设置好对应端口号和开发板类型,进行程序下载。
程序下载
3. 实验现象
随机显示0到9之间的数字。

4. 函数介绍
random()
-
描述:生成伪随机数。
-
函数原型:
-
random(max)
-
random(min,max)
-
参数:
-
min: 随机数区间下限值,且包括在内。此参数可选,省略则从0开始。
-
max: 随机数区间上限值,且不包括在内。
-
返回值:min和max-1之间的随机数。
randomSeed()
-
描述:初始化随机数生成器。
-
函数原型:randomSeed(seed)
-
参数:用于初始化伪随机序列的数字,随机数种子。
-
返回值:没有。
5. 实验分析
程序中通过randomSeed()函数来初始化随机数生成器。当模拟管脚0悬空时,使用analogRead(0)读取到的是不确定的模拟噪声,用它来做随机种子,可获取到更加理想的随机数。在使用random()函数时,参数中区间上限是不包括在内的。比如想生成[10,20]之间的随机数,则应该这样写:random(10,21)。
原文始发于微信公众号(
TonyCode
):Arduino基础入门篇15—随机骰子
|
少儿编程Scratch第13讲:九九乘法问答
目的
目的:通过编写一个简易的九九乘法问答程序,理解变量、问答和广播。本想编写一个输出九九乘法表的程序,以便能够练习循环、克隆和对象的相对位置。最后决定先做一个乘法问答小程序。
适用对象:适合有一定初步Scratch编程经验的用户,例如一二年级学生。在家长指引下学员能独立完成大部分功能,用时约3小时。
本游戏共享在:https://scratch.mit.edu/projects/211180722/
微信订阅号:ABO_CRM
实现方式
九九乘法问答思路:
1) 点击魔术师出题,系统从1-9随机选择两个数,并且相乘,得到答案。
2) 魔术师显示被乘数、乘于的操作符、乘数、等于,然后显示问号。
3) 魔术师随机询问,答案是多少,显示录入框。
4) 用户录入答案。 系统判断用户录入是否和系统计算一致;
i. 一致:隐藏问号,显示录入的值;显示正确打钩角色;
ii. 不一致: 隐藏问号,显示录入的值;显示错误打钩角色。
5) 用户点击“查看答案”按钮。
a. 系统显示“正确答案”标签;
b. 在旁边显示正确答案。这样用户可以将自己录入的值和系统答案相比较。
- 变量设置
定义四个变量,均为全局变量。
- X:被乘数
- Y:乘数
- R:系统结算结果
- Input:用户回答录入的值
2. 魔术师角色
1) 初始化:隐藏输入和结果变量。初始化变量值。
2) 当角色被点击时:
a. 隐藏结果和录入变量
b. 随机选择1-9数字,并存入X
c. 随机选择1-9数字,并存入Y
d. 计算结果:X * Y, 并且写入到结果变量R中
e. 广播“显示问号”。问号角色收到以后,就显示问号。
f. 询问答案,并等待用户回答。用户需要录入答案。
g. 用户录入答案确定以后
i. 将用户录入的值写入Input变量。
ii. 如果回答正确(Input = R),则广播“对”。打钩的角色收到后,显示打钩。
iii. 如果回答错误(Input <>R),则广播“错”。错误标识的角色收到后,显示错误标识。
iv. 显示用户录入的变量Input。
3. 显示答案角色(Answer)
1) 当这个按钮被点击时,广播两个消息:隐藏问号、显示“正确答案”的标签、显示答案变量。
2) 问号角色收到后隐藏问号。其实之前如果用户有录入的话,已经会隐藏掉,显示用户实际录入的值了。
4. “正确”角色
1) 收到回答正确的广播时,显示。
2) 收到回答错误的广播时,隐藏。
3) 收到显示问号时,即出题完毕,也要隐藏。
5. “正确答案”标签角色
4) 这是一个标签,标签是一个图“正确答案”。
5) 程序开始时隐藏。
6) 点击魔术师出题时会隐藏;点击“Answer”按钮显示答案时会显示。
后续改进
1) 增加难易程度按钮,高中低三挡。选择高,则从20-99随机;选择中,则从10-19随机;选择低,从1-9随机。
2) 将用户录入的值,按照图片角色的形式显示出来。因为显示变量的样式是固定的,过于简单,通过显示图片,可以实现各种效果。
原文始发于微信公众号( 艾博特 ):少儿编程Scratch第13讲:九九乘法问答|
少儿编程Scratch第七讲:字母雨打字练习
已经有些天没能更新Scratch的文章了。周末依然会带小孩玩一会Scratch,实现一些功能,主要是完善第四讲中的射击游戏,实现了敌方,制作了得分。后来还实现了双人版,两个人一起玩,各自得分。这周的练习是字母雨打字练习。所用技术和之前类似,克隆、移动、随机,算是巩固相关知识。
目的
制作字母打字游戏。字母随机从屏幕上方出现并往下坠落,坠落过程中,按下对应的字母键,该字母即消失,得分。
[结果运行图]
实现方式
主要技术是克隆、移动和随机。本游戏只需设置一个角色,里面包含26个字母造型。开始时,每隔一段时间即克隆该角色本身,克隆体启动时,不停往下移动。监控是否有按键按下,按下以后,对应的克隆体消失。为了让字母从屏幕不同位置出现,因此对于角色的X轴需要随机取值。
制作步骤
第一步:添加角色和造型。
1. 加入一个字母角色
2. 在这个角色中,按字母顺序依次加入其它25个字母造型,总共有26个造型。
【角色,我们重命名了造型,但其实并没有什么用。获取造型时,得到的是造型编号,而不是名称】
第二步:克隆角色,坠落。
3. 开始后重复执行,无限循环
4. 每一次循环都克隆一个字母角色,因此循环里面可以增加时间,如等待2秒。等待时间越短,克隆的字母就越多。
5. 克隆体出现以后,进入循环,X轴保持不变,Y轴不停减少。即将到达屏幕时,删除克隆体。
第三步:接受按键,消除字母
6. 新设一个克隆体启动事件,启动即不停循环检查是否有按键。(一个无限大循环后面就不能添加其他代码,因此需要另起炉灶,新增一个克隆体启动事件)
7. 如果A被按下,判断那造型编号是否为1,如果是1,则计分,并且删除克隆体,增加得分。造型获取中并没有获取造型名称的语句,只有获取造型编号的语句,因此造型需要按顺序排列。
第四步:随机字母
8. 克隆自身之前,将造型切换为1-26的随机数字,即在26个字母中随机选择一个字母。如果不进行随机处理,那么字母将按顺序依次出现。
后续改进
本打字练习,仅随机选取26个字母。在实际的英语录入是按照单词句子进行的。如果能够存储一定数量的单词,然后依次显示某个单词中的字母,形成单词中的字母雨,那将更贴近实际。同时在应用技术上,能更上一层楼。
分享地址:https://scratch.mit.edu/projects/209062172/
浏览器中需要Flash播放器。
原文始发于微信公众号( 艾博特 ):少儿编程Scratch第七讲:字母雨打字练习|
少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
目的
目的:抽奖游戏运行时会不断的快速切换很多奖品,点击停止,画面停在某个奖品上,即为用户所抽到的奖品。这节课学习如何制作抽奖游戏。通过抽奖游戏,理解背景、角色、造型、随机和广播的功能。
适用对象:适合一年级初学者使用。在老师指导下,学员基本能够独立完成。
背景:之前给小孩玩过一会“果果老师”编写的抽奖游戏。一天下班回来后,小孩跟我说他自己做了一个抽奖的游戏。我很惊讶,不大相信。开机,检查,还真的是一个很不错的抽奖的程序。当然这是一个简单的抽奖游戏,还有很多可以改进的地方。因此我就顺着这个抽奖游戏雏形,逐步深入讲解和制作抽奖游戏。
本游戏共享在:https://scratch.mit.edu/projects/200876858/
MIT的Scratch是一个社区,可以共享程序,其他人可以查看代码,进行改进(Remix)。虽然访问MIT的网站会慢一点,但我们已经习惯在网上直接制作程序,不安装和使用客户端Scratch软件了。
微信订阅号:ABO_CRM
少儿编程-Scratch
· 少儿编程Scratch第五讲:练习一坐标和移动
· 少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘(2018.01)
· 少儿编程Scratch第三讲:宇宙大战.枪战游戏(2018.01)
· 少儿编程Scratch第二讲:奇妙的接球小游戏(2018.01)
· Scratch第一讲:Scratch完美的初体验(2018.01)
实现方式
最简单的抽奖游戏:这一个版本就是小孩自己琢磨出来的。即将所有的奖品都放在一个角色中,然后点击绿旗子开始时,立即进入一个大循环,然后在循环里面不停的切换造型。点击结束时,系统就会将奖品停在某个造型上,就是最后的奖品。因此只需要三个指令:开始、循环、下一个造型。
抽奖游戏逐步改进:上述抽奖游戏是最简单的版本,是有一些缺陷的。
第一个大问题是奖品的出现不是随机的,是依次按顺序更换造型。虽然小孩加入了42个造型,但是每次运行时,系统是按已经固定的礼品顺序抽取的。这不大公平,因为用户可以记住奖品的大概顺序。虽然奖品跑得很快,但还是能够知道奖品的前后大概顺序的。要解决这个问题,就需要使用随机的功能。即从两个数字之间随机挑一个数字。Scratch提供了“在XX到YY之间随机选一个数字”的功能。在更换造型中,可以使用“更换造型XX”。要使用随机数,就要把角色的造型重新命名为数字,否则以前的英文单词形式,是不能随机抽取的。其实我们之前看的“果果老师”的抽奖程序也是没有使用随机功能的。
第二个问题是抽奖的开始和结束问题。现在的抽奖是使用系统的开始结束按钮。如果需要在游戏页面内部自己制作按钮,然后点击开始按钮即开始抽奖,点击停止按钮就停止。用户可以多次点击开始和结束。因为按钮和奖品属于两个角色,因此要使用广播功能,开始按钮通知奖品开始摇奖,停止按钮通知奖品停止摇奖。
第三个问题是一个小问题。小孩自己做的抽奖程序中,一开始奖品就是显示的。实际抽奖过程中,奖品肯定是先隐藏的。这个改进很简单,即程序开始时,将奖品设置为隐藏,抽奖开始的时候才显示出来。
第四个问题是后续改进。抽奖是一个激动人心的过程,因此通常要增加激动人心的音乐,停止的时候,还可以切换一些灯光,播放停止的音乐。切换灯光可以通过变更背景实现。播放音乐的功能打算放到以后课程内再讲。
功能1:角色(孩子已熟悉)
一个图片或物品都可以作为角色,角色有一个脚本,程序写在角色的脚本中。这是Scratch的基本功能。
可以新建角色,默认角色是一个小猫咪。先删除小猫角色,系统提供了动物、奇幻、字母、人物、物品、交通等角色分类。
例如我们添加了小绿旗子和停止按钮两个角色。“当小绿旗子被点击”,就是开始按钮,然后执行一些操作,即开始抽奖。点击停止按钮时,抽奖结束。再次点击开始按钮,可以重新抽奖。
功能2:造型
每一个角色可能有一个或多个造型。造型是实现动画效果的重要方式。例如角色“猫”。猫有两个角色,通过切换造型实现小猫奔跑的动作,切换造型会实现动画的效果。在一个角色中放多个造型是Scratch的常用方式,否则可能会编写很多重复的代码。例如实现0-9数字加减法,打字程序a-z 26个字母,如果每个数字或字母都设置成单独的角色,那么这些角色中很多代码是完全相同的。使用一个角色,然后加上克隆功能,就可以实现打字、加减法游戏。
例如,在该抽奖游戏中“旗帜”的造型分两个,一个正的一个斜的。见下图所示,
切换时产生运动的效果,旗帜摇动起来。系统中的小旗子其实是只有一个造型的。讲解了可以复制一个出来,然后稍作调整,例如旋转一定的角度。然后切换造型,就可以实现一定的动画效果。
<小猫的两个造型,不停的切换造型,看上去,小猫就奔跑起来了。>
系统指令:下一个造型,实现切换功能。
下面通过造型做出抽奖游戏。这个版本也就是小孩自己制作的最原始的抽奖游戏版本。这个脚本放在奖品上,一个大循环,然后下一个造型,没有随机。奖品即不停循环显示,点击停止,就会停在某一个奖品上。
然后同理,将这个脚本放在小猫咪角色上,小猫咪就跑动起来了。当然如果不加等待时间,小猫咪的跑动就实在是太快了,快被累坏了。因此设置了等待0.1秒,才更换下一个造型。这样小猫咪的跑动就会正常一些。
制作步骤
第一步:选择舞台背景:这个舞台背景是小孩自己选的。
加入了小猫咪,在不停的跑动;加入了一个西瓜,西瓜也切换造型。说这是小猫咪在吃西瓜。然后加入了雪人,说雪人和小猫咪在舞台前面观看抽奖。加入了两个雪花角色,当装饰使用。这些是小孩自己加上去的。
后来我们在改进环节,加入绿旗子开始按钮,和橙色的停止按钮。绿旗子和停止按钮都复制了一个造型,稍微转动一下,实现动画效果。这样程序开始时,就知道这两个地方是可以点击了。
第二步:设置奖品角色的造型
1. 首先随便选择一个物品作为奖品角色。然后在这个角色中增加其他造型,即其他奖品。
【操作步骤】选择奖品角色,“从造型库中选取造型”。选多少个即有多少个奖品。这些造型都同属于一个角色。如下图所示,
孩子添加了42个造型,这42个造型都同属恐龙这一个角色,随着奖品的切换,角色上的图也会跟随切换。
2. 为了使用随机函数,我们造型进行数字编号,更改造型名称为数字。选中造型,右上角更改录入数字,按照顺序录入数字即可。
问题:目前多个造型是按顺序排列执行切换,不是随机的。能够猜出奖品,可以控制奖品。我们要做成随机的。所以要进行以下拓展操作。如果在更换造型中增加等待2秒,那么能够很明确的看到,系统是按顺序更换造型的。加入随机功能以后,系统就从42个奖品造型中随机抽取一个了。用户就无法猜测系统下次将显示哪一个奖品了。
微信订阅号:ABO_CRM
第三步:设置随机显示造型
1. 随机的介绍:即系统中提供这样的指令,从一个数到另外一个数之间随机选一个数。例如,如果有42个造型,每次都是从中随机挑选一个。因此,需要从1到42中,随机挑选一个数字。
2. 【操作】点击奖品角色的脚本,添加“将造型切换为在1-42之间随机选择一个数”。我们需要将随机数放在造型切换指令中。因此我们需要将这两个指令拼在一起。这是一种很常用的方式,需要熟练掌握。
开始时,请先忽略广播。在最简单的抽奖游戏中,也可以使用这个随机功能。
【操作步骤1】点击脚本—外观,选择
【操作步骤2】点击脚本—运算,添加指令 。
造型是有编号的,系统默认编号为英文字母,我们之前对造型进行编号,该游戏中有1-42个造型编号。已更改编号为1-42。
【操作步骤3】把拖到
中。即
这样,每次执行就会随机显示一个造型。
第四步:实现对奖品角色的开始和结束广播功能。(如果不自己制作按钮实现开始和结束的话,抽奖程序会简单很多。)
Scratch中,角色就是我们需要使用程序操作的对象。角色和角色之间是相对隔离的。如果一个角色需要通知另外一个角色要做什么事情,那么我们可以使用“广播”的功能。“广播”就是对程序中每个角色“大喊一声”,这样其他角色才能听到,听到以后,他们就去做一定的事情。否则别的角色是不知道其他角色要他做什么的。在这里,开始和结束是两个按钮角色,点击以后,要告诉奖品角色,开始或结束抽奖。开始按钮喊“开始抽奖”,抽奖的角色接收到这个消息以后,就显示奖品,开始抽奖。结束按钮喊“结束抽奖”,抽奖的角色接收到这个消息以后,就停止抽奖,显示抽中的奖品。
目的,用点击按钮的方式实现对一个角色的开始结束动作。
1. 添加旗帜图标角色表示开始;
2. 添加八边形图标角色表示结束。
3. 设置造型,开始和结束角色图标都有两个造型,切换造型产生动画效果。
4. “等待”操作:点击新增的开始按钮时,奖品角色开始快速变化。如果不想让它动那么快,在脚本–控制中选择
,例如更改时间为0.1秒。
要设置等待多少秒。就不会变化太快。
功能3:广播
1. 对开始角色进行广播
例如,开始的时候要告诉角色奖品开始抽奖了,当角色被点击这个事件开始时,做一个广播,即喊一声开始抽奖。通过广播的形式,对方(奖品)接到抽奖信息开始随机切换奖品。广播就是让一个角色喊一声。
广播可以新建消息,比如让小旗帜喊一声开始抽奖,奖品收到信息后便开始切换造型。
点击开始旗帜角色,脚本—控制,如下图,
当开始角色被点击时,广播“开始抽奖”。
奖品角色收到这个广播消息以后,就开始抽奖。
当结束角色被点击时,广播“结束抽奖”。
奖品角色收到这个广播消息以后,就结束抽奖。结束时,我们使用了一个巧妙的指令“停止角色的其他脚本”,即系统将这个角色中的其他脚本停止掉,也就是说系统会将开始抽奖的那一段无限制循环停止运行。如果停止所有脚本,系统将停止所有角色的脚本,那么开始、结束、小猫咪等角色将被停止运动。我们想用户可以继续抽奖,所以这些角色继续执行。还可以选择停止当前脚本,就是停止收到结束抽奖后的其他脚本,这里其实是没有其他脚本的。如果不想使用这个指令,那就要使用一个全局变量了。变量功能,将在后续课程中介绍。
2. 对结束角色进行广播
奖品一开始设置为隐藏。当点击结束时,结束抽奖,奖品收到结束抽奖消息时,停止该角色的其他脚本。即只停止奖品这一个角色的脚本。奖品运动结束,小猫和西瓜等其他角色仍然在动不受影响。
点击结束八边形角色,脚本—控制,如下图,
只有点击系统自带的右上角脚本旁边的停止按钮时,才会停止全部角色的脚本。
以后的提升练习:添加播放声音,比如添加开始和结束时的声音。
本章重点:
1,造型:每一个角色可能有一个或多个造型。
2,切换造型:如果不想变化很快,添加等待指令。
3,随机:随机找一个造型:对造型进行数字编号,添加随机指令,将造型切换为在1-X之间随机选择一个数。
4,广播:广播就是让一个角色喊一声,对方收到广播后执行命令。
原文始发于微信公众号( 艾博特 ):少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播|
少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘
上周的宇宙大战射击游戏中,我们只完成了宇宙飞船发射子弹的部分。还未制作敌对方。这周制作了敌方-飞龙,飞龙随机在屏幕上方出现,如果被子弹打中,则得分,飞龙和子弹都消失。
敌方:飞龙;计分。
目的
目的:制作射击游戏的敌方-吐火的飞龙。当子弹碰到飞龙时,飞龙被消灭,同时增加分数。
实现方式
克隆依然是重要的操作。 每一只飞龙出现时,都需要先克隆一份,然后设定一定的随机方向,从屏幕上方往下移动。为了让飞龙有飞的感觉,我们切换飞龙的造型。飞龙在普通造型和吐火的造型中来回切换。
如果碰到子弹(闪电),则删除飞龙的克隆体。系统设置了一个全局变量,记录分数,飞龙被打中后,分数增加10.
为了让其他角色能够接受到打中的命令、播放声音,还需要使用广播消息。对方接收到广播消息后,采取一定的动作。
宇宙飞船移动,打中加分。
子弹:克隆,发射前移到飞船上。
制作步骤
第一步:飞龙。
1. 加入飞龙角色
2. 设置开始事件
3. 直接重复执行,无限循环
4. 每一次循环都克隆一个飞龙,因此循环里面可以增加等待2秒。如果等待时间过短,飞龙就会很多,难度就会增加。如果克隆体过多,会导致系统性能变慢。
5. 从屏幕上方往下方飞行,因此Y直接固定为180,即顶部。然后X位置在-240和240中随机选择一个数字。
6. 然后随机设定一个方向,135到255方向。
7. 然后即可以重复执行,每次移动3步。移动的步数越大,飞龙就飞得越快。
8. 判断:根据X和Y轴数值判断,如果飞龙飞出屏幕,则删除飞龙克隆体。
9. 判断:如果碰到子弹,则删除克隆体,同时广播“打中了”。
10. 如果碰到宇宙飞船,则删除克隆体,同时广播“游戏结束”
11. 一个循环以后,可以切换一次造型。这样飞龙就有飞舞的感觉了。
飞龙:克隆,碰到子弹就消失,出屏幕后也消失。
第二步:分值计算
12. 需要增加一个全局变量。放在宇宙飞船上。当收到“打中了”的消息时,该变量增加10.
后续改进
13. 后来,我们增加了一个球,即每次宇宙飞船会发出一个球和一个闪电,在球的发射中,改变造型,飞行过程中,球的颜色就不断变化。但似乎克隆体太多了,系统速度变慢,不够顺畅了。
14. 可以在游戏结束以后,更换背景,显示游戏结束的场景,播放游戏结束的声音。
相关知识
今天在白板上介绍了用到的一些控件。通过举例,理解每个控件的意义。
1. 角色:飞龙、飞船、闪电等
2. 舞台:这个有点复杂,要介绍清楚X轴和Y轴。最终提问,例如如果飞龙要往右移动,X和Y如何变化。往右上角、右下角、左上角、左下角等。
第一次结束Scratch时,联系了碰到边缘以后返回到原点,即设置X或Y的初始值。然后不停循环。
3. 运动:
a. 移动到X,Y;
b. 设定方向??度;0度朝上,90度朝右,180度,朝下,-90度,朝左。和时钟类似。
c. 移动到??对象上,例如子弹发射时,移动到宇宙飞船上。第二次的接球游戏中,我们让一块板跟随鼠标左右移动,用到了移动到鼠标的操作。
d. 将X坐标增加??,正为右移,负为左移
e. 将Y坐标增加??,正为上移,负为下移。
4. 外观
a. 显示
b. 隐藏
c. 将角色大小设定为??
5. 控制
a. 重复执行:无限制,一直执行
b. 重复执行??次,做完指定次数以后,就结束循环了。
c. 如果…那么…:我们举了好些例子,一个角色从左到有移动,到右边X》230,就不让继续移动,直接将X设定为-230,就能回到起点。
d. 如果…那么…, 否则
e. 克隆(自己、其他角色):克隆是非常重要的,就是复制一份出来,每一份都可以单独操作。
f. 克隆体启动时,例如往下飞行,往上飞行。
g. 当克隆体碰到边缘或其他角色时,可以删除本克隆体,广播消息。
分享地址:https://scratch.mit.edu/projects/196376484/
浏览器中需要Flash播放器。
原文始发于微信公众号( 艾博特 ):少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘|
少儿编程Scratch第二讲:奇妙的接球小游戏
上周末的Scratch初次尝试给小孩留下了深刻的印象。我们还是约定,如果这周好好表现,则周末可以做一个发射炮弹之类的小游戏。有了这个动力,小孩也就“乖”多了。早上起来,饭后玩了一会积木,然后我带着学习识拼音写汉字。完成了已经打印好的两页,几十个字还是有的。然后复习数学,把数学书上的一些练习做好。两个小时很快就过去了。中午吃过饭以后,小孩没有还没有午睡的习惯,那就开始Scratch。
今天的练习还是比较复杂的,所以依然不能独自完成这些任务。估计二三年级的学生能够独立完成。这次程序的主要目的是,通过手把手的脚本制作,实现一个简单的游戏,激发小孩对这个工具的兴趣。
目的
目的:找一个球、水果或物品,从屏幕顶部位置按照随机的方向落下;屏幕下方设置一块板,板可以跟随鼠标左右移动;如果球落下时碰到板,球即往上按照随机的角度反弹;球触碰到边框以后,折返,继续落下;玩家继续移动鼠标接球。如果没有接住,球则掉入下面的火坑,游戏结束。
https://scratch.mit.edu/projects/196363356/ 最终效果可以参考这个网址。
实现方式
根据上次学习的技能,添加了一个球的角色,但后来并没有选择球,而是选择了橙子,然后选择一个按钮板,后选择了一根红线,球碰到红线游戏即结束。后来我在网上找了一个熊熊烈火的图,在红线下方加了烈火图。意思是球碰到红线了,掉入火坑中烧掉了,游戏结束了。
第一步:红线和烈火是固定的,最为简单,什么脚本都不需要。
第二步:设置角色按钮板的程序脚本:
1. 设置开始事件
2. 直接进入无限制循环
3. “移动”到“鼠标”,这一个控件即可实现角色跟随鼠标移动;
4. 设置按钮板的Y轴固定位-95,即实现只能左右移动,不能上下移动
5. 运行测试。鼠标左右移动,按钮板也跟着左右移动
“移动到”是一个很重要的动作,可以移动到随机位置,即打地鼠一样随机出现,也可以跟随鼠标移动,还可以移动到其他角色的位置上。
第三步:设置角色橘子的脚本,这是最复杂的部分。当然可以先从简单开始,逐步加入复杂一些的功能。
1. 设置开始事件
2. 位置设置为舞台上放,所以选择了“移动到X:随机数,Y:180”,横轴选择从-240到240随机选择一个数。
3. “面向XXX方向”:橘子开始运动前,需要确定运行的方向,可以在一定范围内让系统随机选择一个方向。XXX这里可以让系统随机选择一个某范围内的数字。
因此,我们使用了运算中的“在XX到XXX中随机选择一个数”,我们设置了135到255。
初始化就做好了,下面开始循环往前移动。
4. 然后进入无限制循环
5. 首先我们需要让橘子往前走,因此需要使用“移动5步”。通过修改每次移动的步数,可以实现橘子移动的速度,增加游戏的难度。经过测试,速度为10比较合适,速度为15-20,难度就大一些了。
6. 移动之前,我们就可以判断是否碰到了按钮板角色。因此我们需要增加一个“如果…那么…”的判断。 如果“碰到XX”,那么,就改变方向,这时候方向要朝上,所以选择在-65到65度角度上随机选择一个方向;然后继续往前移动。
7. 球在往上运动时,会碰到舞台边缘,执行“碰到边缘就反弹”的动作。
8. 如果不接住橘子,橘子将继续往下,直到碰到红线角色,游戏停止。所以这里需要增加一个判断,如果“碰到红线角色”,则说话“没接住,游戏结束啦!!”,这个提示话语停留1秒钟。
9. 移动50步,这样橘子,就从掉入下方火焰中了。
增加声音
后来我们增加了声音:
1. 在橘子碰到按钮板的时候,播放声音POP;
2. 在碰到红线游戏结束时,播放咚咚咚,可以选择演奏的乐器-钢琴、小提琴、鼓等,然后弹奏何类鼓声,持续多少节拍,中间可以添加几节拍的休止符,实现咚、咚、咚的效果。
后来我们增加了沙漠的背景图
后续改进
1. 增加计分器,没接住一次球,就增加1分,这样可以进行比赛了;
2. 设置游戏难易程度:大人、中学生、小学生、幼儿园小朋友(高中低),选择高中低以后,设置橘子移动的速度。
完整的图。
演示地址:
https://scratch.mit.edu/projects/196363356/
总结:
这些学习了不少内容:
- “移动到-鼠标、或者某个角色”上
- 随机产生某个范围内的数字;
- 设定角色运动的方向;
- 碰到边缘就反弹
- 播放声音POP
- 设置演奏器材为XXX
- 演奏某个音节、节拍
原文始发于微信公众号( 艾博特 ):少儿编程Scratch第二讲:奇妙的接球小游戏|
Python自动化之试卷生成器
我们要做什么
我们想要生成多份试卷,试卷的内容是问中国的一些省的省会城市是哪个,形式为选择题,例子如下:
1.湖北省的省会是哪个城市?
A.长沙
B.石家庄
C.武汉
D.合肥
每份试卷题目数量一样,但是排序随机,一共要生成几十份(根据学生数量来)。
每道题的四个选项中的正确答案的分布也是随机的。
因为自己手动出题的话太无聊,所以想让Python帮忙实现自动化。
|
本例子中只生成10份试卷及相应的答案,一共六道题(后期是可以对题目进行扩充的)
解决思路
一、数据结构
先将问题和答案保存在一个字典中,如下:
questions={
‘江苏’:’南京’,
‘安徽’:’合肥’,
‘湖南’:’长沙’,
‘湖北’:’武汉’,
‘河南’:’郑州’,
‘河北’:’石家庄’
}
因为要使用随机,所以导入随机模块
import random
|
二、生成试卷
1.因为我们要生成10份试卷及答案所以需要一个循环和一个生成试卷函数(先不管试卷生成函数如何实现),先搭框架。
for paperNum in range(10):#生成10份试卷及答案
creatPaper(paperNum)#生成试卷及答案函数
|
2.开始写生成试卷函数:creatPaper(paperNum)
因为该函数需要生成试卷和答案文本,所示需要用到Python的open函数来分别生成试卷文件和答案文件。
questionPaper=open(‘地理测试试卷%s.txt’%(paperNum+1),’w’)
answerPaper=open(‘测试试卷%s的答案.txt’%(paperNum+1),’w’)
|
接下来就是要向这两个文件中写入问题和答案了,写问题的时候需要用到字典的键,比如:江苏省的省会是哪个城市?所以我们用一个列表来保存这些键。
provinces=list(questions.keys())
random.shuffle(provinces)
|
Random.shuffle()函数是为了打乱列表中的元素,如果不打乱的话那么每张试卷的题目顺序就都一样了。
接下来需要为每张试卷开头写上班级、姓名等信息,我们将其放在一个函数creatTitle(questionPaper,paperNum)中,先不管其如何实现。
接下来就是要写问题了,因为一共生成六个问题所以需要一个循环:
for questionNum in range(len(questions)):#生成指定数量的题目和答案
creatQuestion_Answer(questionPaper,answerPaper,questionNum,provinces)
|
先不管creatQuestion_Answer()这个函数如何实现,其要实现的功能是向试卷中写入测试题,同时向答案文件中写入正确的答案。
最后便是关闭试题文件和答案文件:
questionPaper.close()
answerPaper.close()
|
完整的的代码如下:
def creatPaper(paperNum):
questionPaper=open(‘地理测试试卷%s.txt’%(paperNum+1),’w’)
answerPaper=open(‘测试试卷%s的答案.txt’%(paperNum+1),’w’)
provinces=list(questions.keys())
random.shuffle(provinces)
creatTitle(questionPaper,paperNum)
for questionNum in range(len(questions)):#生成指定数量的题目和答案
creatQuestion_Answer(questionPaper,answerPaper,questionNum,provinces)
questionPaper.close()
answerPaper.close()
|
3.在生成试卷的函数中我们有两个函数还没有写
下面先写creatTitle函数:因为这个函数需要向试卷文件中写入数据,所以需要一个试卷文件作为参数questionPaper。
还有需要向试卷文件中写入这是第几份测试卷,所以需要一个试卷编号参数paperNum
代码如下:
def creatTitle(qPaper,paperNum):
qPaper.write(‘-‘*20+’地理测验题:%s’%(paperNum+1))
qPaper.write(‘nn’)
qPaper.write(‘ ‘*20)
qPaper.write(‘姓名:n’)
qPaper.write(‘ ‘*20)
qPaper.write(‘班级:nnn’)
|
接下来就是具体写问题与答案的函数了,因为需要向试卷文件和答案文件中都写入数据,所以需要试卷文件和答案文件这两个参数,同时还需要使用questionNum和provinces来确定正确的答案。
代码如下:
def creatQuestion_Answer(qPaper,aPaper,questionNum,provinces):
correctAnswer=questions[provinces[questionNum]]
wrongAnswers=list(questions.values())
del wrongAnswers[wrongAnswers.index(correctAnswer)]
wrongAnswers=random.sample(wrongAnswers,3)
questionAnswers=wrongAnswers+[correctAnswer]
random.shuffle(questionAnswers)
qPaper.write(‘%s.%s省的省会是哪个城市?n’%((questionNum+1),provinces[questionNum]))
#下面写ABCD选项
for i in range(4):
qPaper.write(‘%s.%sn’%(‘ABCD'[i],questionAnswers[i]));
#下面向答案文件中写入数据
aPaper.write(‘%s.%sn’%((questionNum+1),’ABCD'[questionAnswers.index(correctAnswer)]))
|
完整的代码如下图:
文本如下:
import random
questions={
‘江苏’:’南京’,
‘安徽’:’合肥’,
‘湖南’:’长沙’,
‘湖北’:’武汉’,
‘河南’:’郑州’,
‘河北’:’石家庄’
}
def creatTitle(qPaper,paperNum):
qPaper.write(‘-‘*20+’地理测验题:%s’%(paperNum+1))
qPaper.write(‘nn’)
qPaper.write(‘ ‘*20)
qPaper.write(‘姓名:n’)
qPaper.write(‘ ‘*20)
qPaper.write(‘班级:nnn’)
def creatQuestion_Answer(qPaper,aPaper,questionNum,provinces):
correctAnswer=questions[provinces[questionNum]]
wrongAnswers=list(questions.values())
del wrongAnswers[wrongAnswers.index(correctAnswer)]
wrongAnswers=random.sample(wrongAnswers,3)
questionAnswers=wrongAnswers+[correctAnswer]
random.shuffle(questionAnswers)
qPaper.write(‘%s.%s省的省会是哪个城市?n’%((questionNum+1),provinces[questionNum]))
#下面写ABCD选项
for i in range(4):
qPaper.write(‘%s.%sn’%(‘ABCD'[i],questionAnswers[i]));
#下面向答案文件中写入数据
aPaper.write(‘%s.%sn’%((questionNum+1),’ABCD'[questionAnswers.index(correctAnswer)]))
def creatPaper(paperNum):
questionPaper=open(‘地理测试试卷%s.txt’%(paperNum+1),’w’)
answerPaper=open(‘测试试卷%s的答案.txt’%(paperNum+1),’w’)
provinces=list(questions.keys())
random.shuffle(provinces)
creatTitle(questionPaper,paperNum)
for questionNum in range(len(questions)):#生成指定数量的题目和答案
creatQuestion_Answer(questionPaper,answerPaper,questionNum,provinces)
questionPaper.close()
answerPaper.close()
for paperNum in range(10):#生成10份试卷及答案
creatPaper(paperNum)#生成试卷及答案函数
|
生成的文件如下图: