在游戏列出英雄后,玩家必须输入一个数字来进行选择。我们来实现这个功能。首先,需要生成一个问题,其中包含玩家可以选择的数字,然后获取玩家的输入,解析并选择相应的英雄。我们来改进hero_choice.ex文件:
管道的作用依次是:读取英雄名称、显示名称、生成问题、请玩家选择、解析输入数字、找到相应英雄,最后确认玩家的选择。管道以英雄列表开头,以所选英雄结束。现在我们来实现generate_question/1函数:
我们构建了一个从1到元素数量之间的范围(用逗号分隔),生成类似"1,2,3"的字符串。函数显示问题并返回结果。管道的下一步将使用返回结果,调用prompt/1函数。它的工作方式如下:接收参数中的问题,显示问题,等待输入,返回用户的输入内容。用户的输入数字后,我们需要解析它。可以用 parse_answer/1来完成。
它尝试从用户输入中解析出整数,然后减去一以获取英雄的索引值。现在你不必担心用户输入是否正确的问题。第7章将介绍如何处理意外事件。先假设不会出现意外情况。(www.xing528.com)
该程序使用在start/0中定义的find_hero_by_index/1匿名函数来接收已解析的答案并返回英雄。这个匿名函数是必要的,因为我们不能直接在管道中使用 Enum.at/2。Enum.at/2的参数是一个列表,我们需要传递英雄索引值。匿名函数还利用闭包来引用heroes变量。最后一步是确认玩家的选择:
函数confirm_hero/1先清屏,然后显示所选英雄的详细信息,并请玩家确认。Windows用户请用cls替换clear命令。我们使用Mix.Shell.IO中的yes?/1函数获取用户输入,检查它是否为“确定”,并将其解析为布尔值。例如,当用户回答y时,它会解析为true并返回所选择的英雄。如果用户回答n,就递归调用start/0函数重启该过程。运行mix start试试:
我们完成了游戏的第一部分,学习了创建结构体,将不同的代码分隔到不同的命名空间,以及通过命令行界面与用户交互。下一节将给程序增加更多功能。在开发新功能的同时,你将学习重构和使用Elixir协议。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。