【转载】利用「字符串连接」,八行代码就能唱首歌 | 亲子课堂 第 12 课

森林

地牢里的关卡主要是偏向锻炼用户的基本语法结构和计算机思维,让大家熟悉极客战记的操作与代码的使用。

来到了森林,关卡将会变得更多更难,同样,到了森林,大家就正式开始接触编程的几大重要知识点:

条件判断
运算符
函数
对象属性

似曾相识的味道

在这里插入图片描述

关卡简介:

「似曾相似的味道」涉及的知识点较多,有字符串的连接,程序的自动化逻辑,还有运算符的使用,利用变量和字符串的连接,实现了循环自动让英雄唱歌的程序,合理利用变量和循环,能让你的程序更具备自动性。

通关展示:

在这里插入图片描述

思路讲解

在这里插入图片描述
查看默认代码,在代码里能看到一大段的英文,给人一种没有翻译完全的恐怖感,但实际上阅读注释就会知道,这一大段的英文,只是英雄需要唱的英文歌谣,我们不需要理解它的意思。

如果此时注释阅读完了,但仍不太清楚本关的任务,还可以直接运行游戏,看看默认代码的运行情况及失败原因。
在这里插入图片描述

从左上角可以看到,本关的过关目标是让英雄跟着大家一起唱歌,但是从实际的运行情况来看,除了第一句: 10 potions of health on the wall! 以外,英雄唱的都跟别人不一样。

因此我们可以按照注释和游戏动画里的模板,为英雄添加代码,让英雄唱的内容跟其他人一样。

从头开始查看动画,观察大块头的歌唱内容:

10 potions of health on the wall!
10 potions of health!
Take 1 down, pass it around!
9 potions of health on the wall!
9 potions of health on the wall!
9 potions of health!
Take 1 down, pass it around!
8 potions of health on the wall!
8 potions of health on the wall!
……

可以看出歌唱的内容似乎具有一定的重复性。

再看看注释给的歌唱模板:
在这里插入图片描述
如果把X当成10,Y当成1,就会发现这四句注释的内容恰好与前四句歌唱内容一模一样。

然后再把X当成9,Y当成1,则又变成了接下来的四句。

因此我们可以分析出,歌唱内容具有一个循环性,每四句一个循环,可以直接使用循环来让英雄唱歌,减轻代码量。

但如果要使用循环又会有一个问题,循环的内容都是设定好的,但实际的歌唱内容,每四句X就会减1,那么这个又该如何实现呢?

还记得在地牢里我们是怎么实现全自动发现敌人攻击敌人吗?

while True:
enemy = hero.findNearestEnemy()
if enemy:
hero.attack(enemy)

利用变量,我们随时发现新的敌人,将它的名字赋入变量里,再让英雄对这个变量发起进攻,这样就用一个变量,实现了发现敌人,攻击敌人,再发现新敌人,再攻击新敌人的程序逻辑。

因此,如果我们想要实现全自动的循环唱歌,我们也可以利用变量。

其实注释里的模板就是给我们最大的提示,模板里的X和Y两个未知数,不正是我们需要设置变量的两个内容吗?
在这里插入图片描述
前两句唱的是X,第三句唱Y,而第四句就是唱X-Y,唱完四句,再让X变量减1,Y不变,开始下一个循环。

明白了过关思路后,那么我们就可以开始动手写代码了。

此时或许会有一个问题,变量如何和字符串混用?

知识点:字符串连接

以往我们说话,输出字符串,有两个方式:

1.直接输出型:
在这里插入图片描述
2.变量间接输出型:
在这里插入图片描述
想要复习一下字符串输出的同学可以回到这篇文章:【转载】用「变量输出」做一个全自动的说话机器人 | 亲子课堂 第 9 课

但从来没有试过变量和字符串同时混用的,你不能把变量加到双引号内,这样它就变成了一个普通的字符,也不能放在双引号外,直接混用会发生报错:
在这里插入图片描述
此时我们就需要使用加号连接符「+」,当我们需要将变量和字符串同时输出的时候,我们就需要将加号连接符「+」放在两个内容的中间,就像这样:
在这里插入图片描述
此时报错就解除了,英雄也能准确说出要说的内容:
在这里插入图片描述
明白了使用方法后,即可开始编写过关代码。
在这里插入图片描述
系统已为我们定义好两个变量,根据第11行的歌唱内容,我们也能分析出potionsOnTheWall对应的正是X,numToTakeDown对应的是Y。

因此我们可以补出后面的代码:
在这里插入图片描述
连接的时候,可千万别忘了用于美观的空格。

写到第16行的时候,你看到了一行陌生的代码,如果你不知道它的作用,可以先将它删去,然后按照自己的思路进行过关,一会我们再对这行代码进行讲解。
在这里插入图片描述
写上最后一句,这时,循环的前四句要歌唱的内容已经写好,接下来如果要进入下一句循环,我们需要将X,也就是potionsOnTheWall减1。
在这里插入图片描述
这样,我们就可以顺利通关了。

但这还并不是完美的通关代码,根据歌谣的内容,其实每一次X减去的数值都是Y的数值,而Y刚好是1,因此我们最后一行就可以直接写X - 1,但这仍然并不完美,因为如果Y的数值改变了,那么我们还要手动更改最后一行的数值,所以我们还可以对代码做一定的修改。

知识点:自增自减运算

看到最后一行代码,我们在这一行里,进行了一个减法的运算,让potionsOnTheWall的值等于potionsOnTheWall - 1,这就是一个自减的运算。

potionsOnTheWall = potionsOnTheWall - 1

因为在代码中,像加减乘除这一类运算式是优先计算的,因此这一行的代码,会先执行potionsOnTheWall - 1 ,然后得出结果,当potionsOnTheWall为10时,这里的结果就会是9。

然后再执行赋值运算「=」,用等号,将结果赋入potionsOnTheWall变量中,这样就实现了potionsOnTheWall变量的自我减少。

由于1和变量numToTakeDown的值是一样的,为了实现更方便的代码,让每次potionsOnTheWall都减去的是numToTakeDown的值而不是我们手动设定的值,我们可以把此处的1,替换成numToTakeDown。
在这里插入图片描述
就像这样,效果也是一样的,而这种自减运算,还有一种缩写形式:

直接把减号,等于号,还有重复的内容省去:
在这里插入图片描述
这也就是我们刚刚删除掉的代码了。

它的作用,就是将potionsOnTheWall自减去numToTakeDown的值,同理也还有自增语句:
在这里插入图片描述
因此我们可以对代码结构优化一下:

在最后一句歌唱前,先进行一次自减,然后potionsOnTheWall的值就减少了1,就可以直接在最后一句歌词里使用potionsOnTheWall变量了。
在这里插入图片描述
此时的代码,就更为灵活精简了。

通关代码

在这里插入图片描述
以上便是森林关卡「似曾相识的味道」的过关教学了~

本攻略发于极客战记
极客战记——学编程,用玩的!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的字符串连接程序: ```c++ #include <iostream> using namespace std; void joinStrings(char* str1, char* str2) { while (*str1) { str1++; } while (*str2) { *str1 = *str2; str1++; str2++; } *str1 = '\0'; } int main() { char str1[100], str2[100]; cout << "Enter the first string: "; cin >> str1; cout << "Enter the second string: "; cin >> str2; joinStrings(str1, str2); cout << "The concatenated string is: " << str1 << endl; return 0; } ``` 在这个程序中,我们定义了一个函数 `joinStrings` 来连接两个字符串。该函数使用两个指针变量 `str1` 和 `str2` 来追加第二个字符串到第一个字符串的末尾。我们首先将 `str1` 指针移到第一个字符串的末尾,然后使用第二个循环将第二个字符串的每个字符复制到 `str1` 指针当前位置,并将 `str1` 和 `str2` 指针同时向前移动,直到第二个字符串的末尾。最后,我们将 `str1` 指针当前位置设置为字符串结束符 `\0`,以确保连接字符串正确终止。 在 `main` 函数中,我们首先定义了两个字符数组 `str1` 和 `str2`,并要求用户输入这两个字符串。然后,我们调用 `joinStrings` 函数来连接这两个字符串,并将连接后的字符串输出到屏幕上。 注意,这个程序没有考虑字符串长度的限制,因此可能存在缓冲区溢出的风险。在实际开发中,我们应该使用更安全的字符串连接函数,如 `strcat_s` 等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值