【发布时间】:2015-08-20 09:28:35
【问题描述】:
我正在用 Ruby 制作一个井字游戏,它的实现看起来像这样。
class Board
@grid #an array which holds Xs, Os and nils.
def won? #checks if the game has been won
def mark_move #implements a given move for a player
#other methods....
end
class Player
def initialize #to initialize player name etc.
def move
....
mark = gets.chomp.split(",").map(&:to_i)
#How to do this?
#I want this method to call mark_move on the initiated object of Board class
end
end
class Game
def initialize(p1, p2) #p1, p2 are objects of Player class
board = Board.new
end
def play
puts "Welcome to game....."
loop until won?
p1.move #How to make this act on the board object?
board.grid.display
return if won?
p2.move ##How to make this act on the board object?
end
puts winner
end
end
我想要的解决方案是让 Player 类中的 move 方法作用于 Board 类(board)的对象。最好的方法是什么?将棋盘作为 Game 类的参数传递? (p1.move(board)) 这看起来不是最优的,因为我在想象一个更大的问题,我们可以有 10-15 个类,我们希望它们的方法作用于不同的对象。如果我们每次都使用传递对象参数来解决这个问题,那会造成真正的混乱......
解决此类问题的专家方法是什么?
谢谢!
【问题讨论】:
-
反转它,board.move(p1) ?或者也许是 BoardMovement(board, p1)。一切都取决于你想把什么放在哪里。如果它可以是某种方式和某种方式,那么某种中间体,或者可能是某种元代码。虽然这对于井字游戏来说似乎有点沉重
-
@TonyHopkinson 我认为这不是一个好主意的原因是我们希望将 Board 类与任何游戏逻辑隔离开来。因此,我反对在 Board 类中创建 move 方法。我们只希望它关注基本规则和显示状态等。Game 类应该只包含游戏流程,类似地,Player 类应该做与移动相关的所有事情。
-
必须小心。有板作为件阵列。有板作为显示表示,有板作为运动约束。很容易成为三个不同的类。
标签: ruby class oop object methods