用c++编写一个文字版19路围棋游戏 包含提子、禁入点、打劫、计算胜负等规则。
以下是一个用 C++ 编写的 19 路文字版围棋游戏,实现了提子、禁入点、打劫、计算胜负等规则: ```cpp #include <iostream> #include <vector> #include <set> const int BOARD_SIZE = 19; // 表示棋子颜色 enum class Color { EMPTY, BLACK, WHITE }; // 表示棋盘 class GoBoard { private: std::vector<std::vector<Color>> board; std::pair<int, int> lastMove; // 记录上一步落子位置,用于打劫判断 bool isFirstMove; // 是否是第一步棋 // 检查一个棋子的气 int liberties(int x, int y) { std::set<std::pair<int, int>> visited; std::vector<std::pair<int, int>> stack; stack.push_back({x, y}); Color color = board[x][y]; int lib = 0; while (!stack.empty()) { auto [cx, cy] = stack.back(); stack.pop_back(); if (visited.find({cx, cy}) != visited.end()) continue; visited.insert({cx, cy}); // 检查四个方向 int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; for (int i = 0; i < 4; ++i) { int nx = cx + dx[i]; int ny = cy + dy[i]; if (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE) { if (board[nx][ny] == Color::EMPTY) { lib++; } else if (board[nx][ny] == color) { stack.push_back({nx, ny}); } } } } return lib; } // 移除无气的棋子 int removeDeadStones(Color opponentColor) { int removed = 0; std::vector<std::pair<int, int>> toRemove; for (int i = 0; i < BOARD_SIZE; ++i) { for (int j = 0; j < BOARD_SIZE; ++j) { if (board[i][j] == opponentColor && liberties(i, j) == 0) { toRemove.push_back({i, j}); } } } for (auto [x, y] : toRemove) { board[x][y] = Color::EMPTY; removed++; } return removed; } // 检查是否是禁入点 bool isForbiddenMove(int x, int y, Color color) { if (board[x][y] != Color::EMPTY) return true; board[x][y] = color; Color opponentColor = (color == Color::BLACK) ? Color::WHITE : Color::BLACK; int removed = removeDeadStones(opponentColor); bool hasLiberties = liberties(x, y) > 0; board[x][y] = Color::EMPTY; removeDeadStones(opponentColor); // 恢复棋盘 if (!hasLiberties) { // 如果落子后自己无气且没有提掉对方棋子,则为禁入点 return removed == 0; } return false; } // 检查是否是打劫 bool isKo(int x, int y, Color color) { if (isFirstMove) return false; board[x][y] = color; Color opponentColor = (color == Color::BLACK) ? Color::WHITE : Color::BLACK; int removed = removeDeadStones(opponentColor); if (removed == 1) { auto [lastX, lastY] = lastMove; if (board[lastX][lastY] == Color::EMPTY && liberties(lastX, lastY) == 0) { board[x][y] = Color::EMPTY; removeDeadStones(opponentColor); // 恢复棋盘 return true; } } board[x][y] = Color::EMPTY; removeDeadStones(opponentColor); // 恢复棋盘 return false; } public: GoBoard() : board(BOARD_SIZE, std::vector<Color>(BOARD_SIZE, Color::EMPTY)), lastMove({-1, -1}), isFirstMove(true) {} // 落子 bool makeMove(int x, int y, Color color) { if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE) return false; if (isForbiddenMove(x, y, color)) return false; if (isKo(x, y, color)) return false; board[x][y] = color; Color opponentColor = (color == Color::BLACK) ? Color::WHITE : Color::BLACK; removeDeadStones(opponentColor); lastMove = {x, y}; isFirstMove = false; return true; } // 计算胜负 std::pair<int, int> calculateScore() { int blackScore = 0; int whiteScore = 0; for (int i = 0; i < BOARD_SIZE; ++i) { for (int j = 0; j < BOARD_SIZE; ++j) { if (board[i][j] == Color::BLACK) { blackScore++; } else if (board[i][j] == Color::WHITE) { whiteScore++; } } } return {blackScore, whiteScore}; } // 打印棋盘 void printBoard() { for (int i = 0; i < BOARD_SIZE; ++i) { for (int j = 0; j < BOARD_SIZE; ++j) { if (board[i][j] == Color::EMPTY) { std::cout << ". "; } else if (board[i][j] == Color::BLACK) { std::cout << "X "; } else { std::cout << "O "; } } std::cout << std::endl; } } }; int main() { GoBoard board; Color currentPlayer = Color::BLACK; while (true) { board.printBoard(); std::cout << (currentPlayer == Color::BLACK ? "Black's turn" : "White's turn") << std::endl; int x, y; std::cout << "Enter x and y coordinates (0-18): "; std::cin >> x >> y; if (board.makeMove(x, y, currentPlayer)) { currentPlayer = (currentPlayer == Color::BLACK) ? Color::WHITE : Color::BLACK; } else { std::cout << "Invalid move. Try again." << std::endl; } auto [blackScore, whiteScore] = board.calculateScore(); std::cout << "Black score: " << blackScore << ", White score: " << whiteScore << std::endl; } return 0; } ``` 代码说明: 1. `Color` 枚举:表示棋子的颜色,包括空、黑子和白子。 2. `GoBoard` 类: - `board`:二维向量表示棋盘。 - `lastMove`:记录上一步落子位置,用于打劫判断。 - `isFirstMove`:标记是否是第一步棋。 - `liberties`:计算一个棋子或一块棋的气。 - `removeDeadStones`:移除无气的棋子。 - `isForbiddenMove`:检查是否是禁入点。 - `isKo`:检查是否是打劫。 - `makeMove`:落子并处理提子、禁入点和打劫规则。 - `calculateScore`:计算黑白双方的得分。 - `printBoard`:打印当前棋盘状态。 3. `main` 函数: - 创建 `GoBoard` 对象。 - 循环让玩家交替落子,处理输入并调用 `makeMove` 方法。 - 打印当前棋盘和得分。 这个程序实现了基本的围棋规则,包括提子、禁入点、打劫和计算胜负。玩家可以通过输入坐标来落子,程序会检查落子的合法性并更新棋盘状态。 [2025-12-14 15:20:13 | AI问答 | 2026点数解答]
- [字节豆包] 年会表演串词,年会节目清单 1、陈德光:诗朗诵《旗帜》5分钟 2、财务、后勤部:舞蹈《谁是我的新郎》4分钟 3、销售部:演唱《苹果香》5分钟 4、游戏:诸葛帽吃糖 5个人 一轮 10分钟 5、标书、采购部:《三句半》3分钟 6、技术部:舞蹈《wave》4分钟 7、销售部:《魔术》15分钟 8、彩虹圈转光盘 (只限于男生)4个人 一轮 10分钟 9、技术部:脱口秀 20分钟 10、销售部:《吃香蕉》3分钟 11、财务、后勤部:合唱《感恩的心》4分钟 12、游戏:喊话吹蜡烛(指定人)2个人 一轮 5分钟 13、标书、采购部:朗诵《我爱上班》 3分钟 11、销售部:邓腾龙《青花瓷》4分钟 14、相声新闻晚知道10分钟 15、游戏:摸麻将4个人 一轮 5分钟 16、大合唱:相亲相爱一家人5分钟,字数:200字(206点数解答 | 2025-01-08 10:59:43)317
- [字节豆包] 题目描述 在甜甜圈王国中,每颗甜甜圈都有一个甜度值 S 来衡量其甜蜜程度。根据甜度的不同,甜甜圈被评定为不同的等级,具体规则如下: 如果 S 在 0 到 25 之间(包含 0 和 25 ),输出 "普通甜甜圈"; 如果 S 在 26 到 50 之间(包含 26 和 50 ),输出 "美味甜甜圈"; 如果 S 在 51 到 75 之间(包含 51 和 75 ),输出 "极品甜甜圈"; 如果 S 在 76 到 99 之间(包含 76 和 99 ),输出 "绝世甜甜圈"; 如果 S 等于 100 ,输出 "传说甜甜圈"。 请根据给定的甜度值 S,输出对应的甜甜圈等级名称。 输入格式 一行一个整数 S,表示甜甜圈的甜度值。(243点数解答 | 2025-12-06 18:35:50)69
- [阿里通义] 一个 5×6 的迷宫样例如下: 要求给出从起点(1,1)到终点(3,4)的路径。 为了处理方便,保证最外圈全都为障碍物。 扩展到一般情况,一个 m×n 的迷宫,要求输出从起点(1,1)到终点(m-2,n-2)的路径。 测试实例保证路径是唯一的。 该题要求自行设计一个栈来做。如果设计的是顺序栈,则保证栈的大小不超过 200 个元素。 输入 第一行为两个整数 m 和 n,表示 m×n 的迷宫。 接下来有 m 行,每行有 n 个数(n 个数之间用空格间隔,值 = 0 表示可以通行,值 = 1 表示为障碍物) 输出 输出从起点到终点的路径,每个坐标占一行,坐标间的行号和列号用一个空格间隔。具体格式可参考样例。c++ 源代码(732点数解答 | 2024-11-03 02:34:53)504
- [字节豆包] 用c++编写一个文字版围棋游戏 包含提子、禁入点、打劫、计算胜负等规则。(2523点数解答 | 2025-12-14 15:14:09)27
- [字节豆包] 用c++编写一个文字版19路围棋游戏 包含提子、禁入点、打劫、计算胜负等规则。(2026点数解答 | 2025-12-14 15:20:13)26
- [字节豆包] 创建成绩类,包含: 属性:平时成绩(int)、期末成绩(int) 方法:计算总成绩(计算规则:平时成绩*0.4+期末成绩*0.6,保留整数部分,小数部分直接丢弃) 创建学生类,包含: 属性:学号(string)、姓名(string)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类) 方法:计算总分、计算平均分 输入3个学生的信息,将每个学生的信息封装在一个学生对象中。 按输入顺序依次输出3个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。(847点数解答 | 2024-10-11 08:45:50)698
- [字节豆包] 创建成绩类,包含: 属性:平时成绩(int)、期末成绩(int) 方法:计算总成绩(计算规则:平时成绩*0.4+期末成绩*0.6,保留整数部分,小数部分直接丢弃) 创建学生类,包含: 属性:学号(string)、姓名(string)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类) 方法:计算总分、计算平均分 输入3个学生的信息,将每个学生的信息封装在一个学生对象中。 按输入顺序依次输出3个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。 浮点数保留小数的相关知识可参考:https://blog.csdn.net/huaishuming/article/details/17752365 注意:未用学生类对象封装数据的,本题计0分(581点数解答 | 2024-11-19 15:54:02)412
- [字节豆包] 成绩计算-2-关联类 分数 50 作者 蔡轲 单位 南昌航空大学 创建成绩类,包含: 属性:平时成绩(int)、期末成绩(int) 方法:计算总成绩(计算规则:平时成绩*0.4+期末成绩*0.6,保留整数部分,小数部分直接丢弃) 创建学生类,包含: 属性:学号(String)、姓名(String)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类) 方法:计算总分、计算平均分 输入3个学生的信息,将每个学生的信息封装在一个学生对象中。 按输入顺序依次输出3个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。 浮点数保留小数的相关知识可参考:https://blog.csdn.net/huaishuming/article/details/17752365 注意:未用学生类对象封装数据的,本题计0分(655点数解答 | 2025-04-18 11:41:55)355
- [DeepSeek] 7-2 成绩计算-2-关联类 分数 50 作者 蔡轲 单位 南昌航空大学 创建成绩类,包含: 属性:平时成绩(int)、期末成绩(int) 方法:计算总成绩(计算规则:平时成绩*0.4+期末成绩*0.6,保留整数部分,小数部分直接丢弃) 创建学生类,包含: 属性:学号(String)、姓名(String)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类) 方法:计算总分、计算平均分 输入3个学生的信息,将每个学生的信息封装在一个学生对象中。 按输入顺序依次输出3个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。 浮点数保留小数的相关知识可参考:https://blog.csdn.net/huaishuming/article/details/17752365 注意:未用学生类对象封装数据的,本题计0分 输入格式: 依次输入3个学生的每门课成绩,每个学生成绩信息格式: 学号+英文空格+姓名+英文空格+课程名+英文空格+平时成绩+英文空格+期末成绩 注:3个学生的课程顺序可能会不一致 例如: 22201311 张琳 语文 7(621点数解答 | 2025-04-18 11:43:55)567
- [字节豆包] 题目描述 众所周知,鱼越大,鱼刺越大,鱼刺越大,肉越少,肉越少,鱼越小,所以鱼越大,鱼越小。 请问, 𝑛 n 条大小不一的鱼中,第 𝑖 i 大的鱼,是第几小的鱼? 输入格式 输入包括 1 1 行,包含 2 2 个整数 𝑛 , 𝑖 n,i,分别表示鱼的数量 𝑛 n,和指定鱼是第 𝑖 i大的鱼。 输出格式 输出包括 1 1 行,包含 1 1 个整数,为指定鱼是第几小的鱼。(240点数解答 | 2025-08-01 21:38:06)140
- [DeepSeek] 题目描述 众所周知,鱼越大,鱼刺越大,鱼刺越大,肉越少,肉越少,鱼越小,所以鱼越大,鱼越小。 请问, 𝑛 n 条大小不一的鱼中,第 𝑖 i 大的鱼,是第几小的鱼? 输入格式 输入包括 1 1 行,包含 2 2 个整数 𝑛 , 𝑖 n,i,分别表示鱼的数量 𝑛 n,和指定鱼是第 𝑖 i大的鱼。 输出格式 输出包括 1 1 行,包含 1 1 个整数,为指定鱼是第几小的鱼。(476点数解答 | 2025-08-01 21:38:52)162
- [DeepSeek] 题目描述 众所周知,鱼越大,鱼刺越大,鱼刺越大,肉越少,肉越少,鱼越小,所以鱼越大,鱼越小。 请问, 𝑛 n 条大小不一的鱼中,第 𝑖 i 大的鱼,是第几小的鱼? 输入格式 输入包括 1 1 行,包含 2 2 个整数 𝑛 , 𝑖 n,i,分别表示鱼的数量 𝑛 n,和指定鱼是第 𝑖 i大的鱼。 输出格式 输出包括 1 1 行,包含 1 1 个整数,为指定鱼是第几小的鱼。 c++(213点数解答 | 2025-08-01 21:39:26)140