使用 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

热门资讯

“Linux 中国” 开源社区... 这是一个艰难的决定 —— 这不是调侃,而是当你真正做出改变了你十几年生活轨迹的决定时,你就会明白这个...
硬核观察 #1263 德国铁路... #1 德国铁路公司招聘 Windows for Workgroups 3.11 管理员该职位要求了解...
人工智能教程(七):Sciki... 在本系列的 上一篇文章 中,我们用 TensorFlow 构建了第一个神经网络,然后还通过 Kera...
关闭 WSL 中正在运行的 L... 以下是使用 WSL 关闭在 Windows 内运行的 Linux 系统的不同方法。你使用 WSL 在...
MX Linux 23.2 “... 最新的 MX Linux 23.2 小版本更新带来了基本的改进和新增功能。MX Linux 推出了 ...
硬核观察 #1262 网络上最... #1 网络上最古老的软件存档库之一即将关闭美国新墨西哥州立大学(NMSU)最近宣布,即将于 2024...
如何在 RHEL 上通过绑定配... 在 Linux 中,你可以根据自己的需要创建高级网络设置,如 网络绑定 Network Bondin...
Linux Matrix 消息... Matrix 用户可以升级 Fractal 6 了!Fractal 是目前 最好的 Matrix 客...
如何通过 VLC 使用字幕 使用 VLC 媒体播放器播放和管理字幕的新手指南。我是一个超级动漫迷,如果你想观看最新的剧集,那么你...
硬核观察 #1261 X 计划... #1 X 计划在奥斯汀建立内容审核总部据报道,该部门将招聘 100 名全职员工,将主要关注 CSE ...