【发布时间】:2011-11-19 16:14:20
【问题描述】:
我刚开始使用 Scala 并正在尝试一个小玩具程序 - 在本例中是基于文本的井字游戏。我根据我对 scala 的了解编写了一个工作版本,但注意到它主要是命令式的,而且我的类是可变的。
我正在尝试实现一些功能性惯用语,并设法至少使代表游戏状态的类不可变。但是,我剩下一个类负责执行依赖于可变状态和命令式循环的游戏循环,如下所示:
var board: TicTacToeBoard = new TicTacToeBoard
def start() {
var gameState: GameState = new XMovesNext
outputState(gameState)
while (!gameState.isGameFinished) {
val position: Int = getSelectionFromUser
board = board.updated(position, gameState.nextTurn)
gameState = getGameState(board)
outputState(gameState)
}
}
在这个循环中对我正在做的事情进行编程的更惯用的方法是什么?
完整的源代码在这里https://github.com/whaley/TicTacToe-in-Scala/tree/master/src/main/scala/com/jasonwhaley/tictactoe
【问题讨论】:
-
您可以从 Vasil Remeniuk 的 Tic-Tac-Toe API with phantom types 文章中获得一些灵感。
-
@4e6 +1'ed,我稍后会保留该链接。在那篇文章中讨论了我完全不熟悉的 scala 功能(特征,以及 scala 如何处理类型参数)。我会从头开始,准备好后可能会使用这篇文章作为跳板。谢谢!
-
堆栈溢出的一个问题是您不能接受多个答案。感谢大家的帮助!
-
虽然很高兴您担心可变状态等副作用,但值得记住的是,除了将电能转化为热能之外,每个有用的程序都必须改变“世界状态”。因此,可以有移动输出、移动输入和棋盘状态。只要确保其他一切都不会干扰。
标签: scala functional-programming game-loop