Ruby on rails 为国际象棋游戏创建移动逻辑。Can';I don’我想不出如何防止当兵后退
我写了一个测试来阻止典当向后移动Ruby on rails 为国际象棋游戏创建移动逻辑。Can';I don’我想不出如何防止当兵后退,ruby-on-rails,ruby,chess,Ruby On Rails,Ruby,Chess,我写了一个测试来阻止典当向后移动 test 'pawn back move is invalid' do pawn = @game.pawns.first pawn.moved = true refute pawn.valid_move?(pawn.x_coord, (pawn.y_coord - 1)) pawn.moved = true refute pawn.valid_move?(pawn.x_coord, (pawn.y_coord - 2)) end 这是我的典
test 'pawn back move is invalid' do
pawn = @game.pawns.first
pawn.moved = true
refute pawn.valid_move?(pawn.x_coord, (pawn.y_coord - 1))
pawn.moved = true
refute pawn.valid_move?(pawn.x_coord, (pawn.y_coord - 2))
end
这是我的典当模型
class Pawn < Piece
def valid_move?(x_destination, y_destination)
x_dist = (x_coord - x_destination).abs
y_dist = (y_coord - y_destination).abs
# if self.moved
# y_dist == 1 && x_dist == 0
# else
# (y_dist == 1 || y_dist == 2) && x_dist == 0
# end
while Game.where(:color => 'white') do
if self.moved
y_dist == -1 && x_dist == 0
else
(y_dist == -1 || y_dist == -2) && x_dist == 0
end
end
end
end
但我切换到游戏控制器来测试。。。我很迷路,任何帮助都将不胜感激。:) 在Rails中的游戏上执行TDD是一项艰巨的任务。这不是你问题的答案,但我建议:1。从一个简单得多的应用开始。比如康威的《生命的游戏》:。2.在那之后,选择一个更简单的游戏,比如Tic-Tac-Toe。3.我不认为它需要是Rails应用程序。您可以学习所有关于TDD和Ruby的知识,而不必考虑Rails的复杂性。它可以是打印到终端的Ruby应用程序。4.浏览一些关于如何使用TDD的教程一个简单的Ruby应用程序。FWIW,我认为使用TDD是最好的学习方法。@b甚至感谢您的提示!是的,我是一个初学者,这是一个小组项目,我们正在工作。。。至少可以说,我很迷茫。在我再次处理这个问题之前,我会努力解决这个问题。谢谢
1) Error:
PieceTest#test_pawn_back_move_is_invalid:
NoMethodError: undefined method `where' for Pieces:Module
app/models/pieces/pawn.rb:14:in `valid_move?'
test/models/piece_test.rb:118:in `block in <class:PieceTest>'
2) Error:
PieceTest#test_pawn_move_is_invalid:
NoMethodError: undefined method `where' for Pieces:Module
app/models/pieces/pawn.rb:14:in `valid_move?'
test/models/piece_test.rb:110:in `block in <class:PieceTest>'
3) Error:
PieceTest#test_pawn_move_is_valid:
NoMethodError: undefined method `where' for Pieces:Module
app/models/pieces/pawn.rb:14:in `valid_move?'
test/models/piece_test.rb:103:in `block in <class:PieceTest>'
4) Error:
PiecesControllerTest#test_should_move_piece:
NoMethodError: undefined method `valid_move?' for nil:NilClass
app/controllers/pieces_controller.rb:13:in `update'
test/controllers/pieces_controller_test.rb:8:in `block in <class:PiecesControllerTest>'
5) Error:
PiecesControllerTest#test_should_not_move_piece:
NoMethodError: undefined method `valid_move?' for nil:NilClass
app/controllers/pieces_controller.rb:13:in `update'
test/controllers/pieces_controller_test.rb:20:in `block in <class:PiecesControllerTest>'
40 tests, 70 assertions, 0 failures, 5 errors, 0 skips
Coverage report generated for MiniTest to /vagrant/src/chess/coverage. 123 / 133 LOC (92.48%) covered.
class PiecesController < ApplicationController
def create
end
def destroy
end
def update
@piece = Piece.where(:id => params[:id]).first
x_dest = params[:x_coord].to_i
y_dest = params[:y_coord].to_i
if @piece.valid_move?(x_dest, y_dest)
@piece.move_to(x_dest, y_dest)
render :json => :success
else
render :text => 'invalid', :status => :unprocessable_entity
end
end
private
def piece_params
params.require(:piece).permit(:color, :x_coord, :y_coord)
end
def index
@games = Game.all
end
def new
@game = Game.new
end
def show
@game = Game.where(:id => params[:id]).first
render :text => 'That game does not exist.', :status => :not_found if @game.blank?
end
def create
@game = Game.create(:white_user_id => current_user.id)
redirect_to game_path(@game)
end
def update
@game = Game.find(params[:id])
if @game.white_user_id == current_user.id
flash[:alert] = "You can't play against yourself!"
redirect_to games_path
else
@game.update_attributes(:black_user_id => current_user.id)
redirect_to game_path(@game)
end
end
private
def games_params
params.require(:game).permit(:black_user_id, :white_user_id)
end
end