使用 Elixir 语言编写一个小游戏
创始人
2024-03-02 07:11:08
0

通过编写“猜数字”游戏来学习 Elixir 编程语言,并将它与一个你熟知的语言做对比。

为了更好的学习一门新的编程语言,最好的方法是去关注主流语言的一些共有特征:

  • 变量
  • 表达式
  • 语句

这些概念是大多数编程语言的基础。因为这些相似性,只要你通晓了一门编程语言,你可以通过对比差异来熟知另一门编程语言。

另外一个学习新编程语言的好方法是开始编写一个简单标准的程序。它可以让你集中精力在语言上而非程序的逻辑本身。在这个系列的文章中,我们使用“猜数字”程序来实现,在这个程序中,计算机会选择一个介于 1 到 100 之间的数字,并要求你来猜测它。程序会循环执行,直到你正确猜出该数字为止。

“猜数字”这个程序使用了编程语言的以下概念:

  • 变量
  • 输入
  • 输出
  • 条件判断
  • 循环

这是一个学习新编程语言的绝佳实践。

猜数字的 Elixir 实现

Elixir 是一门被设计用于构建稳定可维护应用的动态类型的函数式编程语言。它与 Erlang 运行于同一虚拟机之上,吸纳了 Erlang 的众多长处的同时拥有更加简单的语法。

你可以编写一个 Elixir 版本的“猜数字”游戏来体验这门语言。

这是我的实现方法:

defmodule Guess do
  def guess() do
     random = Enum.random(1..100)
     IO.puts "Guess a number between 1 and 100"
     Guess.guess_loop(random)
  end
  def guess_loop(num) do
    data = IO.read(:stdio, :line)
    {guess, _rest} = Integer.parse(data)
    cond do
      guess < num ->
        IO.puts "Too low!"
        guess_loop(num)
      guess > num ->
        IO.puts "Too high!"
        guess_loop(num)
      true ->
        IO.puts "That's right!"
    end
  end
end

Guess.guess()

Elixir 通过列出变量的名称后面跟一个 = 号来为了给变量分配一个值。举个例子,表达式 random = 0random 变量分配一个数值 0。

代码以定义一个模块开始。在 Elixir 语言中,只有模块可以包含命名函数。

紧随其后的这行代码定义了入口函数 guess(),这个函数:

  • 调用 Enum.random() 函数来获取一个随机整数
  • 打印游戏提示
  • 调用循环执行的函数

剩余的游戏逻辑实现在 guess_loop() 函数中。

guess_loop() 函数利用 尾递归 来实现循环。Elixir 中有好几种实现循环的方法,尾递归是比较常用的一种方式。guess_loop() 函数做的最后一件事就是调用自身。

guess_loop() 函数的第一行读取用户输入。下一行调用 parse() 函数将输入转换成一个整数。

cond 表达式是 Elixir 版本的多重分支表达式。与其他语言中的 if/elif 或者 if/elsif 表达式不同,Elixir 对于的首个分支或者最后一个没有分支并没有区别对待。

这个 cond 表达式有三路分支:猜测的结果可以比随机数大、小或者相等。前两个选项先输出不等式的方向然后递归调用 guess_loop(),循环返回至函数开始。最后一个选项输出 That's right,然后这个函数就完成了。

输出例子

现在你已经编写了你的 Elixir 代码,你可以运行它来玩“猜数字”的游戏。每次你执行这个程序,Elixir 会选择一个不同的随机数,你可以一直猜下去直到你找到正确的答案:

$ elixir guess.exs
Guess a number between 1 and 100
50
Too high
30
Too high
20
Too high
10
Too low
15
Too high
13
Too low
14
That's right!

“猜数字”游戏是一个学习一门新编程语言的绝佳入门程序,因为它用了非常直接的方法实践了常用的几个编程概念。通过用不同语言实现这个简单的小游戏,你可以实践各个语言的核心概念并且比较它们的细节。

你是否有你最喜爱的编程语言?你将怎样用它来编写“猜数字”这个游戏?关注这个系列的文章来看看其他你可能感兴趣的语言实现。


via: https://opensource.com/article/20/12/elixir

作者:Moshe Zadka 选题:lujun9972 译者:tt67wq 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

不想重复在猜数字游戏中生成...
在猜数字游戏中,你可以使用一个列表来存储已经猜过的数字。每次生成一...
2025-01-10 07:31:12
不理解ElixirPhoe...
在 Elixir Phoenix Ecto 的 Postgres ...
2024-12-26 09:00:44
比较两个映射列表并返回一个...
以下是一个比较两个映射列表并返回一个新的转换列表的示例代码:def...
2024-12-14 17:01:43
比较两个列表以找到Elix...
以下是一个示例解决方法,用于比较两个列表以找到Elixir中的日期...
2024-12-14 08:01:30
编译Elixir程序时执行...
在 Elixir 中,可以使用 @moduledoc 和 @doc...
2024-12-08 05:00:14
编写一个特定的Elixir...
下面是一个使用Elixir编写的单元测试的示例,用于测试一个将字符...
2024-12-07 10:00:48

热门资讯

如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Textual:为 Pytho... 快速入门使用 TextualPython 在 Linux 上有像 TkInter 这样的优秀 GUI...
硬核观察 #1245 Open... #1 OpenAI 悄然删除禁止将 ChatGPT 用于 “军事和战争” 的禁令在 1 月 10 日...
使用时间序列数据,用开源工具助... InfluxData 是一个开源的时间序列数据库平台。下面介绍了它是如何被用于边缘应用案例的。收集到...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
硬核观察 #1249 LG 洗... #1 LG 洗衣机每天上传近 4GB 的数据?一个名为 Johnie 的 LG 洗衣机用户发现,他的...
2024 年 Linux 和开... 让我们尝试预测未来吧!新的一年快乐,朋友们 ✨2024 年的钟声已经敲过,我们有必要去预见一下将塑造...