首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用scala获取网球比赛状态

利用scala获取网球比赛状态
EN

Code Review用户
提问于 2022-01-22 21:33:53
回答 1查看 512关注 0票数 1

我正在开发一个名为TennisGameStatus的scala函数,它返回两个球员之间网球比赛的状态。提醒大家,这里是网球比赛的规则:

代码语言:javascript
复制
 - 1st gain: 15 pts
 - 2nd gain: 30 pts
 - 3rd gain: 40 pts

如果两名球员都得到40分,那么有很多州:

代码语言:javascript
复制
 - "DEUCE" if both are equal to the same score
 - "ADVANTAGE" is attributed to the player who wins **ONE** additional point to the 40 scores.
 - "WIN" is attributed to the player who wins **TWO** times after the 40 scores.

结果应该是这样:

因此,我开发了这个函数:

代码语言:javascript
复制
def TennisGameStatus(nameP1 : String, nameP2: String, wins: Array[String]): String = {
  var scoreP1 = wins.count(x => x == nameP1)
  var scoreP2 = wins.count(x => x == nameP2)
  var Etat40P1 = wins.count(x => x == nameP1) >= 3
  var Etat40P2 = wins.count(x => x == nameP2) >= 3
  val valeursS40 = (5, 6)

  if (scoreP1 > scoreP2 && (1 <= (wins.length) ) && ((wins.length) < 3)) {
    return nameP1.concat((scoreP1 * 15).toString).concat(" ").concat(nameP2.concat((scoreP2 * 15).toString));
  }
  else if (scoreP2 > scoreP1 && (1 <= (wins.length) ) && ((wins.length) < 3)) {
    return nameP2.concat((scoreP2 * 15).toString).concat(" ").concat(nameP1.concat((scoreP1 * 15).toString));
  }
  else if (scoreP1 == scoreP2) {
    scoreP1 match {
      case 0
      => return nameP1.concat((scoreP1 * 15).toString).concat(" ").concat(nameP2.concat((scoreP2 * 15).toString));
      case 1
      => return "15a";
      case 2
      => return "30a";
      case 3
      => return "DEUCE";
    }
  }
  else if (scoreP1 > scoreP2 && valeursS40.canEqual(scoreP1) && Etat40P1.equals(true) && Etat40P2.equals(true)) {
    scoreP1 match {
      case 5
      => return nameP1.concat("ADVANTAGDE");
      case 6
      => return nameP1.concat("WIN");
    }
  }
  else if (scoreP2 > scoreP1 && valeursS40.canEqual(scoreP2) && Etat40P1.equals(true) && Etat40P2.equals(true)) {
    scoreP2 match {
      case 5
      => return nameP2.concat("ADVANTAGDE");
      case 6
      => return nameP2.concat("WIN");
    }
  }
  else
    return ""
}

但是我认为我的函数没有被优化,它不包括scala提供的函数操作。有什么帮助吗?

EN

回答 1

Code Review用户

发布于 2022-01-24 02:25:58

你是对的。这不是惯用的Scala代码,原因很多。

  • 不需要分号;。把他们移走。
  • 经验丰富的Scala程序员从不使用return关键字。把他们移走。不需要它们。
  • 惯用的Scala避免变项,因此很少看到任何var变量。您的scoreEtat变量是初始化的,从未更改过,因此它们应该是vals。

但真正的问题是代码不起作用。我遇到过许多无法产生正确或任何输出的输入场景。

我认为问题的核心来自您正在测试的复杂和令人困惑的if条件。在我看来,通过使用多个、更小的if检查,流会更清晰、更完整。

这是对我有用的东西。

代码语言:javascript
复制
// pseudo-code \\
if (top_win_count < 4)
  if (difference_between_wins == 0)
    compose "all" string
  else
    compose "player1 score - player2 score" string
else if (wins_diff > 1)
  compose WINS string
else if (wins_diff > 0)
  compose ADVANTAGE string
else
  "DEUCE"

整个方法可以用少于20行的代码编写。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/273262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档