1

我正在用 Erlang 构建一个简单的控制台游戏。在过去的两天里,我一直在编写一些 Erlang 模块和测试,并且一切正常(在各个模块中)。我对如何运行游戏并让模块一起工作感到困惑。

我一直在阅读“Greater Good”一书,并且阅读了很多关于 OTP 的内容,但感觉难以承受。有没有我可以在某处学习的简单教程?书中的 OPT 示例对我正在尝试做的事情是否过度杀伤?

更新:感谢您的反馈。这是一个更具体的问题。

我有两个模块......

Console_IO模块

-module(console_io).
-export([display/1, display_welcome_message/0, gets/1]).

display(Message) ->
  io:format(Message).

gets(Message) ->
  {ok, [X]} = io:fread(Message, "~s").
  io:format("You entered '~s'.", [X]);

display_welcome_message() ->
  display("Welcome to the game!").

密码模块

-module(secret_code).
-export([generate/0, symbols/0]).

generate() ->
  random:seed(now()),
  [lists:nth(random:uniform(6), symbols()) || _ <- lists:seq(1, 4)].

symbols() ->
  ["b","g","p","r","y","o"].

这两个模块位于不同的文件中。我希望这些模块能够相互交谈,以便用户可以输入猜测,尝试猜测密码并且游戏返回“是”或“否”。

我想在我的“gets”语句中添加两行来生成密码并将其与猜测进行比较:

-module(console_io).
-export([display/1, display_welcome_message/0, gets/1]).

display(Message) ->
  io:format(Message).

gets(Message) ->
  {ok, [X]} = io:fread(Message, "~s"),
  Code = secret_code:generate,
  Code -- [X].

display_welcome_message() ->
  display("Welcome to the game!").

我知道我没有走在正确的轨道上。有没有一种简单的方法可以做到这一点?

4

2 回答 2

2

Code = secret_code:generate,应该作为函数调用来调用Code = secret_code:generate(),。可以使用模式匹配进行比较。代码如下

-module(console_io).
-export([display/1, display_welcome_message/0, gets/1]).

display(Message) ->
  io:format(Message).

gets(Message) ->
  {ok, [X]} = io:fread(Message, "~s"),
  Code = secret_code:generate(),
  check_code(X, Code).

check_code(Code, Code) ->
    yes;
check_code(_, _) ->
    no.

display_welcome_message() ->
  display("Welcome to the game!").

请注意 secret_code 中的区别,以便在字符串中获取它而不是返回字符串列表

-module(secret_code).
-export([generate/0, symbols/0]).

generate() ->
  random:seed(now()),
  [lists:nth(random:uniform(6), symbols()) || _ <- lists:seq(1, 4)].

symbols() ->
  "bgpryo".

示例运行:

1> console_io:gets(">").
>bgryo
yes
2> console_io:gets(">").
>bgryj
no
3>
于 2013-05-09T17:04:24.837 回答
2

您已经在调用:您的console_io模块中的io模块的
格式函数来自您的secret_code模块的随机模块的种子函数。以同样的方式调用secret_code模块的生成函数,如下所示: 。您可以在线阅读 LearnYouSomeEralng 教程,这是 Erlang/OTP 的最佳教程之一,并且在各个方面都完整。io:format(Message)
random:seed(now())
secret_code:generate()

于 2013-05-10T08:26:04.587 回答