为国际象棋游戏创建移动逻辑。无法弄清楚如何阻止Pawn向后移动

时间:2015-05-13 17:02:52

标签: ruby-on-rails ruby chess

我写了一个测试,以防止pawn向后移动。

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

它的负面原因是因为从x-coord(0..7)和y-coord(0..7)设置了电路板......

所以hash中的那个会做得最好并且让我失败,但是我写的新代码完全抛弃了。我有游戏控制器和Pieces控制器。我不太确定应该打哪一个。

以下是我在终端中收到的错误消息。

  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.

由于颜色原因,我最初打电话给我的Pieces控制器。

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

这是游戏控制器。     class GamesController&lt; ApplicationController的       before_action:authenticate_user!,:only =&gt; [:create,:update,:show]

  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

但我切换到游戏控制器进行测试......我很失落,任何帮助都会受到赞赏。 :)

0 个答案:

没有答案