Erlang 不会让我结束函数



这是我的RPS游戏代码。每当我试图把";结束"它不会让我结束这个功能。前面写着语法错误:"end"。

-module(project).
-export([rps/0]).
rps() ->
Computer = rand:uniform(3),
{ok,Player} = io:read("Rock, Paper, or Scissors?"),
Win = fun() -> io:fwrite("You Win!"),
Lose = fun() -> io:fwrite("You Lose."),
% player chooses rock (win, lose)
if
Player == "Rock" ->
if
Computer == 3 ->
Win();
Computer == 2 ->
Lose()
end;
% player chooses paper (win, lose)
if
Player == "Paper" ->
if
Computer == 1 ->
Win();
Computer == 3 ->
Lose()
end;
% player chooses scissors (win, lose)
if
Player == "Scissors" ->
if
Computer == 2 ->
Win();
Computer == 1 ->
Lose()
end;
end.  <--------- (this is where error occurs)

Artee的回答解释了语法错误发生的位置和方式。让我建议一种不同的写作方式,这可以被认为是一种更多的"Erlang-like";,并且顺便消除了语法错误。

首先,让我们让Computer变量包含计算机的选择,其格式与玩家的相同:

Computer = element(rand:uniform(3), {"Rock", "Paper", "Scissors"}),

然后,创建一个函数,接受玩家和计算机的选择,并返回谁获胜:

who_wins("Rock", "Scissors") ->
player;
who_wins("Rock", "Paper") ->
computer;
who_wins("Paper", "Scissors") ->
computer;
who_wins("Paper", "Rock") ->
player;
who_wins("Scissors", "Rock") ->
computer;
who_wins("Scissors", "Paper") ->
player;
who_wins(Same, Same) ->
tie.

(在最后一个子句中,由于我们对两个参数使用相同的变量名,因此只有当参数相同时,该子句才会匹配。(

然后,回到rps函数中,我们可以将嵌套的if表达式替换为:

case who_wins(Player, Computer) of
player ->
Win();
computer ->
Lose();
tie ->
io:fwrite("It's a tie!")
end.

这里有几个错误:

  • 没有乐趣"结束";(x2(Win=fun((->io:fwrite("你赢了!"(结束
  • if语法

正确代码:

-module(project).
-export([rps/0]).
rps() ->
Computer = rand:uniform(3),
{ok,Player} = io:read("Rock, Paper, or Scissors?"),
Win = fun() -> io:fwrite("You Win!") end,
Lose = fun() -> io:fwrite("You Lose.") end,
% player chooses rock (win, lose)
if
Player == "Rock" ->
if
Computer == 3 ->
Win();
Computer == 2 ->
Lose()
end;
% player chooses paper (win, lose)
Player == "Paper" ->
if
Computer == 1 ->
Win();
Computer == 3 ->
Lose()
end;
% player chooses scissors (win, lose)
Player == "Scissors" ->
if
Computer == 2 ->
Win();
Computer == 1 ->
Lose()
end
end.

最新更新