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