C++实现石头剪刀布胜负计数器
好的,这是一个非常清晰的编程问题。我们来一步步地用 C++ 实现它。 ### 🛠 准备工作 这个程序不需要任何外部库或特殊的环境配置。只需要一个支持 C++11 或更新标准的编译器(如 GCC、Clang、MSVC)即可。 ### 📝 核心思路 1. **读取输入**:从标准输入(通常是键盘)读取两个字符串,分别代表玩家 A 和玩家 B 的出拳序列。 2. **比较出拳**:遍历两个字符串的每个对应字符。对于每一轮,根据石头剪刀布的规则判断 A 是否获胜。 3. **规则定义**: - 石头 (`S`) 胜 剪刀 (`J`) - 剪刀 (`J`) 胜 布 (`B`) - 布 (`B`) 胜 石头 (`S`) - 其他情况(平局或A输)不计入A的获胜次数。 4. **输出结果**:输出 A 获胜的总轮数。 ### 💻 C++ 代码实现 ```cpp #include <iostream> #include <string> using namespace std; // 判断玩家A是否赢了当前这一轮 bool isWin(char a, char b) { // 规则映射:S 胜 J, J 胜 B, B 胜 S if (a == 'S' && b == 'J') return true; if (a == 'J' && b == 'B') return true; if (a == 'B' && b == 'S') return true; return false; } int main() { string aShots, bShots; // 读取两行字符串 cin >> aShots; cin >> bShots; // 确保长度相等(题目已保证) int n = aShots.length(); int winCount = 0; // 逐轮比较 for (int i = 0; i < n; ++i) { if (isWin(aShots[i], bShots[i])) { winCount++; } } // 输出结果 cout << winCount << endl; return 0; } ``` ### 📖 代码解析 | 部分 | 说明 | | :--- | :--- | | `#include <iostream>` 和 `#include <string>` | 引入标准输入输出流和字符串库。 | | `using namespace std;` | 使用标准命名空间,方便调用 `string`、`cin`、`cout` 等。 | | `bool isWin(char a, char b)` | 一个辅助函数,用于判断玩家A的出拳 `a` 是否赢了玩家B的出拳 `b`。函数内部用三个 `if` 语句覆盖了所有A获胜的场景。 | | `string aShots, bShots;` | 定义两个字符串变量,分别存储A和B的出拳序列。 | | `cin >> aShots; cin >> bShots;` | 使用 `cin` 从标准输入读取两行字符串。注意:`cin` 读取字符串时会以空格、换行等空白字符作为分隔符,这里由于每行只有一个字符串,所以读取效果正确。** *重要提示:** 如果字符串内部可能包含空格(本题不会),则需使用 `getline`。 | | `int n = aShots.length();` | 获取字符串长度,作为循环次数。 | | `for (int i = 0; i < n; ++i)` | 遍历字符串的每一个字符(即每一轮比赛)。 | | `if (isWin(aShots[i], bShots[i]))` | 调用 `isWin` 函数,判断当前轮次A是否获胜。 | | `winCount++;` | 如果A获胜,计数器加1。 | | `cout << winCount << endl;` | 输出最终的获胜次数。 | | `return 0;` | 程序正常结束。 | ### 🏆 示例运行 **输入:** ``` SJBS JBJS ``` **过程:** - 第1轮:A出S,B出J → A赢 - 第2轮:A出J,B出B → A赢 - 第3轮:A出B,B出J → 平局?不对,规则:B 包住 S,S 砸碎 J,J 剪 B。所以 B vs J 是J赢,B输。* 勘误:J 胜 B,所以 B 输,A输 (A出B,B出J) - 第4轮:A出S,B出S → 平局 **输出:** ``` 2 ``` ### 💡 开发建议 1. **输入验证**:虽然题目保证输入正确,但在实际开发中,建议添加检查两个字符串长度是否相等的逻辑,如果不相等应给出提示或处理异常。 2. **代码可读性**:使用 `isWin` 这样的辅助函数将判断逻辑与主循环分离,让代码意图更清晰,也便于后续修改规则(例如增加“蜥蜴”和“史波克”)。 3. **错误处理**:如果用户输入了不合法的字符(如 `'X'`),当前的 `isWin` 函数会返回 `false`(即认为A没赢)。根据需求,你可能需要添加非法输入的提示或处理。 4. **性能**:对于这种字符串长度有限的题目,无需担心性能。但如果字符串极长,可以考虑使用并行计算(如 `std::transform_reduce`)来优化,但通常没有必要。 ######[AI写代码神器 | 1233点数解答 | 2026-05-23 14:45:05]
- 生活大爆炸升级版猜拳游戏:代码实现、解释与复杂度分析(字节豆包 | 656点数解答 | 2025-11-26 18:54:37)74
- Java 继承实现:重温经典剪刀石头布游戏(字节豆包 | 451点数解答 | 2024-10-20 19:57:58)491
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)395
- C++统计数组中大于首元素个数的实现与优化指南(DeepSeek | 1123点数解答 | 2026-03-20 21:48:51)35
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)362
- iOS开发:手把手教你完整实现代理模式,含声明与实现步骤!(阿里通义 | 268点数解答 | 2023-11-08 00:39:55)282
- JavaScript 开发:用 Animation 实现自定义动画的简易教程 (阿里通义 | 333点数解答 | 2023-11-09 01:50:07)273
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)515
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)397
- Vue.js 与 Matter.js 碰撞:轻松实现物理模拟全攻略 (讯飞星火 | 522点数解答 | 2024-05-29 22:26:06)456
- JS实现移动端网页快捷键创建方式及注意事项(阿里通义 | 284点数解答 | 2024-06-05 19:02:59)287
- 车载系统 UML 类图设计:涵盖 Car、Engine、娱乐系统等的完整类定义与关系解析 (字节豆包 | 760点数解答 | 2024-08-15 22:51:04)337