国际象棋
2026-08-16 12:01:08
发布于:北京
#include <iostream>
#include <string>
#include <cctype>
#include <cmath>
#include <limits>
using namespace std;
// ============ 基础定义 ============
enum PieceType { EMPTY, PAWN, ROOK, KNIGHT, BISHOP, QUEEN, KING };
enum Color { NONE, WHITE, BLACK };
struct Piece {
PieceType type;
Color color;
Piece() : type(EMPTY), color(NONE) {}
Piece(PieceType t, Color c) : type(t), color(c) {}
};
class ChessGame {
private:
Piece board[8][8];
Color currentTurn;
// -------- 初始化棋盘 --------
void initializeBoard() {
// 黑方(大写字母)
board[0][0] = Piece(ROOK, BLACK); board[0][1] = Piece(KNIGHT, BLACK);
board[0][2] = Piece(BISHOP, BLACK); board[0][3] = Piece(QUEEN, BLACK);
board[0][4] = Piece(KING, BLACK); board[0][5] = Piece(BISHOP, BLACK);
board[0][6] = Piece(KNIGHT, BLACK); board[0][7] = Piece(ROOK, BLACK);
for (int i = 0; i < 8; i++) board[1][i] = Piece(PAWN, BLACK);
// 中间空白
for (int r = 2; r < 6; r++)
for (int c = 0; c < 8; c++)
board[r][c] = Piece();
// 白方(小写字母)
for (int i = 0; i < 8; i++) board[6][i] = Piece(PAWN, WHITE);
board[7][0] = Piece(ROOK, WHITE); board[7][1] = Piece(KNIGHT, WHITE);
board[7][2] = Piece(BISHOP, WHITE); board[7][3] = Piece(QUEEN, WHITE);
board[7][4] = Piece(KING, WHITE); board[7][5] = Piece(BISHOP, WHITE);
board[7][6] = Piece(KNIGHT, WHITE); board[7][7] = Piece(ROOK, WHITE);
}
// -------- 棋子字符显示 --------
char getPieceChar(int r, int c) {
Piece p = board[r][c];
if (p.type == EMPTY) return '.';
switch (p.type) {
case PAWN: return (p.color == WHITE) ? 'p' : 'P';
case ROOK: return (p.color == WHITE) ? 'r' : 'R';
case KNIGHT: return (p.color == WHITE) ? 'n' : 'N';
case BISHOP: return (p.color == WHITE) ? 'b' : 'B';
case QUEEN: return (p.color == WHITE) ? 'q' : 'Q';
case KING: return (p.color == WHITE) ? 'k' : 'K';
default: return '?';
}
}
// -------- 检查路径是否畅通(车/象/后) --------
bool isPathClear(int sr, int sc, int dr, int dc) {
int rStep = (dr > sr) ? 1 : (dr < sr ? -1 : 0);
int cStep = (dc > sc) ? 1 : (dc < sc ? -1 : 0);
int r = sr + rStep, c = sc + cStep;
while (r != dr || c != dc) {
if (board[r][c].type != EMPTY) return false;
r += rStep;
c += cStep;
}
return true;
}
public:
ChessGame() {
initializeBoard();
currentTurn = WHITE; // 白方先手
}
// -------- 打印棋盘 --------
void printBoard() {
cout << "\n a b c d e f g h\n";
for (int r = 0; r < 8; r++) {
cout << 8 - r << " ";
for (int c = 0; c < 8; c++) {
cout << getPieceChar(r, c) << " ";
}
cout << 8 - r << endl;
}
cout << " a b c d e f g h\n";
cout << "─────────────────────────\n";
cout << "当前回合: " << (currentTurn == WHITE ? "白方 (小写)" : "黑方 (大写)") << "\n\n";
}
// -------- 解析坐标(如 "e2" → row=6, col=4) --------
bool parsePos(const string& s, int& r, int& c) {
if (s.length() < 2) return false;
c = tolower(s[0]) - 'a';
r = 8 - (s[1] - '0');
return (r >= 0 && r < 8 && c >= 0 && c < 8);
}
// -------- 验证走法是否合法 --------
bool isValidMove(int sr, int sc, int dr, int dc) {
if (sr < 0 || sr >= 8 || sc < 0 || sc >= 8 || dr < 0 || dr >= 8 || dc < 0 || dc >= 8)
return false;
Piece src = board[sr][sc];
if (src.type == EMPTY || src.color != currentTurn) return false;
Piece dest = board[dr][dc];
if (dest.color == currentTurn) return false; // 不能吃自己的子
int rowDiff = dr - sr;
int colDiff = dc - sc;
int absRow = abs(rowDiff);
int absCol = abs(colDiff);
switch (src.type) {
case PAWN: {
int dir = (src.color == WHITE) ? -1 : 1;
// 直走一格
if (colDiff == 0 && rowDiff == dir && dest.type == EMPTY) return true;
// 初始位置直走两格
if (colDiff == 0 && rowDiff == 2 * dir && sr == (src.color == WHITE ? 6 : 1)) {
int mid = sr + dir;
if (board[mid][sc].type == EMPTY && dest.type == EMPTY) return true;
}
// 斜吃
if (absCol == 1 && rowDiff == dir && dest.type != EMPTY && dest.color != src.color)
return true;
return false;
}
case ROOK:
if (rowDiff != 0 && colDiff != 0) return false;
return isPathClear(sr, sc, dr, dc);
case KNIGHT:
return (absRow == 2 && absCol == 1) || (absRow == 1 && absCol == 2);
case BISHOP:
if (absRow != absCol) return false;
return isPathClear(sr, sc, dr, dc);
case QUEEN:
if (absRow != absCol && rowDiff != 0 && colDiff != 0) return false;
return isPathClear(sr, sc, dr, dc);
case KING:
return absRow <= 1 && absCol <= 1;
default:
return false;
}
}
// -------- 执行移动 --------
void movePiece(int sr, int sc, int dr, int dc) {
board[dr][dc] = board[sr][sc];
board[sr][sc] = Piece();
currentTurn = (currentTurn == WHITE) ? BLACK : WHITE;
}
// -------- 主游戏循环 --------
void play() {
string input;
int sr, sc, dr, dc;
cout << "=== 简易国际象棋 ===\n";
cout << "输入格式: e2 e4 (起始位置 目标位置),输入 q 退出\n";
while (true) {
printBoard();
cout << "请输入走法: ";
// 处理输入
if (!getline(cin, input) || input == "q") {
cout << "游戏结束,再见!\n";
break;
}
size_t space = input.find(' ');
if (space == string::npos) {
cout << "? 格式错误,请使用如 'e2 e4' 的格式。\n\n";
continue;
}
string from = input.substr(0, space);
string to = input.substr(space + 1);
if (!parsePos(from, sr, sc) || !parsePos(to, dr, dc)) {
cout << "? 坐标无效,请输入如 e2、e4 的合法坐标。\n\n";
continue;
}
if (!isValidMove(sr, sc, dr, dc)) {
cout << "? 走法不合法,请重试。\n\n";
continue;
}
movePiece(sr, sc, dr, dc);
}
}
};
// ============ 程序入口 ============
int main() {
ChessGame game;
game.play();
return 0;
}
这是第一版
制作不易,点个赞吧!!!
































有帮助,赞一个