一,源码
board.h
#ifndef BOARD_H
#define BOARD_H
#include <QWidget>
#include "Stone.h"
class Board : public QWidget
{
Q_OBJECT
public:
explicit Board(QWidget *parent = 0);
bool _bRedTurn; // 红方先走
int _currentPlayer; // 当前玩家,1为红方,-1为黑方
Stone _s[32];
int _r; /* 棋子的半径 */
int _selectid;
/* 返回象棋棋盘行列对应的像素坐标 */
QPoint center(int row, int col);
QPoint center(int id);
bool getRowCol(QPoint pt, int& row, int& col);
void drawStone(QPainter& painter, int id);
void paintEvent(QPaintEvent *);
void mouseReleaseEvent(QMouseEvent *);
bool canMove(int moveid, int row, int col, int killid);
bool canMoveJIANG(int moveid, int row, int col, int killid);
bool canMoveSHI(int moveid, int row, int col, int killid);
bool canMoveXIANG(int moveid, int row, int col, int killid);
bool canMoveCHE(int moveid, int row, int col, int killid);
bool canMoveMA(int moveid, int row, int col, int killid);
bool canMovePAO(int moveid, int row, int col, int killid);
bool canMoveBING(int moveid, int row, int col, int killid);
bool isStoneAt(int row, int col);
void saveGameState();
signals:
public slots:
};
#endif // BOARD_H
Stone.h
#ifndef STONE_H
#define STONE_H
#include <QString>
class Stone
{
public:
Stone();
~Stone();
int getRow()const
{
return _row;
}
int getCol()const
{
return _col;
}
enum TYPE{JIANG, CHE, PAO, MA, BING, SHI, XIANG};
int _row;
int _col;
TYPE _type;
int _id;
bool _dead;
bool _red;
void init(int id)
{
struct {
int row, col;
Stone::TYPE type;
} pos[16] = {
{0, 0, Stone::CHE},
{0, 1, Stone::MA},
{0, 2, Stone::XIANG},
{0, 3, Stone::SHI},
{0, 4, Stone::JIANG},
{0, 5, Stone::SHI},
{0, 6, Stone::XIANG},
{0, 7, Stone::MA},
{0, 8, Stone::CHE},
{2, 1, Stone::PAO},
{2, 7, Stone::PAO},
{3, 0, Stone::BING},
{3, 2, Stone::BING},
{3, 4, Stone::BING},
{3, 6, Stone::BING},
{3, 8, Stone::BING},
};
_id = id;
_dead = false;
_red = id<16;
if(id < 16)
{
_row = pos[id].row;
_col = pos[id].col;
_type = pos[id].type;
}
else
{
_row = 9-pos[id-16].row;
_col = 8-pos[id-16].col;
_type = pos[id-16].type;
}
}
QString getText()
{
switch(this->_type)
{
case CHE:
return "车";
case MA:
return "马";
case PAO:
return "炮";
case BING:
return "兵";
case JIANG:
return "将";
case SHI:
return "士";
case XIANG:
return "相";
}
return "错误";
}
};
#endif // STONE_H