课程E-函数2-用函数来制作一个数字宠物

这节课介绍了函数的概念。

  • Computer science
  • functions
Print lesson
  • 年龄 9+
  • 65+ 分钟
  • JavaScript Blocks

介绍

如果你已经忘记了函数是什么并且想要复习一下,请重新回到课程“A SIMPLE FUNCTION FOR A SUPERHERO”(一个超人的简单函数)中的介绍。这是这个系列中第一节关于函数的课程。

我们目前的课程基于“A SIMPLE FUNCTION FOR A SUPERHERO”(一个超人的简单函数)的两个方面。

第一,重申了使用函数来组织代码的重要性。 函数可以使我们用逻辑的方式来组织代码。 我们可以组织代码,以便于我们"看到"我们想要模拟的现实生活中的对象。 这里用宠物的行为进行了再次展示。

第二,我们是基于之前介绍的重新使用代码的好处。 函数可以让我们轻松重用代码。 在这节课中,学生们将会有更多关于这个概念的挑战。 他们被要求识别哪个部分的代码最适合某个函数。 这是挑战3中的内容。

我们的micro:bit课程是根据Code.org CS 基础课程知识应用而量身定做的。 在学生们开始这些课程之前,我们鼓励学生们首先完成所有的CS基础知识。 学生们应该熟悉 Code.org CS 基础课程中的函数。

背景知识

  • 提前体验起点
  • 课程E. CS基础。 课程简要地回顾了一下之前在课程C和D之中讲授的概念。学生们将会用算法、循环、条件、事件和函数来进行编程练习。
  • 课程E-一个超人的简单函数

强烈鼓励老师优先完成以下操作:

教学指南

打开

课堂活动

你将需要这些:

  • 1块micro:bit
  • 1根USB线
  • 1个AAA电池组(可选)
  • 2节AAA电池(可选)

编写文本


function doSomething()  {
    basic.showString("Hello!")
}

doSomething()
            

函数

函数可以让你创建一部分可以在程序中重复使用的代码。


for(let i = 0; i < 5; ++i) {
  basic.showNumber(i)
}
            

for函数

按规定次数运行部分程序。


basic.showLeds(`
    . . . . .
    . . . . .
    . . # . .
    . . . . .
    . . . . .
    `)
            

showLeds

在LED屏幕上显示图片。


input.onButtonPressed(Button.A, () => {

})
            

onButtonPressed

启动一个事件处理器(当事情发生,例如一个按钮被按下,部分程序将会运行)。

basic.showIcon(IconNames.Heart)

showIcon

在LED屏幕上显示所选的图标

basic.pause(100)

暂停

按规定的毫秒数暂停程序。 -


input.onGesture(Gesture.Shake, () => {

})
            

onGesture

启动一个事件处理器 (当发生某件事情时,部分程序将启动)。当你做一个手势的时候(例如:摇晃micro:bit), 这个处理器就会起作用 。

5个步骤

设计我们的宠物

绘制3个5*5的点阵并给盒子上色(显示LED)来显示当你的宠物醒着、睡着以及喝水的时候的样子。

这里我们选择了以下内容,但是你可以选择任何你喜欢的内容。

  1. 笑脸 = 醒着
  2. Z显示4次 = 睡着(当按钮 A 被按下)
  3. 水滴显示4次=喝水(当按钮B被按下)

我们的宠物Herbert(赫尔伯特)将会是一个快乐的小家伙。当它醒着,我们就显示一个笑脸。

有时我们需要睡觉,Herbert(赫尔伯特)也应该这样做。我们用爱抚来使它入睡。按下按钮A,宠物Herbert(赫尔伯特)和ZZZZ(4次闪烁Z)将显示它正在睡觉。

然后,当它入睡的时候(LED灯熄灭),它就安静下来了。 为了叫醒他,我们给它一些水。 Herbert喜欢水,所以我们可以随时给他一些水。 这将会唤醒他并且让它重新回到一个快乐的状态。 我们将通过按下按钮B来给它一些水。一个水滴将会显示它正在喝水,然后它会再次醒来并显示一个笑脸哦!

指导练习

我们将在网上给出micro:bit的教程或代码。接下来,去到:makecode.microbit.org

input.onButtonPressed(Button.B, () => {
    DRINKING()
})
function ASLEEP()  {
    for (let i = 0; i < 4; i++) {
        basic.showLeds(`
            # # # # #
            . . . # .
            . . # . .
            . # . . .
            # # # # #
            `)
        basic.pause(500)
        basic.clearScreen()
        basic.pause(500)
    }
}
function DRINKING()  {
    for (let index = 0; index <= 4; index++) {
        basic.showLeds(`
            . . # . .
            . # . # .
            # . . . #
            # . . . #
            . # # # .
            `)
        basic.pause(500)
        basic.clearScreen()
        basic.pause(500)
    }
    AWAKE()
}
input.onButtonPressed(Button.A, () => {
    ASLEEP()
})
function AWAKE()  {
    basic.showIcon(IconNames.Happy)
}
input.onGesture(Gesture.Shake, () => {

})
function EXERCISE()  {

}
input.onButtonPressed(Button.AB, () => {

})
AWAKE()

Herbert(赫尔伯特)有3个动作。它要么是醒着、睡着或者在喝水。我们给每个动作添加一个函数。

在开始的时候,我们调用显示一个笑脸的函数。Herbert是快乐和清醒的。

按下按钮A调用显示一个闪烁的Z的函数。这意味着Herbert正在睡觉。

按下按钮B调用显示一个闪烁的水滴的函数。这意味着Herbert在喝水。

函数ASLEEP(睡觉)和DRINKING(喝水)之间唯一的真正区别是在末尾。 在函数DRINKING的末尾,我们再次调用函数AWAKE,并且Herbert露出了它的笑脸。 Herbert喜欢喝水。

暂停和清屏可以帮助我们创造一个闪烁的效果。for和repeat循环也有助于创造这种闪烁的效果。

关于这两个函数(ASLEEP和DRINKING)如何工作的细节在这节课程中并不是很重要。 如何放置这些调用的函数和了解如何建立我们自己的函数则是我们这节课的重点。

在挑战完成之前,你可以在此查看完成后的基础代码。

注释:代码底部未使用的积木块将会在挑战赛里面用到。

函数挑战

挑战1

你能让Herbert在按钮A和B同时被按下的时候锻炼吗?

提示:用exercise(锻炼)函数、滑旱冰图标和A+B事件处理器。

查看代码
function AWAKE()  {
    basic.showIcon(IconNames.Happy)
}
function ASLEEP()  {
    for (let i = 0; i < 4; i++) {
        basic.showLeds(`
            # # # # #
            . . . # .
            . . # . .
            . # . . .
            # # # # #
            `)
        basic.pause(500)
        basic.clearScreen()
        basic.pause(500)
    }
}
function DRINKING()  {
    for (let index = 0; index <= 4; index++) {
        basic.showLeds(`
            . . # . .
            . # . # .
            # . . . #
            # . . . #
            . # # # .
            `)
        basic.pause(500)
        basic.clearScreen()
        basic.pause(500)
    }
    AWAKE()
}
input.onButtonPressed(Button.A, () => {
    ASLEEP()
})
input.onButtonPressed(Button.B, () => {
    DRINKING()
})
input.onButtonPressed(Button.AB, () => {
    EXERCISE()
})
function EXERCISE()  {
    basic.showIcon(IconNames.Rollerskate)
}
input.onGesture(Gesture.Shake, () => {

})
AWAKE()

在此查看完成后的代码。

挑战2

你能给Herbert编程,让它在摇晃的时候做一个新动作吗?

查看代码
input.onButtonPressed(Button.B, () => {
    DRINKING()
})
function Silly()  {
    basic.showIcon(IconNames.Rollerskate)
}
function ASLEEP()  {
    for (let i = 0; i < 4; i++) {
        basic.showLeds(`
            # # # # #
            . . . # .
            . . # . .
            . # . . .
            # # # # #
            `)
        basic.pause(500)
        basic.clearScreen()
        basic.pause(500)
    }
}
function DRINKING()  {
    for (let index = 0; index <= 4; index++) {
        basic.showLeds(`
            . . # . .
            . # . # .
            # . . . #
            # . . . #
            . # # # .
            `)
        basic.pause(500)
        basic.clearScreen()
        basic.pause(500)
    }
    AWAKE()
}
input.onButtonPressed(Button.A, () => {
    ASLEEP()
})
function AWAKE()  {
    basic.showIcon(IconNames.Happy)
}
input.onButtonPressed(Button.AB, () => {
    EXERCISE()
})
input.onGesture(Gesture.Shake, () => {
    Silly()
})
function EXERCISE()  {
    basic.showIcon(IconNames.Rollerskate)
}
AWAKE()

在此查看完成后的代码。

挑战3

如果你记得,函数的一个有点是可以编写代码然后轻松地重用它。 看看函数ASLEEP(睡觉)和DRINKING(喝水)。 它们的哪些代码是相同的? 你能给这部分重复的代码创建一个新的函数吗? 将你的函数称作BLINKING(闪烁)。

查看代码
input.onButtonPressed(Button.B, () => {
    DRINKING()
})
function BLINKING()  {
    basic.pause(500)
    basic.clearScreen()
    basic.pause(500)
}
function ASLEEP()  {
    for (let i = 0; i < 4; i++) {
        basic.showLeds(`
            # # # # #
            . . . # .
            . . # . .
            . # . . .
            # # # # #
            `)
        BLINKING()
    }
}
function DRINKING()  {
    for (let index = 0; index <= 4; index++) {
        basic.showLeds(`
            . . # . .
            . # . # .
            # . . . #
            # . . . #
            . # # # .
            `)
        basic.pause(500)
        basic.clearScreen()
        basic.pause(500)
    }
    AWAKE()
}
input.onButtonPressed(Button.A, () => {
    ASLEEP()
})
function AWAKE()  {
    basic.showIcon(IconNames.Happy)
}
input.onButtonPressed(Button.AB, () => {
    EXERCISE()
})
input.onGesture(Gesture.Shake, () => {
    Silly()
})
function EXERCISE()  {
    basic.showIcon(IconNames.Rollerskate)
}
function Silly()  {
    basic.showIcon(IconNames.Rollerskate)
}
AWAKE()

在此查看完成后的代码。

独立练习

调用3种函数创建你自己的micro:bit宠物。插入图标或改变LED灯可以创造出一个新的宠物。准备讲述一个关于这个新宠物的故事已经你选择这些动作的原因。

在此查看起始代码。

问答

在活动和挑战上使用这些问题。

问题 1

使用函数的一大优点是什么?

显示答案

以下这些都是可行的答案

  1. 函数让我们能够重用代码而无须重新输入,这样代码就会更加精简一些。
  2. 如果我们需要作出一些改变,我们只需要在一个地方改动代码就可以了。
  3. 函数能够让我们更好地组织代码。

问题 2

我如何能够在一个函数的"go"(运行)或者"start"(开始)中编写代码?

显示答案

调用一个函数,里面的代码就会"go"(运行)。

问题 3

想想哪些可以用到函数,并列出你可能在函数中添加的东西。例如:一辆车。

显示答案

车的函数

  • 移动
  • 停止
  • 转弯
Selecting this opens external content from our support system, which adheres to their privacy policy.