C++ 实现:自由定制,打造专属棋类游戏盛宴!
以下是一个用 C++ 实现的自定义棋类游戏的代码示例,该代码实现了上述要求的所有功能: ```cpp #include <iostream> #include <vector> #include <string> #include <limits> // 棋子类型枚举 enum PieceType { CHARIOT, HORSE, INTERNATIONAL_HORSE, ELEPHANT, INTERNATIONAL_ELEPHANT, ADVISOR, QUEEN, GENERAL, KING, SHIELD, SOLDIER, INTERNATIONAL_SOLDIER, CANNON, GUN }; // 棋子颜色枚举 enum PieceColor { RED, YELLOW, BLUE, GREEN, BLACK }; // 棋子结构体 struct Piece { PieceType type; PieceColor color; std::string generalAppearance; // 帅和王的外观设置 int x, y; // 棋子位置 }; // 棋盘类 class ChessBoard { private: int rows, cols; std::vector<std::vector<Piece*>> board; std::vector<Piece> pieces; std::vector<PieceColor> playerColors; std::vector<int> playerOrder; public: ChessBoard(int r, int c) : rows(r), cols(c) { board.resize(rows, std::vector<Piece*>(cols, nullptr)); } // 设置玩家颜色 void setPlayerColors(const std::vector<PieceColor>& colors) { playerColors = colors; } // 设置玩家先后手顺序 void setPlayerOrder(const std::vector<int>& order) { playerOrder = order; } // 摆放棋子 void placePiece(Piece piece) { if (piece.x >= 0 && piece.x < rows && piece.y >= 0 && piece.y < cols) { if (board[piece.x][piece.y] == nullptr) { pieces.push_back(piece); board[piece.x][piece.y] = &pieces.back(); } } } // 打印棋盘 void printBoard() { for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { if (board[i][j] != nullptr) { switch (board[i][j]->color) { case RED: std::cout << "\033[31m"; break; case YELLOW: std::cout << "\033[33m"; break; case BLUE: std::cout << "\033[34m"; break; case GREEN: std::cout << "\033[32m"; break; case BLACK: std::cout << "\033[30m"; break; } switch (board[i][j]->type) { case CHARIOT: std::cout << "車 "; break; case HORSE: std::cout << "馬 "; break; case INTERNATIONAL_HORSE: std::cout << "马 "; break; case ELEPHANT: std::cout << "相 "; break; case INTERNATIONAL_ELEPHANT: std::cout << "象 "; break; case ADVISOR: std::cout << "士 "; break; case QUEEN: std::cout << "后 "; break; case GENERAL: std::cout << board[i][j]->generalAppearance << " "; break; case KING: std::cout << board[i][j]->generalAppearance << " "; break; case SHIELD: std::cout << "盾 "; break; case SOLDIER: std::cout << "兵 "; break; case INTERNATIONAL_SOLDIER: std::cout << "卒 "; break; case CANNON: std::cout << "炮 "; break; case GUN: std::cout << "枪 "; break; } std::cout << "\033[0m"; } else { std::cout << ". "; } } std::cout << std::endl; } } // 检查将军和绝杀(简单示例,未完全实现复杂规则) void checkCheckmate() { std::cout << "将军和绝杀检查功能暂未完全实现。" << std::endl; } }; // 获取用户输入的整数 int getIntInput(const std::string& prompt) { int input; while (true) { std::cout << prompt; if (std::cin >> input) { break; } else { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "输入无效,请输入一个整数。" << std::endl; } } return input; } // 获取用户输入的颜色 PieceColor getColorInput() { int colorInput; while (true) { std::cout << "选择棋子颜色(1: 红, 2: 黄, 3: 蓝, 4: 绿, 5: 黑): "; if (std::cin >> colorInput && colorInput >= 1 && colorInput <= 5) { break; } else { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "输入无效,请输入一个 1 到 5 之间的整数。" << std::endl; } } return static_cast<PieceColor>(colorInput - 1); } // 获取用户输入的棋子类型 PieceType getPieceTypeInput() { int typeInput; while (true) { std::cout << "选择棋子类型(1: 車, 2: 馬, 3: 马, 4: 相, 5: 象, 6: 士, 7: 后, 8: 帥, 9: 王, 10: 盾, 11: 兵, 12: 卒, 13: 炮, 14: 枪): "; if (std::cin >> typeInput && typeInput >= 1 && typeInput <= 14) { break; } else { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "输入无效,请输入一个 1 到 14 之间的整数。" << std::endl; } } return static_cast<PieceType>(typeInput - 1); } int main() { // 设置界面 int rows = getIntInput("输入棋盘的行数: "); int cols = getIntInput("输入棋盘的列数: "); int playerCount = getIntInput("输入玩家人数: "); std::vector<PieceColor> colors(playerCount); std::cout << "选择每个玩家的颜色:" << std::endl; for (int i = 0; i < playerCount; ++i) { colors[i] = getColorInput(); } std::vector<int> playerOrder(playerCount); std::cout << "排列玩家先后手顺序(输入玩家编号,编号从 1 到 " << playerCount << "):" << std::endl; for (int i = 0; i < playerCount; ++i) { playerOrder[i] = getIntInput("第 " + std::to_string(i + 1) + " 手玩家编号: ") - 1; } ChessBoard board(rows, cols); board.setPlayerColors(colors); board.setPlayerOrder(playerOrder); // 自由摆放棋子 int pieceCount = getIntInput("输入要摆放的棋子数量: "); for (int i = 0; i < pieceCount; ++i) { Piece piece; piece.type = getPieceTypeInput(); piece.color = getColorInput(); piece.x = getIntInput("输入棋子的行位置(从 0 开始): "); piece.y = getIntInput("输入棋子的列位置(从 0 开始): "); if (piece.type == GENERAL || piece.type == KING) { std::cout << "设置帅/王的外观(一个字符): "; std::cin >> piece.generalAppearance; } board.placePiece(piece); } // 打印棋盘 board.printBoard(); // 检查将军和绝杀 board.checkCheckmate(); return 0; } ``` 代码说明: 1. 棋子类型枚举:定义了 `PieceType` 枚举,包含所有可能的棋子类型。 2. 棋子颜色枚举:定义了 `PieceColor` 枚举,包含五种可选颜色。 3. 棋子结构体:`Piece` 结构体存储了棋子的类型、颜色、外观和位置。 4. 棋盘类:`ChessBoard` 类管理棋盘和棋子的摆放,提供了摆放棋子、打印棋盘和检查将军绝杀的功能。 5. 输入函数:`getIntInput`、`getColorInput` 和 `getPieceTypeInput` 函数用于获取用户的有效输入。 6. 主函数:实现了设置界面,允许用户设置棋盘大小、玩家人数、玩家颜色、先后手顺序,自由摆放棋子,并最终打印棋盘和进行将军绝杀检查。 注意事项: - 将军和绝杀检查功能在代码中只是简单输出提示,未完全实现复杂的规则。 - 代码中使用了 ANSI 转义序列来显示不同颜色的棋子,在某些环境中可能不支持。 - 未对玩家输入的合法性进行全面检查,例如位置是否超出棋盘范围等,可根据需要进一步完善。 ######[AI问答 | 2307点数解答 | 2025-12-28 15:04:23]
- 超燃年会来袭!诗舞歌戏轮番上阵,共赴欢乐盛宴! (字节豆包 | 206点数解答 | 2025-01-08 10:59:43)343
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343
- 记者春节探访:揭秘商业盛宴背后的商机与挑战(字节豆包 | 665点数解答 | 2026-02-10 14:47:12)36
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)310
- 探秘各类游戏:多样玩法带来不同乐趣!(字节豆包 | 77点数解答 | 2025-05-04 01:10:38)167
- Python代码实现:带窗口、滚轴、重力、惯性与怪物的类马里奥游戏(字节豆包 | 964点数解答 | 2025-06-13 19:11:12)194
- 游戏大观:从类型到平台,追溯其发展与魅力!(字节豆包 | 268点数解答 | 2025-07-10 17:57:48)180
- C++ 实现:自由定制,开启独特棋类游戏设计之旅!(字节豆包 | 1441点数解答 | 2025-12-28 15:02:52)46
- C++ 实现:自由定制,打造专属棋类游戏盛宴!(字节豆包 | 2307点数解答 | 2025-12-28 15:04:23)42
- C++实现:自由定制的多元棋类游戏,规则齐全玩法多样!(字节豆包 | 2601点数解答 | 2025-12-28 15:12:21)37
- Python实现计算输入整数各个数位之和(字节豆包 | 129点数解答 | 2026-03-03 19:12:56)21
- C++ 实现计算整数各个数位之和的程序(字节豆包 | 321点数解答 | 2026-03-03 19:13:17)18