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、随机数生成、控制流 等核心知识点,代码简洁规范,可直接用于课程设计报告或二次开发。
资源直通:
戳这里>>「