#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
// 新增:游戏说明函数
void showHelp() {
system("cls");
cout << "==================== 股市模拟游戏完整说明 ====================\n";
cout << "一、基础规则\n";
cout << "1. 初始本金 100000 元,纯模拟炒股,无真实金钱交易\n";
cout << "2. 系统自带4支默认股票,会随天数自动随机涨跌(-12%~+12%)\n";
cout << "3. 只有大盘开盘状态下才能买卖股票、刷新每日股价;休市禁止一切交易\n\n";
cout << "二、普通股民玩法(1-5功能)\n";
cout << "1 查看市场行情:浏览全部股票代码、名称、现价、涨跌幅、是否停牌\n";
cout << "2 买入股票:输入代码+数量,扣现金买入计入持仓\n";
cout << "3 卖出股票:卖出持仓股票,资金原路返回可用余额\n";
cout << "4 查看我的资产:显示现金、持仓个股、持仓均价、个股市值、总资产\n";
cout << "5 更新股价:模拟新的一天到来,系统股自动随机波动\n\n";
cout << "三、老板创业玩法(6-9开公司专属)\n";
cout << "6 自己开公司:最低10万现金,开办手续费扣除5万;自定义股票代码、公司名、行业、初始股价(1-20)、总股本(1000-100000);创建后自动持有自家公司50%股份上市交易\n";
cout << "7 老板调控自家股票:仅能操作自己创立的公司,包含小幅拉升、小幅打压、发布利好大涨、发布利空暴跌;自建股票不会随每日自动波动,完全由你手动控盘\n";
cout << "8 发放股东分红:自定义每股分红金额,所有持有该股票的股东均可获得现金分红\n";
cout << "9 增发股票:增加公司总股本,可用于稀释股份、扩容上市\n\n";
cout << "四、大盘全局控制(10号功能)\n";
cout << "10 大盘开盘/休市:开盘后可交易、可刷新股价;休市停止买卖、停止股价刷新;也可对单只股票停牌复牌限制交易\n\n";
cout << "五、游戏目标\n";
cout << "普通玩家:低吸高抛交易系统股,积累总资产冲击千万上亿\n";
cout << "老板玩家:创立上市公司,控盘股价吸引散户买入,靠分红、拉高套现赚取巨额资金\n";
cout << "===============================================================\n";
cout << "按回车返回主菜单...";
cin.get();
cin.get();
}
// 股票类
struct Stock {
string code; // 股票代码
string name; // 股票名称
double price; // 当前价格
double change; // 涨跌幅
bool isOpen; // 是否开盘交易
string owner; // 拥有者(自己开的公司)
int totalShares;// 总股本
};
// 持仓类
struct Hold {
string code;
int num;
// 持股数量
double buyPrice; // 买入均价
};
vector<Stock> stockList;
vector<Hold> myHold;
double money = 1000000000000.0;
bool marketOpen = true; // 大盘是否开盘
void initStock() {
stockList.push_back({"000001", "平安银行", 10.5, 0, true, "", 1000000});
stockList.push_back({"600000", "浦发银行", 8.2, 0, true, "", 1000000});
stockList.push_back({"300001", "特锐德", 15.3, 0, true, "", 1000000});
stockList.push_back({"601318", "中国平安", 42.6, 0, true, "", 1000000});
}
// 自己开公司
void createCompany() {
if (money < 100000) {
cout << "资金不足!需要至少10万资金开公司(手续费5万)" << endl;
return;
}
money -= 50000; // 手续费
string code, name, industry;
double initPrice;
int total;
cout << "请输入自定义股票代码:";
cin >> code;
cout << "请输入公司名称:";
cin >> name;
cout << "请输入行业(科技/餐饮/地产/新能源等):";
cin >> industry;
cout << "请输入初始股价(1~20):";
cin >> initPrice;
cout << "请输入总股本(1000~100000):";
cin >> total;
if (initPrice < 1 || initPrice > 20 || total < 1000 || total > 100000) {
cout << "参数非法!" << endl;
money += 50000;
return;
}
// 检查代码重复
for (auto &s : stockList) {
if (s.code == code) {
cout << "股票代码已存在!" << endl;
money += 50000;
return;
}
}
stockList.push_back({code, name, initPrice, 0, true, "me", total});
// 自动持有50%股份
myHold.push_back({code, total / 2, initPrice});
cout << "公司创建成功!已自动持有50%股份!" << endl;
}
// 老板调控自家股票:拉升/打压
void bossControlStock() {
cout << "1.拉升股价 2.打压股价 3.发布利好(大涨) 4.发布利空(大跌)" << endl;
int op;
cin >> op;
string code;
cout << "输入你的公司股票代码:";
cin >> code;
bool find = false;
for (auto &s : stockList) {
if (s.code == code && s.owner == "me") {
find = true;
double rate;
if (op == 1) rate = 0.08;
else if (op == 2) rate = -0.08;
else if (op == 3) rate = 0.20;
else if (op == 4) rate = -0.20;
else {
cout << "无效操作" << endl;
return;
}
s.price *= (1 + rate);
s.change = rate * 100;
cout << "操作完成!当前价格:" << fixed << setprecision(2) << s.price << endl;
break;
}
}
if (!find) cout << "不是你创建的公司!" << endl;
}
// 分红
void shareDividend() {
string code;
double perShare;
cout << "输入你的公司代码:";
cin >> code;
cout << "每股分红金额:";
cin >> perShare;
for (auto &s : stockList) {
if (s.code == code && s.owner == "me") {
// 简单实现:自己扣钱分给所有持股人
for (auto &h : myHold) {
if (h.code == code) {
money += h.num * perShare;
}
}
cout << "分红发放成功!" << endl;
return;
}
}
cout << "操作失败!" << endl;
}
// 增发股票
void addShares() {
string code;
int num;
cout << "输入你的公司代码:";
cin >> code;
cout << "增发数量:";
cin >> num;
for (auto &s : stockList) {
if (s.code == code && s.owner == "me") {
s.totalShares += num;
cout << "增发成功,当前总股本:" << s.totalShares << endl;
return;
}
}
cout << "操作失败!" << endl;
}
// 大盘开盘/休市
void openCloseMarket() {
cout << "1.开盘 2.休市" << endl;
int op;
cin >> op;
if (op == 1) {
marketOpen = true;
cout << "股市已开盘,可以交易!" << endl;
} else {
marketOpen = false;
cout << "股市已休市,暂停交易!" << endl;
}
}
// 波动:-12% ~ +12%,幅度更大,随机不稳定
void updatePrice() {
if (!marketOpen) {
cout << "当前休市,无法更新股价!" << endl;
return;
}
static bool first = true;
if (first) {
srand((unsigned)time(NULL));
first = false;
}
for (auto &s : stockList) {
if (!s.isOpen) continue; // 自己开的公司不自动随机波动,只能老板手动调控
if(s.owner == "me") continue;
double base = (rand() % 241 - 120) / 1000.0;
double randomFactor = (rand() % 5 + 7) / 10.0; // 0.7 ~ 1.2
double r = base * randomFactor;
s.change = r * 100;
s.price *= (1 + r);
if (s.price < 0.01) s.price = 0.01;
}
}
void showStock() {
cout << "\n===== 市场股票行情 ===" << endl;
if (!marketOpen) cout << "【当前休市】" << endl;
cout << left << setw(10) << "代码" << setw(12) << "名称" << setw(10) << "价格" << setw(10) << "涨跌幅(%)" << setw(10) << "是否开盘" << setw(10) << "我的公司" << endl;
for (auto &s : stockList) {
cout << left << setw(10) << s.code << setw(12) << s.name << setw(10) << fixed << setprecision(2) << s.price << setw(10) << fixed << setprecision(2) << s.change << setw(10) << (s.isOpen ? "是" : "否") << setw(10) << (s.owner=="me" ? "√" : "") << endl;
}
}
void buyStock(string code, int num) {
if (!marketOpen) {
cout << "当前休市,禁止交易!" << endl;
return;
}
Stock target;
bool find = false;
for (auto &s : stockList) {
if (s.code == code) {
if (!s.isOpen) {
cout << "该股票停牌,无法买入!" << endl;
return;
}
target = s;
find = true;
break;
}
}
if (!find) {
cout << "股票不存在!" << endl;
return;
}
double cost = target.price * num;
if (cost > money) {
cout << "资金不足,无法买入!" << endl;
return;
}
money -= cost;
bool has = false;
for (auto &h : myHold) {
if (h.code == code) {
h.buyPrice = (h.buyPrice * h.num + target.price * num) / (h.num + num);
h.num += num;
has = true;
break;
}
}
if (!has) {
myHold.push_back({code, num, target.price});
}
cout << "买入成功!" << endl;
}
void sellStock(string code, int num) {
if (!marketOpen) {
cout << "当前休市,禁止交易!" << endl;
return;
}
for (auto &h : myHold) {
if (h.code == code) {
if (h.num < num) {
cout << "持股数量不足!" << endl;
return;
}
double nowPrice = 0;
for (auto &s : stockList) {
if (s.code == code) {
if (!s.isOpen) {
cout << "该股票停牌,无法卖出!" << endl;
return;
}
nowPrice = s.price;
break;
}
}
double earn = nowPrice * num;
money += earn;
h.num -= num;
if (h.num == 0) {
for (auto it = myHold.begin(); it != myHold.end(); ++it) {
if (it->code == code) {
myHold.erase(it);
break;
}
}
}
cout << "卖出成功!" << endl;
return;
}
}
cout << "未持有该股票!" << endl;
}
void showAsset() {
cout << "\n===== 我的资产 =====" << endl;
cout << "可用资金:" << fixed << setprecision(2) << money << endl;
double stockValue = 0;
cout << left << setw(10) << "代码" << setw(10) << "持股数" << setw(12) << "买入均价" << setw(12) << "当前市值" << endl;
for (auto &h : myHold) {
double p = 0;
for (auto &s : stockList) {
if (s.code == h.code) {
p = s.price;
break;
}
}
double val = p * h.num;
stockValue += val;
cout << left << setw(10) << h.code << setw(10) << h.num << setw(12) << fixed << setprecision(2) << h.buyPrice << setw(12) << fixed << setprecision(2) << val << endl;
}
cout << "股票总市值:" << fixed << setprecision(2) << stockValue << endl;
cout << "总资产:" << fixed << setprecision(2) << money + stockValue << endl;
}
void menu() {
cout << "\n===== 模拟股票交易系统(可开公司) =====" << endl;
cout << "1. 查看市场行情" << endl;
cout << "2. 买入股票" << endl;
cout << "3. 卖出股票" << endl;
cout << "4. 查看我的资产" << endl;
cout << "5. 更新股价(模拟下一天)" << endl;
cout << "6. 自己开公司(创建股票)" << endl;
cout << "7. 老板调控自家股票" << endl;
cout << "8. 发放股东分红" << endl;
cout << "9. 增发股票" << endl;
cout << "10. 大盘开盘/休市" << endl;
cout << "11. 查看完整游戏说明" << endl;
cout << "0. 退出" << endl;
cout << "请输入操作:";
}
int main() {
initStock();
int op;
while (true) {
menu();
cin >> op;
if (op == 0) break;
if (op == 1) {
showStock();
} else if (op == 2) {
string c;
int n;
cout << "输入股票代码:";
cin >> c;
cout << "输入买入数量:";
cin >> n;
buyStock(c, n);
} else if (op == 3) {
string c;
int n;
cout << "输入股票代码:";
cin >> c;
cout << "输入卖出数量:";
cin >> n;
sellStock(c, n);
} else if (op == 4) {
showAsset();
} else if (op == 5) {
updatePrice();
cout << "股价已更新!" << endl;
} else if (op == 6) {
createCompany();
} else if (op == 7) {
bossControlStock();
} else if (op == 8) {
shareDividend();
} else if (op == 9) {
addShares();
} else if (op == 10) {
openCloseMarket();
} else if (op == 11) {
showHelp();
}
}
return 0;
}