mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
d5466d1fda
sources/tech/20201209 Program a simple game with Elixir.md
142 lines
5.4 KiB
Markdown
142 lines
5.4 KiB
Markdown
[#]: collector: (lujun9972)
|
||
[#]: translator: ( )
|
||
[#]: reviewer: ( )
|
||
[#]: publisher: ( )
|
||
[#]: url: ( )
|
||
[#]: subject: (Program a simple game with Elixir)
|
||
[#]: via: (https://opensource.com/article/20/12/elixir)
|
||
[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
|
||
|
||
Program a simple game with Elixir
|
||
======
|
||
Learn Elixir by programming a "guess the number" game and comparing the
|
||
language against ones you know.
|
||
![A die with rainbow color background][1]
|
||
|
||
To you learn a new programming language, it's good to focus on the things most programming languages have in common:
|
||
|
||
* Variables
|
||
* Expressions
|
||
* Statements
|
||
|
||
|
||
|
||
These concepts are the basis of most programming languages. Because of these similarities, once you know one programming language, you can start figuring another one out by recognizing its differences.
|
||
|
||
Another good tool for learning a new language is starting with a standard program. This allows you to focus on the language, not the program's logic. We're doing that in this article series using a "guess the number" program, in which the computer picks a number between one and 100 and asks you to guess it. The program loops until you guess the number correctly.
|
||
|
||
The "guess the number" program exercises several concepts in programming languages:
|
||
|
||
* Variables
|
||
* Input
|
||
* Output
|
||
* Conditional evaluation
|
||
* Loops
|
||
|
||
|
||
|
||
It's a great practical experiment to learn a new programming language.
|
||
|
||
### Guess the number in Elixir
|
||
|
||
The [Elixir][2] programming language is a dynamically typed functional language designed for building stable and maintainable applications. It runs on top of the same virtual machine as [Erlang][3] and shares many of its strengths—but with slightly easier syntax.
|
||
|
||
You can explore Elixir by writing a version of the "guess the number" game.
|
||
|
||
Here is my implementation:
|
||
|
||
|
||
```
|
||
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()
|
||
```
|
||
|
||
To assign a value to a variable, list the variable's name followed by the `=` sign. For example, the statement `random = 0` assigns a zero value to the `random` variable.
|
||
|
||
The script starts by defining a **module**. In Elixir, only modules can have named functions in them.
|
||
|
||
The next line defines the function that will serve as the entry point, `guess()`, which:
|
||
|
||
* Calls the `Enum.random()` function to get a random integer
|
||
* Prints the game prompt
|
||
* Calls the function that will serve as the loop
|
||
|
||
|
||
|
||
The rest of the game logic is implemented in the `guess_loop()` function.
|
||
|
||
The `guess_loop()` function uses [tail recursion][4] to loop. There are several ways to do looping in Elixir, but using tail recursion is a common one. The last thing `guess_loop()` does is call _itself_.
|
||
|
||
The first line in `guess_loop()` reads the input from the user. The next line uses `parse()` to convert the input to an integer.
|
||
|
||
The `cond` statement is Elixir's version of a multi-branch statement. Unlike `if/elif` or `if/elsif` in other languages, Elixir does not treat the first nor the last branch in a different way.
|
||
|
||
This `cond` statement has a three-way branch: The guess can be smaller, bigger, or equal to the random number. The first two options output the inequality's direction and then tail-call `guess_loop()`, looping back to the beginning. The last option outputs `That's right`, and the function finishes.
|
||
|
||
### Sample output
|
||
|
||
Now that you've written your Elixir program, you can run it to play the "guess the number" game. Every time you run the program, Elixir will pick a different random number, and you can guess until you find the correct number:
|
||
|
||
|
||
```
|
||
$ 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!
|
||
```
|
||
|
||
This "guess the number" game is a great introductory program for learning a new programming language because it exercises several common programming concepts in a pretty straightforward way. By implementing this simple game in different programming languages, you can demonstrate some core concepts of the languages and compare their details.
|
||
|
||
Do you have a favorite programming language? How would you write the "guess the number" game in it? Follow this article series to see examples of other programming languages that might interest you.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
via: https://opensource.com/article/20/12/elixir
|
||
|
||
作者:[Moshe Zadka][a]
|
||
选题:[lujun9972][b]
|
||
译者:[译者ID](https://github.com/译者ID)
|
||
校对:[校对者ID](https://github.com/校对者ID)
|
||
|
||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||
|
||
[a]: https://opensource.com/users/moshez
|
||
[b]: https://github.com/lujun9972
|
||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/dice_tabletop_board_gaming_game.jpg?itok=y93eW7HN (A die with rainbow color background)
|
||
[2]: https://elixir-lang.org/
|
||
[3]: https://www.erlang.org/
|
||
[4]: https://en.wikipedia.org/wiki/Tail_call
|