用c++编写一个文字版围棋游戏 包含提子、禁入点、打劫、计算胜负等规则。
以下是一个简单的文字版围棋游戏的 C++ 实现,包含提子、禁入点、打劫、计算胜负等规则: ```cpp #include <iostream> #include <vector> #include <set> #include <algorithm> const int BOARD_SIZE = 9; // 棋盘大小 // 定义棋子颜色 enum Color { EMPTY, BLACK, WHITE }; // 定义棋盘 std::vector<std::vector<Color>> board(BOARD_SIZE, std::vector<Color>(BOARD_SIZE, EMPTY)); // 检查坐标是否在棋盘内 bool isInBoard(int x, int y) { return x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE; } // 深度优先搜索查找连通块 void dfs(int x, int y, Color color, std::set<std::pair<int, int>>& group, std::set<std::pair<int, int>>& liberties) { if (!isInBoard(x, y) || group.count({x, y})) return; if (board[x][y] == color) { group.insert({x, y}); dfs(x + 1, y, color, group, liberties); dfs(x - 1, y, color, group, liberties); dfs(x, y + 1, color, group, liberties); dfs(x, y - 1, color, group, liberties); } else if (board[x][y] == EMPTY) { liberties.insert({x, y}); } } // 检查连通块的气 int getLiberties(const std::set<std::pair<int, int>>& group) { std::set<std::pair<int, int>> liberties; for (const auto& [x, y] : group) { if (isInBoard(x + 1, y) && board[x + 1][y] == EMPTY) liberties.insert({x + 1, y}); if (isInBoard(x - 1, y) && board[x - 1][y] == EMPTY) liberties.insert({x - 1, y}); if (isInBoard(x, y + 1) && board[x][y + 1] == EMPTY) liberties.insert({x, y + 1}); if (isInBoard(x, y - 1) && board[x][y - 1] == EMPTY) liberties.insert({x, y - 1}); } return liberties.size(); } // 提子操作 int removeDeadStones(Color opponentColor) { int removed = 0; std::vector<std::pair<int, int>> deadStones; std::set<std::pair<int, int>> visited; for (int i = 0; i < BOARD_SIZE; ++i) { for (int j = 0; j < BOARD_SIZE; ++j) { if (board[i][j] == opponentColor && !visited.count({i, j})) { std::set<std::pair<int, int>> group; std::set<std::pair<int, int>> liberties; dfs(i, j, opponentColor, group, liberties); if (getLiberties(group) == 0) { for (const auto& [x, y] : group) { deadStones.push_back({x, y}); visited.insert({x, y}); } } } } } for (const auto& [x, y] : deadStones) { board[x][y] = EMPTY; ++removed; } return removed; } // 检查禁入点 bool isForbiddenPoint(int x, int y, Color color) { if (board[x][y] != EMPTY) return true; board[x][y] = color; std::set<std::pair<int, int>> group; std::set<std::pair<int, int>> liberties; dfs(x, y, color, group, liberties); int selfLiberties = getLiberties(group); Color opponentColor = (color == BLACK) ? WHITE : BLACK; int opponentDeadStones = removeDeadStones(opponentColor); board[x][y] = EMPTY; if (selfLiberties == 0 && opponentDeadStones == 0) { return true; } return false; } // 打劫检查 bool isKo(std::vector<std::vector<Color>> prevBoard, int x, int y, Color color) { std::vector<std::vector<Color>> tempBoard = board; tempBoard[x][y] = color; Color opponentColor = (color == BLACK) ? WHITE : BLACK; removeDeadStones(opponentColor); return tempBoard == prevBoard; } // 落子操作 bool placeStone(int x, int y, Color color, std::vector<std::vector<Color>> prevBoard) { if (isForbiddenPoint(x, y, color)) return false; if (isKo(prevBoard, x, y, color)) return false; board[x][y] = color; Color opponentColor = (color == BLACK) ? WHITE : BLACK; removeDeadStones(opponentColor); if (getLiberties({{x, y}}) == 0) { board[x][y] = EMPTY; return false; } return true; } // 计算胜负 std::pair<int, int> calculateScore() { int blackScore = 0; int whiteScore = 0; std::set<std::pair<int, int>> visited; for (int i = 0; i < BOARD_SIZE; ++i) { for (int j = 0; j < BOARD_SIZE; ++j) { if (board[i][j] == BLACK) { ++blackScore; } else if (board[i][j] == WHITE) { ++whiteScore; } else if (!visited.count({i, j})) { std::set<std::pair<int, int>> group; std::set<std::pair<int, int>> liberties; dfs(i, j, EMPTY, group, liberties); bool blackSurrounded = true; bool whiteSurrounded = true; for (const auto& [x, y] : liberties) { if (board[x][y] == BLACK) whiteSurrounded = false; if (board[x][y] == WHITE) blackSurrounded = false; } if (blackSurrounded) { blackScore += group.size(); } else if (whiteSurrounded) { whiteScore += group.size(); } for (const auto& [x, y] : group) { visited.insert({x, y}); } } } } return {blackScore, whiteScore}; } // 打印棋盘 void printBoard() { std::cout << " "; for (int i = 0; i < BOARD_SIZE; ++i) { std::cout << i << " "; } std::cout << std::endl; for (int i = 0; i < BOARD_SIZE; ++i) { std::cout << i << " "; for (int j = 0; j < BOARD_SIZE; ++j) { if (board[i][j] == EMPTY) { std::cout << ". "; } else if (board[i][j] == BLACK) { std::cout << "X "; } else { std::cout << "O "; } } std::cout << std::endl; } } int main() { Color currentPlayer = BLACK; std::vector<std::vector<Color>> prevBoard; while (true) { printBoard(); std::cout << (currentPlayer == BLACK ? "Black's turn" : "White's turn") << std::endl; int x, y; std::cout << "Enter x y coordinates (or -1 -1 to end the game): "; std::cin >> x >> y; if (x == -1 && y == -1) break; if (!isInBoard(x, y)) { std::cout << "Invalid coordinates. Try again." << std::endl; continue; } if (isForbiddenPoint(x, y, currentPlayer)) { std::cout << "This is a forbidden point. Try again." << std::endl; continue; } if (isKo(prevBoard, x, y, currentPlayer)) { std::cout << "Ko situation. Try again." << std::endl; continue; } prevBoard = board; if (placeStone(x, y, currentPlayer, prevBoard)) { currentPlayer = (currentPlayer == BLACK) ? WHITE : BLACK; } else { std::cout << "Invalid move. Try again." << std::endl; } } auto [blackScore, whiteScore] = calculateScore(); std::cout << "Final Score:" << std::endl; std::cout << "Black: " << blackScore << std::endl; std::cout << "White: " << whiteScore << std::endl; if (blackScore > whiteScore) { std::cout << "Black wins!" << std::endl; } else if (whiteScore > blackScore) { std::cout << "White wins!" << std::endl; } else { std::cout << "It's a draw!" << std::endl; } return 0; } ``` 代码说明: 1. 棋盘表示:使用二维向量 `board` 表示棋盘,`EMPTY` 表示空位,`BLACK` 表示黑子,`WHITE` 表示白子。 2. 深度优先搜索(DFS):用于查找连通块和气。 3. 提子操作:`removeDeadStones` 函数用于移除没有气的棋子。 4. 禁入点检查:`isForbiddenPoint` 函数检查落子点是否为禁入点。 5. 打劫检查:`isKo` 函数检查是否为打劫情况。 6. 落子操作:`placeStone` 函数进行落子,并处理提子和禁入点、打劫检查。 7. 计算胜负:`calculateScore` 函数计算双方的得分。 运行方式: 编译并运行该程序,按照提示输入落子的坐标,输入 `-1 -1` 结束游戏,程序将输出最终得分和胜负结果。 [2025-12-14 15:14:09 | AI问答 | 2523点数解答]
- [字节豆包] 年会表演串词,年会节目清单 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)28
- [字节豆包] 用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