【C++】石头剪刀布游戏
C++石头剪刀布游戏课程设计实现,包含面向对象设计、随机数生成、胜负判定等功能,适合课程设计或编程练习~
1. 核心功能模块
- 玩家选择系统:用户输入选择(石头/剪刀/布)
- 计算机AI:随机生成选择(使用
rand()
和srand(time(0))
) - 胜负判定:根据规则判断结果(石头赢剪刀、剪刀赢布、布赢石头)
- 积分系统:记录玩家与计算机的胜负次数
- 数据持久化:保存历史战绩到文件(
fstream
) - 多轮对战:支持连续游戏直到用户退出
2. 类设计(面向对象实现)
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>// 玩家基类
class Player {
protected:std::string name;int wins = 0;
public:virtual int makeChoice() = 0; // 纯虚函数(接口)void addWin() { wins++; }int getWins() const { return wins; }
};// 人类玩家
class HumanPlayer : public Player {
public:HumanPlayer(const std::string& n) { name = n; }int makeChoice() override {int choice;std::cout << "请选择 (1.石头 2.剪刀 3.布): ";std::cin >> choice;return choice;}
};// 计算机玩家
class ComputerPlayer : public Player {
public:ComputerPlayer() { srand(time(0)); }int makeChoice() override {return rand() % 3 + 1; // 随机生成1~3}
};// 游戏控制类
class Game {
private:HumanPlayer human;ComputerPlayer computer;std::string resultFilePath = "records.txt";// 根据选择返回字符串std::string choiceToString(int choice) {switch (choice) {case 1: return "石头";case 2: return "剪刀";case 3: return "布";default: return "无效";}}// 保存记录到文件void saveRecord(const std::string& result) {std::ofstream out(resultFilePath, std::ios::app);if (out) out << result << "\n";}public:Game(const std::string& playerName) : human(playerName) {}void start() {while (true) {int hChoice = human.makeChoice();int cChoice = computer.makeChoice();// 显示双方选择std::cout << "你出了: " << choiceToString(hChoice) << " | 计算机出了: " << choiceToString(cChoice) << "\n";// 判定胜负if (hChoice == cChoice) {std::cout << "平局!\n";} else if ((hChoice == 1 && cChoice == 2) || (hChoice == 2 && cChoice == 3) || (hChoice == 3 && cChoice == 1)) {std::cout << "你赢了!\n";human.addWin();} else {std::cout << "计算机赢了!\n";computer.addWin();}// 保存本轮结果std::string record = "玩家: " + choiceToString(hChoice) + " vs 计算机: " + choiceToString(cChoice);saveRecord(record);// 是否继续char cont;std::cout << "继续游戏?(y/n): ";std::cin >> cont;if (cont != 'y') break;}// 显示最终战绩std::cout << "\n==== 最终战绩 ====\n"<< "玩家胜利次数: " << human.getWins() << "\n"<< "计算机胜利次数: " << computer.getWins() << "\n";}
};
3. 主函数逻辑
int main() {std::string playerName;std::cout << "输入你的名字: ";std::cin >> playerName;Game game(playerName);game.start();return 0;
}
⚙️ 关键技术解析
1.面向对象设计
Player
基类定义统一接口,HumanPlayer
和ComputerPlayer
分别实现决策逻辑。- 通过虚函数
makeChoice()
实现多态,扩展性强(可添加网络玩家)。
2.随机数生成
- 计算机使用
rand() % 3 + 1
生成随机选择,配合srand(time(0))
避免重复。
3.胜负判定算法
// 核心判定逻辑
if ((h == 1 && c == 2) || (h == 2 && c == 3) || (h == 3 && c == 1)) 玩家胜;
else if (h == c) 平局;
else 计算机胜;
4.数据持久化
- 使用
ofstream
将每局结果追加保存到records.txt
。
📊 扩展功能建议
-
历史战绩查询
void showHistory() {std::ifstream in("records.txt");std::string line;while (getline(in, line)) std::cout << line << "\n";
}
2.胜率统计
float winRate = (float)human.getWins() / totalRounds * 100;
3.图形界面
- 使用 Qt 或 SFML 替换控制台界面(参考俄罗斯方块和 Flappy Bird 的 GUI 设计)。
4.多语言支持
- 添加语言配置文件(如
zh_CN.json
),动态加载文本。
💻 编译运行
-
环境要求:
- C++11 及以上(支持
nullptr
和基于范围的 for 循环) - 编译器:GCC / Clang / MSVC
- C++11 及以上(支持
-
编译命令:
g++ -std=c++11 rock_paper_scissors.cpp -o rps_game
./rps_game
3.运行示例:
输入你的名字: Alice
请选择 (1.石头 2.剪刀 3.布): 1
你出了: 石头 | 计算机出了: 剪刀
你赢了!
继续游戏?(y/n): y
...(后续游戏循环)
此设计覆盖了 类继承、文件IO、随机数生成、控制流 等核心知识点,代码简洁规范,可直接用于课程设计报告或二次开发。
资源直通:
戳这里>>「