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中的数字相同,但具有不同的值。

Arduino 随机数

字节

一个字节由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. 实验步骤

  1. 根据原理图搭建电路。

    数码管的A,B,C,D,E,F,G,DP引脚分别接入开发板的数字管脚7,6,5,10,11,8,9,4。数码管公共端接限流电阻,电阻另一端接GND。

    实验原理图如下图所示:

    Arduino基础入门篇15—随机骰子
    实验原理图g

    实物连接图如下图所示:

    Arduino基础入门篇15—随机骰子
    实物连接图
  2. 新建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    {11111100 },          //0
    23    {01100000 },          //1
    24    {11011010 },          //2
    25    {11110010 },          //3
    26    {01100110 },          //4
    27    {10110110 },          //5
    28    {10111110 },          //6
    29    {11100000 },          //7
    30    {11111110 },          //8
    31    {11110110 },          //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. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

    Arduino基础入门篇15—随机骰子
    程序下载

3. 实验现象

随机显示0到9之间的数字。

Arduino基础入门篇15—随机骰子
实验现象

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)。


Arduino基础入门篇15—随机骰子

扫码加入微信公众号:TonyCode


原文始发于微信公众号(

TonyCode

):Arduino基础入门篇15—随机骰子

|

少儿编程Scratch第13讲:九九乘法问答

目的

目的:通过编写一个简易的九九乘法问答程序,理解变量、问答和广播。本想编写一个输出九九乘法表的程序,以便能够练习循环、克隆和对象的相对位置。最后决定先做一个乘法问答小程序。
 
适用对象:适合有一定初步Scratch编程经验的用户,例如一二年级学生。在家长指引下学员能独立完成大部分功能,用时约3小时。
 
本游戏共享在:https://scratch.mit.edu/projects/211180722/
 
 
少儿编程Scratch第13讲:九九乘法问答
 

 

微信订阅号:ABO_CRM

实现方式

九九乘法问答思路:
1)        点击魔术师出题,系统从1-9随机选择两个数,并且相乘,得到答案。
2)        魔术师显示被乘数、乘于的操作符、乘数、等于,然后显示问号。
3)        魔术师随机询问,答案是多少,显示录入框。
4)        用户录入答案。 系统判断用户录入是否和系统计算一致;
                 i.     一致:隐藏问号,显示录入的值;显示正确打钩角色;
                ii.     不一致: 隐藏问号,显示录入的值;显示错误打钩角色。
5)        用户点击“查看答案”按钮。

a.     系统显示“正确答案”标签;

b.     在旁边显示正确答案。这样用户可以将自己录入的值和系统答案相比较。

 
少儿编程Scratch第13讲:九九乘法问答
 

 

 

少儿编程Scratch第13讲:九九乘法问答
 

 

 

 

  • 变量设置

定义四个变量,均为全局变量。

  • 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

 
少儿编程Scratch第13讲:九九乘法问答
 

 
3. 显示答案角色(Answer)
 
1)        当这个按钮被点击时,广播两个消息:隐藏问号、显示“正确答案”的标签、显示答案变量。
2)        问号角色收到后隐藏问号。其实之前如果用户有录入的话,已经会隐藏掉,显示用户实际录入的值了。
 
少儿编程Scratch第13讲:九九乘法问答
 

 
4. “正确”角色
 
1)        收到回答正确的广播时,显示。
2)        收到回答错误的广播时,隐藏。
3)        收到显示问号时,即出题完毕,也要隐藏。
 
少儿编程Scratch第13讲:九九乘法问答
 

5. “正确答案”标签角色
 
4)        这是一个标签,标签是一个图“正确答案”。
5)        程序开始时隐藏。
6)        点击魔术师出题时会隐藏;点击“Answer”按钮显示答案时会显示。

 

少儿编程Scratch第13讲:九九乘法问答

 

后续改进

 

1)        增加难易程度按钮,高中低三挡。选择高,则从20-99随机;选择中,则从10-19随机;选择低,从1-9随机。
2)        将用户录入的值,按照图片角色的形式显示出来。因为显示变量的样式是固定的,过于简单,通过显示图片,可以实现各种效果。

原文始发于微信公众号( 艾博特 ):少儿编程Scratch第13讲:九九乘法问答|

少儿编程Scratch第七讲:字母雨打字练习

已经有些天没能更新Scratch的文章了。周末依然会带小孩玩一会Scratch,实现一些功能,主要是完善第四讲中的射击游戏,实现了敌方,制作了得分。后来还实现了双人版,两个人一起玩,各自得分。这周的练习是字母雨打字练习。所用技术和之前类似,克隆、移动、随机,算是巩固相关知识。

目的

制作字母打字游戏。字母随机从屏幕上方出现并往下坠落,坠落过程中,按下对应的字母键,该字母即消失,得分。

少儿编程Scratch第七讲:字母雨打字练习

[结果运行图]

实现方式

主要技术是克隆、移动和随机。本游戏只需设置一个角色,里面包含26个字母造型。开始时,每隔一段时间即克隆该角色本身,克隆体启动时,不停往下移动。监控是否有按键按下,按下以后,对应的克隆体消失。为了让字母从屏幕不同位置出现,因此对于角色的X轴需要随机取值。

制作步骤

第一步:添加角色和造型。

1.    加入一个字母角色

2.    在这个角色中,按字母顺序依次加入其它25个字母造型,总共有26个造型。

少儿编程Scratch第七讲:字母雨打字练习

【角色,我们重命名了造型,但其实并没有什么用。获取造型时,得到的是造型编号,而不是名称】

 

第二步:克隆角色,坠落。

3.    开始后重复执行,无限循环

4.    每一次循环都克隆一个字母角色,因此循环里面可以增加时间,如等待2秒。等待时间越短,克隆的字母就越多。

少儿编程Scratch第七讲:字母雨打字练习

 

5.    克隆体出现以后,进入循环,X轴保持不变,Y轴不停减少。即将到达屏幕时,删除克隆体。

少儿编程Scratch第七讲:字母雨打字练习

 

 

第三步:接受按键,消除字母

6.    新设一个克隆体启动事件,启动即不停循环检查是否有按键。(一个无限大循环后面就不能添加其他代码,因此需要另起炉灶,新增一个克隆体启动事件)

7.    如果A被按下,判断那造型编号是否为1,如果是1,则计分,并且删除克隆体,增加得分。造型获取中并没有获取造型名称的语句,只有获取造型编号的语句,因此造型需要按顺序排列。

少儿编程Scratch第七讲:字母雨打字练习

 

第四步:随机字母

8.    克隆自身之前,将造型切换为1-26的随机数字,即在26个字母中随机选择一个字母。如果不进行随机处理,那么字母将按顺序依次出现。

后续改进

本打字练习,仅随机选取26个字母。在实际的英语录入是按照单词句子进行的。如果能够存储一定数量的单词,然后依次显示某个单词中的字母,形成单词中的字母雨,那将更贴近实际。同时在应用技术上,能更上一层楼。

分享地址:https://scratch.mit.edu/projects/209062172/

浏览器中需要Flash播放器。

 

原文始发于微信公众号( 艾博特 ):少儿编程Scratch第七讲:字母雨打字练习|

少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播

 

 

目的

目的:抽奖游戏运行时会不断的快速切换很多奖品,点击停止,画面停在某个奖品上,即为用户所抽到的奖品。这节课学习如何制作抽奖游戏。通过抽奖游戏,理解背景、角色、造型、随机和广播的功能。
 
少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 

适用对象:适合一年级初学者使用。在老师指导下,学员基本能够独立完成。
背景:之前给小孩玩过一会“果果老师”编写的抽奖游戏。一天下班回来后,小孩跟我说他自己做了一个抽奖的游戏。我很惊讶,不大相信。开机,检查,还真的是一个很不错的抽奖的程序。当然这是一个简单的抽奖游戏,还有很多可以改进的地方。因此我就顺着这个抽奖游戏雏形,逐步深入讲解和制作抽奖游戏。
 
本游戏共享在:https://scratch.mit.edu/projects/200876858/
MITScratch是一个社区,可以共享程序,其他人可以查看代码,进行改进(Remix)。虽然访问MIT的网站会慢一点,但我们已经习惯在网上直接制作程序,不安装和使用客户端Scratch软件了。
微信订阅号:ABO_CRM
 
 

少儿编程-Scratch

·     少儿编程Scratch第五讲:练习一坐标和移动

·     少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘(2018.01)

·     少儿编程Scratch第三讲:宇宙大战.枪战游戏(2018.01)

·       少儿编程Scratch第二讲:奇妙的接球小游戏(2018.01)

·       Scratch第一讲:Scratch完美的初体验(2018.01)

 

 

实现方式

最简单的抽奖游戏:这一个版本就是小孩自己琢磨出来的。即将所有的奖品都放在一个角色中,然后点击绿旗子开始时,立即进入一个大循环,然后在循环里面不停的切换造型。点击结束时,系统就会将奖品停在某个造型上,就是最后的奖品。因此只需要三个指令:开始、循环、下一个造型。
 
抽奖游戏逐步改进:上述抽奖游戏是最简单的版本,是有一些缺陷的。
第一个大问题是奖品的出现不是随机的,是依次按顺序更换造型。虽然小孩加入了42个造型,但是每次运行时,系统是按已经固定的礼品顺序抽取的。这不大公平,因为用户可以记住奖品的大概顺序。虽然奖品跑得很快,但还是能够知道奖品的前后大概顺序的。要解决这个问题,就需要使用随机的功能。即从两个数字之间随机挑一个数字。Scratch提供了“在XXYY之间随机选一个数字”的功能。在更换造型中,可以使用“更换造型XX”。要使用随机数,就要把角色的造型重新命名为数字,否则以前的英文单词形式,是不能随机抽取的。其实我们之前看的“果果老师”的抽奖程序也是没有使用随机功能的。
 
第二个问题是抽奖的开始和结束问题。现在的抽奖是使用系统的开始结束按钮。如果需要在游戏页面内部自己制作按钮,然后点击开始按钮即开始抽奖,点击停止按钮就停止。用户可以多次点击开始和结束。因为按钮和奖品属于两个角色,因此要使用广播功能,开始按钮通知奖品开始摇奖,停止按钮通知奖品停止摇奖。
 
第三个问题是一个小问题。小孩自己做的抽奖程序中,一开始奖品就是显示的。实际抽奖过程中,奖品肯定是先隐藏的。这个改进很简单,即程序开始时,将奖品设置为隐藏,抽奖开始的时候才显示出来。
 
第四个问题是后续改进。抽奖是一个激动人心的过程,因此通常要增加激动人心的音乐,停止的时候,还可以切换一些灯光,播放停止的音乐。切换灯光可以通过变更背景实现。播放音乐的功能打算放到以后课程内再讲。
 
功能1:角色(孩子已熟悉)
一个图片或物品都可以作为角色,角色有一个脚本,程序写在角色的脚本中。这是Scratch的基本功能。
可以新建角色,默认角色是一个小猫咪。先删除小猫角色,系统提供了动物、奇幻、字母、人物、物品、交通等角色分类。
例如我们添加了小绿旗子和停止按钮两个角色。“当小绿旗子被点击”,就是开始按钮,然后执行一些操作,即开始抽奖。点击停止按钮时,抽奖结束。再次点击开始按钮,可以重新抽奖。
 
功能2:造型
每一个角色可能有一个或多个造型。造型是实现动画效果的重要方式。例如角色“猫”。猫有两个角色,通过切换造型实现小猫奔跑的动作,切换造型会实现动画的效果。在一个角色中放多个造型是Scratch的常用方式,否则可能会编写很多重复的代码。例如实现0-9数字加减法,打字程序a-z 26个字母,如果每个数字或字母都设置成单独的角色,那么这些角色中很多代码是完全相同的。使用一个角色,然后加上克隆功能,就可以实现打字、加减法游戏。
 
例如,在该抽奖游戏中“旗帜”的造型分两个,一个正的一个斜的。见下图所示,
 

少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 
 

切换时产生运动的效果,旗帜摇动起来。系统中的小旗子其实是只有一个造型的。讲解了可以复制一个出来,然后稍作调整,例如旋转一定的角度。然后切换造型,就可以实现一定的动画效果。
 
 

少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 

<小猫的两个造型,不停的切换造型,看上去,小猫就奔跑起来了。>
 
系统指令:下一个造型,实现切换功能。
 

 
少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 

下面通过造型做出抽奖游戏。这个版本也就是小孩自己制作的最原始的抽奖游戏版本。这个脚本放在奖品上,一个大循环,然后下一个造型,没有随机。奖品即不停循环显示,点击停止,就会停在某一个奖品上。
然后同理,将这个脚本放在小猫咪角色上,小猫咪就跑动起来了。当然如果不加等待时间,小猫咪的跑动就实在是太快了,快被累坏了。因此设置了等待0.1秒,才更换下一个造型。这样小猫咪的跑动就会正常一些。
 
 

制作步骤

第一步:选择舞台背景:这个舞台背景是小孩自己选的。
 
少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 

 
 

加入了小猫咪,在不停的跑动;加入了一个西瓜,西瓜也切换造型。说这是小猫咪在吃西瓜。然后加入了雪人,说雪人和小猫咪在舞台前面观看抽奖。加入了两个雪花角色,当装饰使用。这些是小孩自己加上去的。
 
后来我们在改进环节,加入绿旗子开始按钮,和橙色的停止按钮。绿旗子和停止按钮都复制了一个造型,稍微转动一下,实现动画效果。这样程序开始时,就知道这两个地方是可以点击了。
 
第二步:设置奖品角色的造型

1.   首先随便选择一个物品作为奖品角色。然后在这个角色中增加其他造型,即其他奖品。

【操作步骤】选择奖品角色,“从造型库中选取造型”。选多少个即有多少个奖品。这些造型都同属于一个角色。如下图所示,
 
 

少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 

孩子添加了42个造型,这42个造型都同属恐龙这一个角色,随着奖品的切换,角色上的图也会跟随切换。
 

 
少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 

2.     为了使用随机函数,我们造型进行数字编号,更改造型名称为数字。选中造型,右上角更改录入数字,按照顺序录入数字即可。

少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 

 
问题:目前多个造型是按顺序排列执行切换,不是随机的。能够猜出奖品,可以控制奖品。我们要做成随机的。所以要进行以下拓展操作。如果在更换造型中增加等待2秒,那么能够很明确的看到,系统是按顺序更换造型的。加入随机功能以后,系统就从42个奖品造型中随机抽取一个了。用户就无法猜测系统下次将显示哪一个奖品了。
微信订阅号:ABO_CRM
 
第三步:设置随机显示造型

1. 随机的介绍:即系统中提供这样的指令,从一个数到另外一个数之间随机选一个数。例如,如果有42个造型,每次都是从中随机挑选一个。因此,需要从142中,随机挑选一个数字。

2. 【操作】点击奖品角色的脚本,添加“将造型切换为在1-42之间随机选择一个数”。我们需要将随机数放在造型切换指令中。因此我们需要将这两个指令拼在一起。这是一种很常用的方式,需要熟练掌握。

少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播

 

开始时,请先忽略广播。在最简单的抽奖游戏中,也可以使用这个随机功能。
【操作步骤1】点击脚本—外观,选择少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 

【操作步骤2】点击脚本—运算,添加指令 少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 

造型是有编号的,系统默认编号为英文字母,我们之前对造型进行编号,该游戏中有1-42个造型编号。已更改编号为1-42
 
【操作步骤3】把少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播拖到少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播中。即
少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 

 

这样,每次执行就会随机显示一个造型。
 
第四步:实现对奖品角色的开始和结束广播功能。(如果不自己制作按钮实现开始和结束的话,抽奖程序会简单很多。)
Scratch中,角色就是我们需要使用程序操作的对象。角色和角色之间是相对隔离的。如果一个角色需要通知另外一个角色要做什么事情,那么我们可以使用“广播”的功能。“广播”就是对程序中每个角色“大喊一声”,这样其他角色才能听到,听到以后,他们就去做一定的事情。否则别的角色是不知道其他角色要他做什么的。在这里,开始和结束是两个按钮角色,点击以后,要告诉奖品角色,开始或结束抽奖。开始按钮喊“开始抽奖”,抽奖的角色接收到这个消息以后,就显示奖品,开始抽奖。结束按钮喊“结束抽奖”,抽奖的角色接收到这个消息以后,就停止抽奖,显示抽中的奖品。
 
目的,用点击按钮的方式实现对一个角色的开始结束动作。

1. 添加旗帜图标角色少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播表示开始;

2. 添加八边形图标角色少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播表示结束。

3. 设置造型,开始和结束角色图标都有两个造型,切换造型产生动画效果。

 
4. “等待”操作:点击新增的开始按钮时,奖品角色开始快速变化。如果不想让它动那么快,在脚本控制中选择少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播

,例如更改时间为0.1秒。



要设置等待多少秒。就不会变化太快。
 
功能3:广播

1. 对开始角色进行广播

例如,开始的时候要告诉角色奖品开始抽奖了,当角色被点击这个事件开始时,做一个广播,即喊一声开始抽奖。通过广播的形式,对方(奖品)接到抽奖信息开始随机切换奖品。广播就是让一个角色喊一声。
广播可以新建消息,比如让小旗帜喊一声开始抽奖,奖品收到信息后便开始切换造型。
点击开始旗帜角色少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播,脚本—控制,如下图,少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 

 
当开始角色被点击时,广播“开始抽奖”。
奖品角色收到这个广播消息以后,就开始抽奖。
少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 
当结束角色被点击时,广播“结束抽奖”。
奖品角色收到这个广播消息以后,就结束抽奖。结束时,我们使用了一个巧妙的指令“停止角色的其他脚本”,即系统将这个角色中的其他脚本停止掉,也就是说系统会将开始抽奖的那一段无限制循环停止运行。如果停止所有脚本,系统将停止所有角色的脚本,那么开始、结束、小猫咪等角色将被停止运动。我们想用户可以继续抽奖,所以这些角色继续执行。还可以选择停止当前脚本,就是停止收到结束抽奖后的其他脚本,这里其实是没有其他脚本的。如果不想使用这个指令,那就要使用一个全局变量了。变量功能,将在后续课程中介绍。
 

2. 对结束角色进行广播

奖品一开始设置为隐藏。当点击结束少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播时,结束抽奖,奖品收到结束抽奖消息时,停止该角色的其他脚本。即只停止奖品这一个角色的脚本。奖品运动结束,小猫和西瓜等其他角色仍然在动不受影响。
点击结束八边形角色,脚本—控制,如下图,
少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播
 

只有点击系统自带的右上角脚本旁边的停止按钮时,才会停止全部角色的脚本。
 
以后的提升练习:添加播放声音,比如添加开始和结束时的声音。
 
本章重点:

1,造型:每一个角色可能有一个或多个造型。

2,切换造型:如果不想变化很快,添加等待指令。

3,随机:随机找一个造型:对造型进行数字编号,添加随机指令,将造型切换为在1-X之间随机选择一个数。

4,广播:广播就是让一个角色喊一声,对方收到广播后执行命令。

 

原文始发于微信公众号( 艾博特 ):少儿编程Scratch第六讲:抽奖游戏之造型、随机和广播|

少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘

 

上周的宇宙大战射击游戏中,我们只完成了宇宙飞船发射子弹的部分。还未制作敌对方。这周制作了敌方-飞龙,飞龙随机在屏幕上方出现,如果被子弹打中,则得分,飞龙和子弹都消失。
少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘
敌方:飞龙;计分。
 

目的

目的:制作射击游戏的敌方-吐火的飞龙。当子弹碰到飞龙时,飞龙被消灭,同时增加分数。
 

实现方式

克隆依然是重要的操作。 每一只飞龙出现时,都需要先克隆一份,然后设定一定的随机方向,从屏幕上方往下移动。为了让飞龙有飞的感觉,我们切换飞龙的造型。飞龙在普通造型和吐火的造型中来回切换。
如果碰到子弹(闪电),则删除飞龙的克隆体。系统设置了一个全局变量,记录分数,飞龙被打中后,分数增加10.
 

为了让其他角色能够接受到打中的命令、播放声音,还需要使用广播消息。对方接收到广播消息后,采取一定的动作。
 

 

少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘
宇宙飞船移动,打中加分。
 

 

少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘
子弹:克隆,发射前移到飞船上。
 

制作步骤

 

第一步:飞龙。
1.    加入飞龙角色
2.    设置开始事件
3.    直接重复执行,无限循环
4.    每一次循环都克隆一个飞龙,因此循环里面可以增加等待2秒。如果等待时间过短,飞龙就会很多,难度就会增加。如果克隆体过多,会导致系统性能变慢。
5.    从屏幕上方往下方飞行,因此Y直接固定为180,即顶部。然后X位置在-240和240中随机选择一个数字。
6.    然后随机设定一个方向,135到255方向。
7.    然后即可以重复执行,每次移动3步。移动的步数越大,飞龙就飞得越快。
8.    判断:根据X和Y轴数值判断,如果飞龙飞出屏幕,则删除飞龙克隆体。
9.    判断:如果碰到子弹,则删除克隆体,同时广播“打中了”。
10.  如果碰到宇宙飞船,则删除克隆体,同时广播“游戏结束”
11.  一个循环以后,可以切换一次造型。这样飞龙就有飞舞的感觉了。
 

少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘
飞龙:克隆,碰到子弹就消失,出屏幕后也消失。
 

 

 

第二步:分值计算
12.  需要增加一个全局变量。放在宇宙飞船上。当收到“打中了”的消息时,该变量增加10.
 

后续改进

13.  后来,我们增加了一个球,即每次宇宙飞船会发出一个球和一个闪电,在球的发射中,改变造型,飞行过程中,球的颜色就不断变化。但似乎克隆体太多了,系统速度变慢,不够顺畅了。
 

14.  可以在游戏结束以后,更换背景,显示游戏结束的场景,播放游戏结束的声音。
 

相关知识

今天在白板上介绍了用到的一些控件。通过举例,理解每个控件的意义。
少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘
 

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/   最终效果可以参考这个网址。
 

少儿编程Scratch第二讲:奇妙的接球小游戏
 

实现方式

 

根据上次学习的技能,添加了一个球的角色,但后来并没有选择球,而是选择了橙子,然后选择一个按钮板,后选择了一根红线,球碰到红线游戏即结束。后来我在网上找了一个熊熊烈火的图,在红线下方加了烈火图。意思是球碰到红线了,掉入火坑中烧掉了,游戏结束了。
 

 

第一步:红线和烈火是固定的,最为简单,什么脚本都不需要。
第二步:设置角色按钮板的程序脚本:
1.    设置开始事件
2.    直接进入无限制循环
3.    “移动”到“鼠标”,这一个控件即可实现角色跟随鼠标移动;
4.    设置按钮板的Y轴固定位-95,即实现只能左右移动,不能上下移动
5.    运行测试。鼠标左右移动,按钮板也跟着左右移动
 

少儿编程Scratch第二讲:奇妙的接球小游戏
“移动到”是一个很重要的动作,可以移动到随机位置,即打地鼠一样随机出现,也可以跟随鼠标移动,还可以移动到其他角色的位置上。
 

第三步:设置角色橘子的脚本,这是最复杂的部分。当然可以先从简单开始,逐步加入复杂一些的功能。
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步,这样橘子,就从掉入下方火焰中了。
 

少儿编程Scratch第二讲:奇妙的接球小游戏

少儿编程Scratch第二讲:奇妙的接球小游戏

增加声音

后来我们增加了声音:

1.    在橘子碰到按钮板的时候,播放声音POP;
2.    在碰到红线游戏结束时,播放咚咚咚,可以选择演奏的乐器-钢琴、小提琴、鼓等,然后弹奏何类鼓声,持续多少节拍,中间可以添加几节拍的休止符,实现咚、咚、咚的效果。
后来我们增加了沙漠的背景图

后续改进

1.    增加计分器,没接住一次球,就增加1分,这样可以进行比赛了;
2.    设置游戏难易程度:大人、中学生、小学生、幼儿园小朋友(高中低),选择高中低以后,设置橘子移动的速度。
 

少儿编程Scratch第二讲:奇妙的接球小游戏
完整的图。
演示地址:
https://scratch.mit.edu/projects/196363356/
 

总结:
这些学习了不少内容:

  1. “移动到-鼠标、或者某个角色”上
  2. 随机产生某个范围内的数字;
  3. 设定角色运动的方向;
  4. 碰到边缘就反弹
  5. 播放声音POP
  6. 设置演奏器材为XXX
  7. 演奏某个音节、节拍

 

原文始发于微信公众号( 艾博特 ):少儿编程Scratch第二讲:奇妙的接球小游戏|

Python自动化之试卷生成器

Python自动化之试卷生成器


我们要做什么

 

 

 

我们想要生成多份试卷,试卷的内容是问中国的一些省的省会城市是哪个,形式为选择题,例子如下:

1.湖北省的省会是哪个城市?

A.长沙

B.石家庄

C.武汉

D.合肥

 

 

 

 

每份试卷题目数量一样,但是排序随机,一共要生成几十份(根据学生数量来)。

 

 

 

 

每道题的四个选项中的正确答案的分布也是随机的。

 

 

 

 

因为自己手动出题的话太无聊,所以想让Python帮忙实现自动化。

|

本例子中只生成10份试卷及相应的答案,一共六道题(后期是可以对题目进行扩充的)

解决思路

Python自动化之试卷生成器

一、数据结构

先将问题和答案保存在一个字典中,如下:

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)]))

|

完整的代码如下图:

Python自动化之试卷生成器

文本如下:

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)#生成试卷及答案函数

|

生成的文件如下图:

Python自动化之试卷生成器

Python自动化之试卷生成器