2023-01-13 08:33:16 +08:00
|
|
|
|
[#]: subject: "Learn the Ada programming language by writing a simple game"
|
|
|
|
|
[#]: via: "https://opensource.com/article/23/1/learn-ada-simple-game"
|
|
|
|
|
[#]: author: "Moshe Zadka https://opensource.com/users/moshez"
|
|
|
|
|
[#]: collector: "lkxed"
|
|
|
|
|
[#]: translator: "geekpi"
|
2023-01-13 17:40:30 +08:00
|
|
|
|
[#]: reviewer: "wxy"
|
|
|
|
|
[#]: publisher: "wxy"
|
|
|
|
|
[#]: url: "https://linux.cn/article-15440-1.html"
|
2023-01-13 08:33:16 +08:00
|
|
|
|
|
2023-01-13 17:40:30 +08:00
|
|
|
|
通过编写“猜数字”游戏来学习 Ada 编程语言
|
2023-01-13 08:33:16 +08:00
|
|
|
|
======
|
|
|
|
|
|
2023-01-13 17:40:30 +08:00
|
|
|
|
![][0]
|
|
|
|
|
|
|
|
|
|
> 这个 "猜数字 "游戏是学习新编程语言的一个很好的入门程序,因为它以一种相当直接的方式锻炼了几个常见的编程概念。
|
|
|
|
|
|
|
|
|
|
当你想 [学习一种新的编程语言][1] 时,把注意力放在编程语言的共同点上是很好的:
|
2023-01-13 08:33:16 +08:00
|
|
|
|
|
|
|
|
|
- 变量
|
|
|
|
|
- 表达式
|
|
|
|
|
- 语句
|
|
|
|
|
|
|
|
|
|
这些概念是大多数编程语言的基础。一旦你理解了它们,你就可以开始琢磨其他的东西了。因为编程语言通常有相似之处,一旦你知道一种语言,你就可以通过了解其差异来学习另一种语言的基础知识。
|
|
|
|
|
|
|
|
|
|
学习新语言的一个好方法是用一个标准程序进行练习。这使你能够专注于语言,而不是程序的逻辑。在这个系列文章中,我使用了一个“猜数字”的程序,在这个程序中,计算机在 1 到 100 之间挑选一个数字,并要求你猜出来。程序循环进行,直到你猜对数字为止。
|
|
|
|
|
|
|
|
|
|
这个程序锻炼了编程语言中的几个概念:
|
|
|
|
|
|
|
|
|
|
- 变量
|
|
|
|
|
- 输入
|
|
|
|
|
- 输出
|
|
|
|
|
- 条件判断
|
|
|
|
|
- 循环
|
|
|
|
|
|
|
|
|
|
这是一个学习新的编程语言的很好的实践实验。
|
|
|
|
|
|
|
|
|
|
### 安装 Ada
|
|
|
|
|
|
2023-01-13 17:40:30 +08:00
|
|
|
|
[Ada 编程语言][2] 是一种独特的、高度结构化的语言,有专门一群开发者使用它。Ada 的工具链是 GNU Ada 开发环境,多被称为 GNAT。
|
2023-01-13 08:33:16 +08:00
|
|
|
|
|
|
|
|
|
你可以使用你的发行版的包管理器在 Linux 上安装 GNAT。在 Fedora、CentOS 或类似系统上:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ sudo dnf install gcc-gnat
|
|
|
|
|
```
|
|
|
|
|
|
2023-01-13 17:40:30 +08:00
|
|
|
|
在 Debian、Linux Mint 及衍生版上:
|
2023-01-13 08:33:16 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ sudo apt install gnat
|
|
|
|
|
```
|
|
|
|
|
|
2023-01-13 17:40:30 +08:00
|
|
|
|
在 macOS 和 Windows 上,你可以从 [Adacore 网站][3] 下载一个安装程序(从下拉菜单中选择你的平台)。
|
2023-01-13 08:33:16 +08:00
|
|
|
|
|
|
|
|
|
### 在 Ada 中猜数字
|
|
|
|
|
|
|
|
|
|
创建一个名为 `game.adb` 的文件。
|
|
|
|
|
|
|
|
|
|
这个程序使用的两个内置 Ada 库:`Text_IO` 和 `Numerics.Discrete_Random`:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
with Ada.Text_IO;
|
|
|
|
|
use Ada.Text_IO;
|
|
|
|
|
with Ada.Numerics.Discrete_Random;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 过程头
|
|
|
|
|
|
2023-01-13 17:40:30 +08:00
|
|
|
|
<ruby>过程<rt>procedure</rt></ruby> 的名称必须与文件的名称一致。第一部分是定义变量。
|
2023-01-13 08:33:16 +08:00
|
|
|
|
|
|
|
|
|
注意,`discrete_random` 是专门针对特定范围的。在这里,允许数字范围:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
procedure Game is
|
|
|
|
|
type randRange is range 1..100;
|
|
|
|
|
package Rand_Int is new ada.numerics.discrete_random(randRange);
|
|
|
|
|
use Rand_Int;
|
|
|
|
|
gen : Generator;
|
|
|
|
|
num : randRange;
|
|
|
|
|
incorrect: Boolean := True;
|
|
|
|
|
guess: randRange;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 过程逻辑
|
|
|
|
|
|
2023-01-13 17:40:30 +08:00
|
|
|
|
该逻辑从 `reset(gen)` 开始。这将初始化随机数发生器,确保每次运行程序时,用 `random(gen)` 初始化的数字将是不同的。
|
2023-01-13 08:33:16 +08:00
|
|
|
|
|
|
|
|
|
下一步是运行循环:
|
|
|
|
|
|
|
|
|
|
- 输出猜测的指令
|
|
|
|
|
- 读取该行
|
|
|
|
|
- 将其转换为 `randRange`。
|
|
|
|
|
- 将其与数字进行核对
|
|
|
|
|
|
2023-01-13 17:40:30 +08:00
|
|
|
|
如果数字匹配,`incorrect` 被设置为 `False`,导致循环的下一次迭代退出。
|
2023-01-13 08:33:16 +08:00
|
|
|
|
|
|
|
|
|
最后,程序在退出前会打印出对猜测正确性的确认:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
begin
|
|
|
|
|
reset(gen);
|
|
|
|
|
num := random(gen);
|
|
|
|
|
while incorrect loop
|
|
|
|
|
Put_Line ("Guess a number between 1 and 100");
|
|
|
|
|
declare
|
|
|
|
|
guess_str : String := Get_Line (Current_Input);
|
|
|
|
|
begin
|
|
|
|
|
guess := randRange'Value (guess_str);
|
|
|
|
|
end;
|
|
|
|
|
if guess < num then
|
|
|
|
|
Put_line("Too low");
|
|
|
|
|
elsif guess > num then
|
|
|
|
|
Put_line("Too high");
|
|
|
|
|
else
|
|
|
|
|
incorrect := False;
|
|
|
|
|
end if;
|
|
|
|
|
end loop;
|
|
|
|
|
Put_line("That's right");
|
|
|
|
|
end Game;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 编译程序
|
|
|
|
|
|
|
|
|
|
编译 Ada 程序的最简单方法是使用 `gnatmake`:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ gnatmake game.adb
|
|
|
|
|
aarch64-linux-gnu-gcc-10 -c game.adb
|
|
|
|
|
aarch64-linux-gnu-gnatbind-10 -x game.ali
|
|
|
|
|
aarch64-linux-gnu-gnatlink-10 game.ali
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这将生成一个名为 `game` 的二进制文件。
|
|
|
|
|
|
|
|
|
|
### 运行程序
|
|
|
|
|
|
|
|
|
|
程序的每次运行都会有一些不同。这是一个例子:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ ./game
|
|
|
|
|
Guess a number between 1 and 100
|
|
|
|
|
50
|
|
|
|
|
Too low
|
|
|
|
|
Guess a number between 1 and 100
|
|
|
|
|
75
|
|
|
|
|
Too low
|
|
|
|
|
Guess a number between 1 and 100
|
|
|
|
|
82
|
|
|
|
|
Too low
|
|
|
|
|
Guess a number between 1 and 100
|
|
|
|
|
90
|
|
|
|
|
Too high
|
|
|
|
|
Guess a number between 1 and 100
|
|
|
|
|
87
|
|
|
|
|
Too low
|
|
|
|
|
Guess a number between 1 and 100
|
|
|
|
|
88
|
|
|
|
|
That's right
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 学习 Ada
|
|
|
|
|
|
|
|
|
|
这个“猜数字”游戏是学习新的编程语言的一个很好的入门程序,因为它以一种相当直接的方式锻炼了几个常见的编程概念。通过在不同的编程语言中实现这个简单的游戏,你可以展示这些语言的一些核心概念,并比较它们的细节。
|
|
|
|
|
|
|
|
|
|
你有喜欢的编程语言吗?你会如何用它来写“猜数字”的游戏?请关注本系列文章,看看你可能感兴趣的其他编程语言的例子吧!
|
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
via: https://opensource.com/article/23/1/learn-ada-simple-game
|
|
|
|
|
|
|
|
|
|
作者:[Moshe Zadka][a]
|
|
|
|
|
选题:[lkxed][b]
|
|
|
|
|
译者:[geekpi](https://github.com/geekpi)
|
2023-01-13 17:40:30 +08:00
|
|
|
|
校对:[wxy](https://github.com/wxy)
|
2023-01-13 08:33:16 +08:00
|
|
|
|
|
|
|
|
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
|
|
|
|
|
|
|
|
|
[a]: https://opensource.com/users/moshez
|
|
|
|
|
[b]: https://github.com/lkxed
|
|
|
|
|
[1]: https://opensource.com/article/20/10/learn-any-programming-language
|
|
|
|
|
[2]: https://opensource.com/article/21/10/learn-ada-2021
|
|
|
|
|
[3]: https://www.adacore.com/download/more
|
2023-01-13 17:40:30 +08:00
|
|
|
|
[0]: https://img.linux.net.cn/data/attachment/album/202301/13/173929sbddkk6fbd67uu5v.jpg
|