【问题标题】:How to call a method from a second class to act on an object of third class如何从第二类调用方法以作用于第三类的对象
【发布时间】: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


【解决方案1】:

您实现它的方式是,每个用户都有自己的板,但事实并非如此,而是应该如下:

每个Game 都应该有:

  1. 2 人
  2. 1 板

每个Board 都应该有:

  1. 网格

每个Player 都有:

  1. 签到

每个Player 都可以:

  1. 移动

Game 玩家可以:

现在“应该”是变量,“可以”是方法调用。

所以基本上在这里,我们的重点是让两个球员都一样。为此,我们选择了一个共同点来声明棋盘和玩家。

希望对您有所帮助。

【讨论】:

  • 是的,我同意!但我的问题是如何实施这种方法?将棋盘对象作为参数传递给玩家的 move 方法?
  • 记住游戏有玩家和棋盘,在棋盘中你需要知道玩家的移动和他的手势,所以在游戏中调用的boards方法你需要传递你的玩家。
【解决方案2】:

看来最佳解决方案是传递参数,保持简单...

p1.move(board) 对我来说似乎不错...

但对于我的实现来说(基于您当前的代码):

def play
  ...   
  board.mark_move(p1.move)
  ...
end

这对我来说是最简单、最快、最易读的解决方案 :)

【讨论】:

  • 你不认为第一种方法 (p1.move(board)) 会更好吗?既然这样我们可以在玩家的 move 方法中而不是在游戏类的 play 方法中做其他事情(例如检查移动是否合法)?因为第二种方法不允许我们将棋盘传递给 p1 的 move 方法,因此无法检查移动的有效性......
  • 是的,你可以 :) 有很多方法可以杀死一只猫,特别是在编程中。在这种情况下,您可以将 p1 的举动传递给棋盘,而不是将棋盘传递给 p1 的棋步,棋盘内的棋步将在棋盘内得到验证。无论如何,与其让我们完成整个实现,不如放置您当前的代码,以便我们可以帮助您进一步修改它。通过这种方式,我们可以使用您的视角进行编辑,因为每个程序员都有自己的风格和偏好..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多