大佬帮我看看为什么这个输出的不是设置好的坐标

ggstudy-ddup 2020-03-25 04:16:31
给大家看看代码

Piece.h


#include "BaseDef.h"
#include "ChessFace.h"
using namespace Chess;
using namespace std;

// 包含Piece基类
namespace Chess {

// x 坐标最大值
constexpr BYTE MAXXCOORD = 9;
constexpr BYTE MAXYCOORD = 10;
// 从底部到河(双方边界)的距离
constexpr BYTE TORIVER = 5;

// coord on chess board
// 棋盘上的坐标
// 从0开始
// Max x = 9
// Max y = 10
class Coord {
public:
Coord(BYTE xcoord = 0, BYTE ycoord = 0) :Xcoord(xcoord), Ycoord(ycoord) { ; }
BYTE Xcoord;
BYTE Ycoord;
inline bool operator==(const Coord& right)const;
inline bool operator!=(const Coord& right)const;
};
// class Coord


// 棋子是哪一方的
// 红 — 黑
#pragma warning(disable : 26812)
enum Power { Red = -1, Black = 1 };


// 棋子基类
class Piece {
private:
// 棋子是哪一方的
// 红 — 黑
Power PiecePower;

// 棋子的坐标(位置)
// 如果x大于9就是被吃了
Coord PiecePos;

// 指针指向目前棋盘上的局势
// 连接了各个棋子的联系
ChessFace* Situation;

protected:

// 棋子的初始位置
virtual const Coord InitialPos(void)const = 0;

// 设置变量
void setPiecePower(Power piecepower) { this->PiecePower = piecepower; }
void setPiecePos(Coord Pos) { this->PiecePos = Pos; }
void setSituation(ChessFace* situation) { this->Situation = situation; }


public:

Piece(Power piecepower, ChessFace* situation);
// 复制构造函数
Piece(const Piece& piece);
// 析构函数
virtual ~Piece();

// 获得棋子是红方还是黑方的
Power getPiecePower(void)const { return this->PiecePower; }
// 获得棋子现在的位置
Coord getPiecePos(void)const { return this->PiecePos; }
// 获得棋子对象所在的棋局
ChessFace* getSituation(void)const { return this->Situation; }
// 返还棋子的名字
virtual inline wchar_t getPieceName(void)const = 0;
// 返还棋子的编号
virtual inline NumberPiece getPieceNum(void)const = 0;
// 判断可不可以走到指定的坐标(不计算目的地是否有其他棋子的前提下)
virtual bool canMove(Coord coord)const = 0;
// 返还所有可以走的坐标(不计算目的地是否有其他棋子的前提下)
// 实例化时就要实现其他棋子的干扰
virtual vector<Coord> canMove(void)const = 0;
// 返还可以吃到的坐标
virtual vector<Coord> canEat(const ChessFace& situation)const = 0;

};

}




BingZu.h

#include "Piece.h"
using namespace Chess;
namespace Chess {

class BingZu :
public Piece {
// 棋子的序号
// Starts from 0
BYTE PieceSerial;
// 已经创建的红方棋子
static BYTE TotalBing;
// 已经创建的黑方棋子
static BYTE TotalZu;
public:

BingZu(Power piecepower, ChessFace* situation);
BingZu(const BingZu& bingzu);
virtual ~BingZu();

// 返还初始位置
// 每个兵都是不一样的
virtual const Coord InitialPos(void)const;
// 返还棋子的名字
virtual inline wchar_t getPieceName(void)const;
// 返还棋子的编号
virtual inline NumberPiece getPieceNum(void)const;
// 判断可不可以走到指定的坐标(不计算目的地是否有其他棋子的前提下)
virtual bool canMove(Coord coord)const;
// 返还所有可以走的坐标(不计算目的地是否有其他棋子的前提下)
virtual inline vector<Coord> canMove(void)const;
// 所到目标必须有棋子
// 返还可以吃到的坐标
virtual vector<Coord> canEat(const ChessFace& situation)const;

};

}


BingZu.cpp(部分)

#include "BingZu.h"
#include "Piece.h"
using namespace Chess;

BYTE BingZu::TotalBing = 0;
BYTE BingZu::TotalZu = 0;

Chess::BingZu::BingZu(Power piecepower, ChessFace* situation) :Piece(piecepower, situation) {
if (piecepower == Power::Red) {
this->PieceSerial = TotalBing++;
}
else {
this->PieceSerial = TotalZu++;
}
this->setPiecePos(this->InitialPos());
Coord* pos = &this->getPiecePos();
}

Chess::BingZu::BingZu(const BingZu& bingzu) :Piece(bingzu) {
if (bingzu.getPiecePower() == Power::Red) {
this->PieceSerial = TotalBing++;
}
else {
this->PieceSerial = TotalZu++;
}
this->setPiecePos(bingzu.getPiecePos());
}

Chess::BingZu::~BingZu() {
if (this->getPiecePower() == Power::Red) {
TotalBing--;
}
else {
TotalZu--;
}
}

const Coord Chess::BingZu::InitialPos(void)const {
Coord coord;
coord.Xcoord = ((2 *
((this->getPiecePower() == Power::Red) ?
(BingZu::TotalBing) :
(BingZu::TotalZu)))
- 2);
coord.Ycoord = DIFFPOWERYCOORD(this->getPiecePower(), 3);
return coord;
}



main.cpp

#include <iostream>
#include "Piece.h"
#include "BingZu.h"
using std::cout;
using std::endl;
using namespace Chess;

#define POWER Power(-1)
#define PTR nullptr

int main() {
Chess::Piece* BINGS = new Chess::BingZu[5]
{
BingZu(POWER,PTR),
BingZu(POWER,PTR),
BingZu(POWER,PTR),
BingZu(POWER,PTR),
BingZu(POWER,PTR)
};
Coord* coord = new Coord[5];
vector<Coord>* bingspos = new vector<Coord>[5];
coord[1] = BINGS[1].getPiecePos();
for (int i = 0; i < 5; i++) {
coord[i] = BINGS[i].getPiecePos();
}
Coord out;
for (int i = 0; i < 5; i++) {
out = coord[i];
cout << (int)out.Xcoord << endl;
cout << (int)out.Ycoord << endl << endl;
}
return 0;
}




for运行到第二遍的时候坐标就离奇地变成256, 256 了
还有要抱歉的是本人没有多少分所以只有20分抱歉了
...全文
88 4 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ggstudy-ddup 2020-03-26
那如果我要实现多态呢?
  • 打赏
  • 举报
回复
ggstudy-ddup 2020-03-26
求科普,dynamic_cast是干嘛的
  • 打赏
  • 举报
回复
ggstudy-ddup 2020-03-26
哦抱歉没看到十一行的注释
谢谢
  • 打赏
  • 举报
回复
GKatHere 2020-03-25

//     子类数组指针,不能转为基指针指针用。
Chess::Piece* BINGS = new Chess::BingZu[5] // Chess::BingZu* BINGS = new Chess::BingZu[5]
    {
        BingZu(POWER,PTR),
        BingZu(POWER,PTR),
        BingZu(POWER,PTR),
        BingZu(POWER,PTR),
        BingZu(POWER,PTR)
    };
    // 或者
	coord[i] = (BINGS)[i].getPiecePos(); //	coord[i] = dynamic_cast<BingZu*>(BINGS)[i].getPiecePos();



  • 打赏
  • 举报
回复
相关推荐
发帖
其它技术问题

3858

社区成员

C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
帖子事件
创建了帖子
2020-03-25 04:16
社区公告
暂无公告