我在Ruby中制作TicTacToe游戏,其实现看起来像这样。
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个类,我们希望他们的方法对不同的对象起作用。如果我们每次都使用传递对象参数来解决这个问题,那么它就会造成一个真正的混乱...
解决这些问题的专家方法是什么?
THX!
答案 0 :(得分:1)
似乎最佳解决方案是传递参数,只是保持简单......
TextView
对我来说似乎很好......
但是对于我的实现,它将(基于您当前的代码):
p1.move(board)
这对我来说是最简单,最快速,最易读的解决方案:)
答案 1 :(得分:0)
你实现它的方式,每个用户都有自己的主板,但事实并非如此,应该是以下内容:
每个Game
应该有:
- 2位玩家
- 1 board
醇>
每个Board
应该有:
- 栅格
醇>
每个Player
都有:
- 符号
醇>
每个Player
都可以:
- 移动
醇>
在Game
玩家可以:
- 赢
醇>
现在“应该有”是变量,而“可以”是方法调用。
所以基本上我们在这两个球员中都是相同的。为此,我们选择了一个共同点来宣布董事会和球员。
希望有所帮助。