---
author: Moshe Zadka
category: 软件开发
comments_data:
- date: '2023-01-13 19:39:08'
  message: 问题是现在没几个人学这古董玩意儿
  postip: 47.243.69.130
  username: 来自加拿大的 Firefox 108.0|Android 10 用户
count:
  commentnum: 1
  favtimes: 0
  likes: 0
  sharetimes: 0
  viewnum: 1967
date: '2023-01-13 17:39:30'
editorchoice: false
excerpt: 这个 &quot;猜数字 &quot;游戏是学习新编程语言的一个很好的入门程序，因为它以一种相当直接的方式锻炼了几个常见的编程概念。
fromurl: https://opensource.com/article/23/1/learn-ada-simple-game
id: 15440
islctt: true
largepic: /images/p/202301/13/173929sbddkk6fbd67uu5v.jpg
permalink: /article-15440-1.html
pic: /images/p/202301/13/173929sbddkk6fbd67uu5v.jpg.thumb.jpg
related: []
reviewer: wxy
selector: lkxed
summary: 这个 &quot;猜数字 &quot;游戏是学习新编程语言的一个很好的入门程序，因为它以一种相当直接的方式锻炼了几个常见的编程概念。
tags:
- 猜数字
- Ada
thumb: false
title: 通过编写“猜数字”游戏来学习 Ada 编程语言
titlepic: true
translator: geekpi
updated: '2023-01-13 17:39:30'
---


> 
> 这个 "猜数字 "游戏是学习新编程语言的一个很好的入门程序，因为它以一种相当直接的方式锻炼了几个常见的编程概念。
> 
> 
> 


![](/images/p/202301/13/173929sbddkk6fbd67uu5v.jpg)


当你想 [学习一种新的编程语言](https://opensource.com/article/20/10/learn-any-programming-language) 时，把注意力放在编程语言的共同点上是很好的：


* 变量
* 表达式
* 语句


这些概念是大多数编程语言的基础。一旦你理解了它们，你就可以开始琢磨其他的东西了。因为编程语言通常有相似之处，一旦你知道一种语言，你就可以通过了解其差异来学习另一种语言的基础知识。


学习新语言的一个好方法是用一个标准程序进行练习。这使你能够专注于语言，而不是程序的逻辑。在这个系列文章中，我使用了一个“猜数字”的程序，在这个程序中，计算机在 1 到 100 之间挑选一个数字，并要求你猜出来。程序循环进行，直到你猜对数字为止。


这个程序锻炼了编程语言中的几个概念：


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


这是一个学习新的编程语言的很好的实践实验。


### 安装 Ada


[Ada 编程语言](https://opensource.com/article/21/10/learn-ada-2021) 是一种独特的、高度结构化的语言，有专门一群开发者使用它。Ada 的工具链是 GNU Ada 开发环境，多被称为 GNAT。


你可以使用你的发行版的包管理器在 Linux 上安装 GNAT。在 Fedora、CentOS 或类似系统上：



```
$ sudo dnf install gcc-gnat

```

在 Debian、Linux Mint 及衍生版上:



```
$ sudo apt install gnat

```

在 macOS 和 Windows 上，你可以从 [Adacore 网站](https://www.adacore.com/download/more) 下载一个安装程序（从下拉菜单中选择你的平台）。


### 在 Ada 中猜数字


创建一个名为 `game.adb` 的文件。


这个程序使用的两个内置 Ada 库：`Text_IO` 和 `Numerics.Discrete_Random`：



```
with Ada.Text_IO;
use Ada.Text_IO;
with Ada.Numerics.Discrete_Random;

```

#### 过程头


<ruby> 过程 <rt>  procedure </rt></ruby> 的名称必须与文件的名称一致。第一部分是定义变量。


注意，`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;

```

#### 过程逻辑


该逻辑从 `reset(gen)` 开始。这将初始化随机数发生器，确保每次运行程序时，用 `random(gen)` 初始化的数字将是不同的。


下一步是运行循环：


* 输出猜测的指令
* 读取该行
* 将其转换为 `randRange`。
* 将其与数字进行核对


如果数字匹配，`incorrect` 被设置为 `False`，导致循环的下一次迭代退出。


最后，程序在退出前会打印出对猜测正确性的确认：



```
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](https://opensource.com/users/moshez) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出