【C++】石头剪刀布游戏

发布于:2025-08-05 ⋅ 阅读:(16) ⋅ 点赞:(0)

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

📊 ​扩展功能建议

  1. 历史战绩查询

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),动态加载文本。

💻 ​编译运行

  1. 环境要求​:

    • C++11 及以上(支持 nullptr 和基于范围的 for 循环)
    • 编译器:GCC / Clang / MSVC
  2. 编译命令​:

g++ -std=c++11 rock_paper_scissors.cpp -o rps_game
./rps_game

        3.运行示例​:

输入你的名字: Alice
请选择 (1.石头 2.剪刀 3.布): 1
你出了: 石头 | 计算机出了: 剪刀
你赢了!
继续游戏?(y/n): y
...(后续游戏循环)

此设计覆盖了 ​类继承、文件IO、随机数生成、控制流​ 等核心知识点,代码简洁规范,可直接用于课程设计报告或二次开发。

资源直通​:

戳这里>>「」获取以下资源:

  1. 《C++后端开发高频八股文》
    涵盖23个核心考点,助你轻松应对面试!

  2. 《C/C++工程师能力自测清单》
    50+项技能树Checklist,快速定位技术短板!

  3. 【开源项目】libevent-master
    高性能网络库源码,深入理解事件驱动编程!

  4. 【开源项目】workflow-master
    现代C++异步任务调度框架,提升开发效率!

  5. 《LeetCode 101算法精讲》
    剑指Offer最优解合集,算法刷题必备神器!


网站公告

今日签到

点亮在社区的每一天
去签到