国际象棋游戏 - 程序崩溃

时间:2014-12-26 14:49:32

标签: c++ crash runtime-error chess

我正在用c ++开展国际象棋比赛。 我有课程:

class piece
{
protected :
    point position ;
    char represent ;
    bool colour; // true for player 1 = green  , false for player 0 = blue 
public :
    virtual ~piece() ;
    bool find_player(piece* to_check, int num);
    char get_char()   ;
    bool get_colour()   ;
    virtual bool move_setup(point source, point dest, piece* arr[][SIZE] ) = 0 ;
    virtual bool move(point source, point dest, piece* arr[][SIZE]) = 0;
    bool same_player(point dest, piece* arr[][SIZE], int* num);
  };

class  board
{
private:
    piece* arr[SIZE][SIZE]  ; 
public :
    board();
    void free_borad();
    void set_piece(int x , int y , int type , bool colour );
    void print_board();
    void move(point source , point dest);
    void set_colour(int i , int j  , bool reset );
 };
 class pawn : public piece
 {
    public :
      pawn(point position ,  bool colour );
      ~pawn();
      virtual bool move_setup(point source, point dest, piece* arr[][SIZE]);
      virtual bool move(point source, point dest, piece* arr[][SIZE]);
      bool if_forward(point source, point dest);
      bool if_diagonal(point source, point dest, int* offset);
 };

我为每个实现移动功能的部分都有一个类。 这些类是不相关的所以我只是为这个例子放了一个pawn类。 董事会搬家职能:

void board::move(point source, point dest)
{
   if (arr[source.get_x()][source.get_y()]) // if not empty
   {
       int x = source.get_x(), y =  source.get_y() ;
       if (arr[x][y]->move_setup(source, dest, arr ) )  // if the piece  can move there 
       {
           delete arr[dest.get_x()][dest.get_y()];
           arr[dest.get_x()][dest.get_y()] = arr[source.get_x()][source.get_y()];
           arr[source.get_x()][source.get_y()] = NULL;
           std::cout << " Succes! " << std::endl;
       }
       else
       {
        // error
       }
   }
   else // empty
   {
        // error
   }

}

我的程序在

行崩溃了
if (arr[x][y]->move_setup(source, dest, arr ) ) 

我已经使用VS调试器对它进行了debbuged,并意识到发送数组时发生了崩溃,错误信息:

访问冲突读取位置0xFFFFFFFF。

我试图以多种不同的方式发送它,但没有任何作用, 但这种方法完全是我的朋友如何做到的,而且对他来说效果很好。 有人可以帮忙吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

C ++中的数组是从0开始的,这意味着第一个元素的索引是0.如果您的坐标是从1开始的,则表示您正在访问数组中的一行和一列的元素。这反过来导致突破阵列和崩溃的界限。解决方案是采用基于0的坐标系,或者在访问数组时从x / y坐标中减去1。