当前位置: 首页 > news >正文

【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

📊 ​扩展功能建议

  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最优解合集,算法刷题必备神器!

http://www.dtcms.com/a/315218.html

相关文章:

  • Makefile文件写法模板
  • 刷题记录0804
  • app-1
  • 1行JS实现无限滚动加载(Intersection Observer版)
  • vcpkg在vs/vscode下用法
  • 南水北调中线工程图件 shp数据
  • 飞算 JavaAI 操作全流程体验:一次面向纯 Java 项目的智能提效之旅
  • 【无标题】标准 I/O 中的一些函数,按功能分类说明其用法和特点
  • JavaScript中的作用域、闭包、定时器 由浅入深
  • idea添加gitlab访问令牌
  • 【Canvas与文字】生存与生活
  • 2025年08月04日Github流行趋势
  • 工控领域协议之Modbus
  • prometheus应用CounterGauge
  • prometheus应用demo(一)接口监控
  • 【MySQL04】:基础查询
  • 初识SpringBoot
  • Java计算机网络面试题
  • 【BUUCTF系列】[SUCTF 2019]EasySQL1
  • script标签放在header里和放在body底部里有什么区别?
  • 鸿蒙开发元组
  • 单点登录(SSO)全面解析:原理、实现与应用
  • 中标喜讯 | 安畅检测成功中标海南工信大脑(二期)软件测评服务
  • 基于SpringBoot的OA办公系统的设计与实现
  • docker-compose一键部署Springboot+Vue前后端分离项目
  • 映射公式解常微分方程,偏微分方程
  • JVM-自动内存管理-运行时数据区域
  • createAsyncThunk
  • 结构体数组2-单向链表
  • MySQL详解(一)