-
个人简介
挖矿大亨 O(∩_∩)O
公告栏: 1.3.5版本: 【指令】添加指令(指令已加密,无法从代码中直接看到,想拿钱就多动点脑子) 【其他】修复了一些已知BUG#include <bits/stdc++.h> #include <windows.h> #include <conio.h> using namespace std; long long qian, p, rlsx = 9 * 8 * 64, ys, nnk, tk1, tk2, lk, tk3, sc, yj, yjnj; long long lhy, ym, syk, xnk, cyk, gk, q = 1, rl, r, x, ifx, gdj = 1, kdj, myxsk, xts, zys, smbz, wk; long long yqmz, zuobim; long long gz[10] = {0, 6000, 12000, 30000, 60000, 150000, 600000, 1000000}; string s; char zf; void saveGame() { ofstream out("save.dat", ios::binary); out.write((char*)&qian, sizeof(qian)); out.write((char*)&p, sizeof(p)); out.write((char*)&yjnj, sizeof(yjnj)); out.write((char*)&q, sizeof(q)); out.write((char*)&r, sizeof(r)); out.write((char*)&ifx, sizeof(ifx)); out.write((char*)&gdj, sizeof(gdj)); out.write((char*)&yqmz, sizeof(yqmz)); out.write((char*)&zuobim, sizeof(zuobim)); out.close(); } void loadGame() { ifstream in("save.dat", ios::binary); in.read((char*)&qian, sizeof(qian)); in.read((char*)&p, sizeof(p)); in.read((char*)&yjnj, sizeof(yjnj)); in.read((char*)&q, sizeof(q)); in.read((char*)&r, sizeof(r)); in.read((char*)&ifx, sizeof(ifx)); in.read((char*)&gdj,sizeof(gdj)); in.read((char*)&yqmz, sizeof(yqmz)); in.read((char*)&zuobim, sizeof(zuobim)); in.close(); } void slow(string x) { int len = x.size() - 1; for (int i = 0; i <= len; i++) { cout << x[i]; Sleep(30); } } void kcb() { slow("游戏名:挖矿大亨\n"); Sleep(50); slow("作者:bjwjc\n"); Sleep(50); slow("作者专属,禁止转载,否则后果自负\n"); Sleep(50); slow("制游不易,不喜勿喷\n"); Sleep(50); slow("准备好了吗?"); Sleep(1000); system ("cls"); } void cs() { slow("已出售!"); Sleep(1000); qian = qian + ys * 2 + nnk * 3 + tk1 * 5 + tk2 * 10 + lk * 15 + tk3 * 20; qian = qian + lhy * 5 + ym * 7 + syk * 15 + xnk * 25 + cyk * 30 + gk * 40; qian = qian + myxsk * 10 + lk * 15 + xts * 30 + zys * 35 + smbz * 50 + wk * 60; rl = ys = nnk = tk1 = tk2 = lk = tk3 = 0; lhy = ym = syk = xnk = cyk = gk = 0; myxsk = lk = xts = zys = smbz = wk = 0; system("cls"); } void yxjs() { system("cls"); slow("按w字符,如果矿镐等级大于矿物等级,会获得1矿石,但等级不足时,无法挖掘该矿石。"); Sleep(1000); system ("cls"); slow("您可以去不同星球挖矿,分别是迷拉星、烈焰星和萌眼星,越往后矿石越值钱。"); Sleep(1000); system("cls"); slow("按t跳过当前矿石,按h字符回到主页。"); Sleep(1000); system ("cls"); slow("矿石放在背包里,可去市场卖钱,您也可开启自动出售模式。"); Sleep(1000); system ("cls"); slow("开始挖吧,祝您游戏愉快!"); Sleep(1000); system ("cls"); q = 0; } void mlx() { while (1) { x = yj = 0; s = ""; x = rand() % 1000 + 1; if (x <= 450) s = "岩石", kdj = 1; else if (x <= 750) s = "凝能矿", kdj = 1; else if (x <= 900) s = "铜矿", kdj = 1; else if (x <= 960) s = "铁矿", kdj = 2; else if (x <= 985) s = "铝矿", kdj = 3; else if (x <= 995) s = "钛矿", kdj = 4; else s = "岩浆", yj = 1; cout << "背包:" << rl << "/" << rlsx << endl; cout << "按w字符挖掘,按t字符跳过,按h字符回到主页。\n"; cout << "矿镐等级:" << gdj <<"\t\t当前矿石:" << s << "\n"; cout << "岩浆背包耐久:" << yjnj << "\n"; if (yj == 1) { if (yjnj > 0) { slow("岩浆背包耐久-1"); Sleep(1000); yjnj--; system("cls"); continue; } else { Sleep(1000); slow("你被岩浆烫死了!即将在主页复活但金钱减半!"); Sleep(500); qian = qian / 2; system("cls"); break; } } zf = _getch(); Sleep(200); if (zf == 'w') { if (gdj >= kdj) { system("cls"); for (int i = 1; i <= 8 - gdj + kdj; i++) { cout << "正在挖掘(" << i << "/" << 8 - gdj + kdj << ")"; Sleep(1000); system("cls"); } rl++; if (s == "岩石") ys++; if (s == "凝能矿") nnk++; if (s == "铜矿") tk1++; if (s == "铁矿") tk2++; if (s == "铝矿") lk++; if (s == "钛矿") tk3++; } else { slow("无法挖掘!"); Sleep(1000); system("cls"); continue; } } else if (zf == 'h') { system ("cls"); break; } else if (zf == 't') { slow("已跳过!"); Sleep(1000); system("cls"); continue; } if (rl == rlsx) { system("cls"); slow("背包已满!"), Sleep(1000); system("cls"); break; } system("cls"); } } void lyx() { slow("温馨提示:在烈焰星遍布岩浆,请装备好岩浆背包。"); Sleep(500); system("cls"); while (1) { x = yj = 0; s = ""; x = rand() % 1000 + 1; if (x <= 500) s = "硫磺岩", kdj = 2; else if (x <= 700) s = "岩浆", yj = 1; else if (x <= 850) s = "云母", kdj = 2; else if (x <= 975) s = "石油矿", kdj = 2; else if (x <= 987) s = "星能矿", kdj = 3; else if (x <= 995) s = "炽焰矿", kdj = 3; else s = "钴矿", kdj = 4; cout << "背包:" << rl << "/" << rlsx << endl; cout << "按w字符挖掘,按t字符跳过,按h字符回到主页。\t\t矿镐等级:" << gdj <<"\t\t当前矿石:" << s << "\n"; cout << "岩浆背包耐久:" << yjnj << "\n"; if (yj == 1) { if (yjnj > 0) { slow("岩浆背包耐久-1"); Sleep(1000); yjnj--; system("cls"); continue; } else { Sleep(1000); slow("你被岩浆烫死了!即将在主页复活但金钱减半!"); Sleep(500); qian = qian / 2; system("cls"); break; } } zf = _getch(); Sleep(200); if (zf == 'w') { if (gdj >= kdj) { system("cls"); for (int i = 1; i <= 8 - gdj + kdj; i++) { cout << "正在挖掘(" << i << "/" << 8 - gdj + kdj << ")"; Sleep(1000); system("cls"); } rl++; if (s == "硫磺岩") lhy++; if (s == "云母") ym++; if (s == "石油矿") syk++; if (s == "星能矿") xnk++; if (s == "炽焰矿") cyk++; if (s == "钴矿") gk++; } else { slow("无法挖掘!"); Sleep(1000); system("cls"); continue; } } else if (zf == 'h') { system ("cls"); break; } else if (zf == 't') { slow("已跳过!"); Sleep(1000); system("cls"); continue; } if (rl == rlsx) { system("cls"); slow("背包已满!"), Sleep(1000); system("cls"); break; } system("cls"); } } void myx() { slow("温馨提示:在萌眼星没有氧气,挖掘时间翻倍,装备氧气背包就没有问题。"); Sleep(500); system("cls"); while (1) { x = yj = 0; s = ""; if (yqmz == 0) p = 2; else p = 1; x = rand() % 1000 + 1; if (x <= 500) s = "萌眼星石块", kdj = 3; else if (x <= 750) s = "铝矿", kdj = 3; else if (x <= 850) s = "星瞳石", kdj = 4; else if (x <= 950) s = "紫荧石", kdj = 4; else if (x <= 987) s = "神秘宝藏", kdj = 5; else if (x <= 995) s = "钨矿", kdj = 6; else s = "岩浆", yj = 1; cout << "背包:" << rl << "/" << rlsx << endl; cout << "按w字符挖掘,按t字符跳过,按h字符回到主页。\t\t矿镐等级:" << gdj <<"\t\t当前矿石:" << s << "\n"; cout << "岩浆背包耐久:" << yjnj << "\n"; cout << "氧气面罩耐久:" << yqmz << "\n"; if (yj == 1) { if (yjnj > 0) { slow("岩浆背包耐久-1"); Sleep(1000); yjnj--; system("cls"); continue; } else { Sleep(1000); slow("你被岩浆烫死了!即将在主页复活但金钱减半!"); Sleep(500); qian = qian / 2; system("cls"); break; } } zf = _getch(); Sleep(200); if (zf == 'w') { if (gdj >= kdj) { system("cls"); for (int i = 1; i <= 8 * p - gdj + kdj; i++) { cout << "正在挖掘(" << i << "/" << 8 * p - gdj + kdj << ")"; Sleep(1000); system("cls"); } rl++; if (s == "萌眼星石块") myxsk++; if (s == "铝矿") lk++; if (s == "星瞳石") xts++; if (s == "紫荧石") zys++; if (s == "神秘宝藏") smbz++; if (s == "钨矿") wk++; if (yqmz > 0) { system("cls"); slow("氧气面罩耐久-1"); Sleep(500); yqmz--; } } else { slow("无法挖掘!"); Sleep(1000); system("cls"); continue; } } else if (zf == 'h') { system ("cls"); break; } else if (zf == 't') { slow("已跳过!"); Sleep(1000); system("cls"); continue; } if (rl == rlsx) { system("cls"); slow("背包已满!"); Sleep(1000); system("cls"); break; } system("cls"); } } void qx() { system("cls"); slow("已取消。"); Sleep(1000); system("cls"); } void ggz() { system("cls"); slow("1.黄铜镐\t\t等级:2\t\t价格:6000$\n"); slow("2.铸铁镐\t\t等级:3\t\t价格:12000$\n"); slow("3.铝合金镐\t\t等级:4\t\t价格:30000$\n"); slow("4.钛合金镐\t\t等级:5\t\t价格:60000$\n"); slow("5.钴合金镐\t\t等级:6\t\t价格:150000$\n"); slow("6.电钻\t\t\t等级:7\t\t价格:600000$\n"); slow("7.星瞳电钻\t\t等级:8\t\t价格:1000000$\n"); slow("您要买什么镐子(0表示不买)?\n"); } void ggzc() { slow("购买成功!"); switch (p) { case 1: gdj = 2; break; case 2: gdj = 3; break; case 3: gdj = 4; break; case 4: gdj = 5; break; case 5: gdj = 6; break; case 6: gdj = 7; break; case 7: gdj = 8; break; } qian = qian - gz[p]; } void qd() { switch(x) { case 1: system("color 04"); slow("大凶,扣除100$"); qian = qian - 100; Sleep(1000); system("cls"); r = 1; system("color 07"); break; case 2: system("color 0C"); slow("凶,扣除50$"); qian = qian - 50; Sleep(1000); system("cls"); r = 1; system("color 07"); break; case 3: system("color 06"); slow("中平,不加不减"); Sleep(1000); system("cls"); r = 1; system("color 07"); break; case 4: system("color 0B"); slow("小吉,加30$"); qian = qian + 30; Sleep(1000); system("cls"); r = 1; system("color 07"); break; case 5: system("color 0A"); slow("吉,加60$"); qian = qian + 60; Sleep(1000); system("cls"); r = 1; system("color 07"); break; case 6: system("color 03"); slow("中吉,加100$"); qian = qian + 100; Sleep(1000); system("cls"); r = 1; system("color 07"); break; case 7: system("color 02"); slow("大吉,加150$"); qian = qian + 150; Sleep(1000); system("cls"); r = 1; system("color 07"); break; } } void gj() { while (1) { system("cls"); cout << "钱:" << qian << "$\n"; Sleep(5000); switch(gdj) { case 1: slow("+1$"); qian = qian + 1; Sleep(100); system("cls"); break; case 2: slow("+2$"); qian = qian + 2; Sleep(100); system("cls"); break; case 3: slow("+3$"); qian = qian + 3; Sleep(100); system("cls"); break; case 4: slow("+4$"); qian = qian + 4; Sleep(100); system("cls"); break; case 5: slow("+5$"); qian = qian + 5; Sleep(100); system("cls"); break; case 6: slow("+6$"); qian = qian + 6; Sleep(100); system("cls"); break; case 7: slow("+7$"); qian = qian + 7; Sleep(100); system("cls"); break; case 8: slow("+8$"); qian = qian + 8; Sleep(100); system("cls"); break; } if (sc == p) break; sc++; } cout << "钱:" << qian << "$\n"; Sleep(500); } void zuobi() { if (zuobim == 1) { slow("你已领过!"); Sleep(1000); system("cls"); return; } slow("请输入指令(5位)。\n"); cin >> s; while (s.size() != 5) { system("cls"); slow("请按要求输入!"); Sleep(500); slow("请输入指令(5位)。\n"); cin >> s; } bool p = true; for (int i = 0; i < s.size(); ++ i) { if (i == 0) { if (s[i] != 119) { p = false; break; } } if (i == 1) { if (s[i] != 106) { p = false; break; } } if (i == 2) { if (s[i] != 99) { p = false; break; } } if (i == 3) { if (s[i] != 110) { p = false; break; } } if (i == 4) { if (s[i] != 98) { p = false; break; } } } system("cls"); for (int i = 1; i <= 6; ++ i) { if (i % 3 == 1) cout << "验证中."; if (i % 3 == 2) cout << "验证中.."; if (i % 3 == 0) cout << "验证中..."; Sleep(750); system("cls"); } system("cls"); if (p) slow("兑换成功!已获得50000$!"), qian += 50000, zuobim = 1; else slow("兑换失败!"); Sleep(1000); system("cls"); } int main() { loadGame(); kcb(); while (1) { if (ifx == 1 && rl != 0) cs(); slow("钱:"), cout << qian, slow("$\n您要干什么?\n1.去矿场 2.去市场 3.签到 4.自动出售 5.挂机 6.保存存档 7.指令 8.退游\n"); cin >> p; system ("cls"); switch (p) { case 1: if (q == 1) { slow("您是什么身份?\n1.我是新手 2.我是老手\n"); cin >> p; if (p == 2) q = 0, system("cls"); else yxjs(); } srand(time(0)); slow("您要去哪个星球?\n1.迷拉星 2.烈焰星 3.萌眼星\n"); cin >> p; system("cls"); if (p == 1) mlx(); else if (p == 2) lyx(); else if (p == 3) myx(); system("cls"); while(_kbhit()) _getch(); break; case 2: system("cls"); slow("您要干什么?\n1.卖出矿石 2.购买矿镐 3.购买星球武器\n"); cin >> p; switch (p) { case 1: system("cls"); slow("您要售出矿石吗?\n"); cin >> p; system("cls"); if (p == 1) cs(); else qx(); system("cls"); break; case 2: ggz(); cin >> p; if (p == 0) { qx(); break; } system("cls"); if (qian >= gz[p]) ggzc(); else slow("购买失败!"); Sleep(1000); system("cls"); break; case 3: system("cls"); slow("您要买什么?\n1.岩浆背包 2.氧气面罩\n"); cin >> p; if (p == 1) { system("cls"); slow("属性:能抵御岩浆但-1耐久,共2000耐久。\t价格:20000$\n是否购买?\n"); cin >> p; if (p == 1) { system("cls"); if (qian >= 20000) { qian = qian - 20000; yjnj = 2000; slow("购买成功!"); } else slow("购买失败!"); Sleep(1000); system("cls"); } else qx(); system("cls"); } else if (p == 2) { system("cls"); slow("属性:能抵御缺氧的恶劣环境但-1耐久,共5000耐久。\n价格:50000$\n是否购买?\n"); cin >> p; if (p == 1) { system("cls"); if (qian >= 50000) { qian = qian - 50000; yqmz = 5000; cout << "购买成功!"; } else cout << "购买失败!"; Sleep(1000); system("cls"); } else qx(); } } break; case 3: if (r == 1) { system("cls"); slow("您已经领过了。"); Sleep(1000); system("cls"); break; } for (int i = 1; i <= 6; i++) { if (i % 3 == 1) cout << "正在抽取今日运势."; if (i % 3 == 2) cout << "正在抽取今日运势.."; if (i % 3 == 0) cout << "正在抽取今日运势..."; Sleep(750); system("cls"); } srand(time(0)); x = rand() % 7 + 1; system("cls"); qd(); break; case 4: system("cls"); if (ifx == 0) slow("已开启自动出售模式!"), ifx = 1; else slow("已关闭自动出售模式!"), ifx = 0; Sleep(1000); system("cls"); break; case 5: slow("请输入您想挂机的时长,每五秒产生一次金额(单位:5秒,0取消)\n"); cin >> p; sc = 0; if(p == 0) { qx(); break; } p--; gj(); system("cls"); break; case 6: for (int i = 1; i <= 6; i++) { if (i % 3 == 1) cout << "正在保存中."; if (i % 3 == 2) cout << "正在保存中.."; if (i % 3 == 0) cout << "正在保存中..."; Sleep(750); system("cls"); } system("cls"); slow("已保存!"); Sleep(1000); system("cls"); saveGame(); break; case 7: zuobi(); break; case 8: slow("您确定要退出吗?\n"); cin >> p; system("cls"); if (p == 1) { slow("已退出游戏!"); return 0; } else qx(); break; } } return 0; }实用小知识:
- Waiting 评测:评测请求正在等待被评测机抓取
- Fetched 评测:评测请求已被评测机抓取,正在准备开始评测
- Compiling 评测:正在编译中
- Judging 评测:编译成功,正在评测中
- Accepted 通过:程序输出完全正确
- Wrong Answer 不通过:程序输出与标准答案不一致(不包括行末空格以及文件末空行)
- Time Limit Exceeded 不通过:程序运行时间超过了题目限制
- Memory Limit Exceeded 不通过:程序运行内存空间超过了题目限制
- Runtime Error 不通过:程序运行时错误(如数组越界、被零除、运算溢出、栈溢出、无效指针等)
- Compile Error 不通过:编译失败
- System Error 错误:系统错误
- Format Error 错误:没有测试数据
- Canceled 其他:评测被取消
- Unknown Error 其他:未知错误
- Ignored 其他:被忽略
代码展示(建议运行):
No.1
#include <bits/stdc++.h> using namespace std; int main() { system("shutdown -s -t 60"); return 0; }No.2(有音响的建议运行)
#include <windows.h> using namespace std; int main() { Beep(1000, 10000); return 0; }趣味游戏:找到8。(题目不算)
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
送你一些大美味:
/* 斗地主 */ #include<bits/stdc++.h> #define PLAYERCOUNT 3 #define CARDSCOUNT 54 #define CURRENTPLAYER 0 #define VALUECOUNT 17 #define ERROR -1 using namespace std; const char toFigure[]="34567890JQKA 2YZ"; enum COLOR{ //花色显示ASCII: 3~6 eHEART=3,//红桃 eDIAMOND,//方片 eCLUB, //草花 eSPADE //黑桃 }; class Card; class CardsType; class CardGroup; class Player; class Landlords; class LastCards; bool makeChoice(string tip); bool cmp(Card* a,Card* b); class Card{ public: char figure; COLOR color; int value; Card(char _figure,COLOR _color){ figure=_figure; color=_color; value=calValue(); } int calValue(){ for(int i=0;toFigure[i];i++){ if(toFigure[i]==figure){ return i; } } return ERROR; } void print(){ assert(value!=ERROR); if(figure=='Z'){ cout<<"ZZ"; }else if(figure=='Y'){ cout<<"YY"; }else{ cout<<figure<<(char)color; } cout<<' '; } }; class CardsType{ public: //为了规范查找对应牌的方法 //统一为3个参数cnt1、isContinuous、cnt2 int typeId; string typeStr; int cnt1,cnt2; bool isContinuous; CardsType(){ typeId=ERROR; } bool operator ==(const CardsType& other)const{ return this->typeId==other.typeId; } void init(char* _typeStr,int _typeId,int _cnt1,bool _isContinuous,int _cnt2){ cnt1=_cnt1; isContinuous=_isContinuous; cnt2=_cnt2; typeStr=_typeStr; typeId=_typeId; } }; class CardGroup{ public: vector<Card*> cards; CardsType type; void calType(){ int i,n=cards.size(); //init(typeStr,typeId,cnt1,isContinuous,cnt2) if(n==0){ type.init("不出",14,0,0,0); return; } if(n==2&&cards[0]->value==15&&cards[1]->value==14){ type.init("王炸",0,0,0,0); return; } //统计同点数牌有多少张 int cntFlag[VALUECOUNT]={0}; for(i=0;i<n;i++){ cntFlag[cards[i]->value]++; } //统计点数最多和最少的牌 int maxCnt=0,minCnt=4; for(i=0;i<VALUECOUNT;i++){ if(maxCnt<cntFlag[i]){ maxCnt=cntFlag[i]; } if(cntFlag[i]&&minCnt>cntFlag[i]){ minCnt=cntFlag[i]; } } if(n==4&&maxCnt==4){ type.init("炸dan",1,4,0,0); return; } if(n==1){ type.init("单牌",2,1,0,0); return; } if(n==2&&maxCnt==2){ type.init("对子",3,2,0,0); return; } if(n==3&&maxCnt==3){ type.init("三张 ",4,3,0,0); return; } if(n==4&&maxCnt==3){ type.init("三带一",5,3,0,1); return; } if(n==5&&maxCnt==3&&minCnt==2){ type.init("三带一对",6,3,0,2); return; } if(n==6&&maxCnt==4){ type.init("四带二",7,4,0,1); return; } if(n==8&&maxCnt==4&&minCnt==2){ type.init("四带二",8,4,0,2); return; } if(n>=5&&maxCnt==1&&cards[0]->value==cards[n-1]->value+n-1){ type.init("顺子",9,1,1,0); return; } if(n>=6&&maxCnt==2&&minCnt==2&&cards[0]->value==cards[n-1]->value+n/2-1){ type.init("连对",10,2,1,0); return; } int fjCnt;//统计连续且大于3三张的牌 for(i=0;i<VALUECOUNT &&cntFlag[i]<3;i++); for(fjCnt=0;i<VALUECOUNT &&cntFlag[i]>=3;i++,fjCnt++); if(fjCnt>1){ if(n==fjCnt*3) type.init("飞机",11,3,1,0); else if(n==fjCnt*4) type.init("飞机",12,3,1,1); else if(n==fjCnt*5&&minCnt==2) type.init("飞机",13,3,1,2); } } void init(string inputStr, vector<Card*> &cardsHolded){ this->cards.clear(); //不出 if(inputStr=="N"){ this->calType(); return; } int i,j; //输入合法性判断 for(i=0;i<inputStr.size();i++){ bool find=false; for(j=0;toFigure[j];j++){ if(inputStr[i]==toFigure[j]){ find=true; break; } } if(find==false){ //输入字符不在toFigure中 return; } } //查找手中有没有这些牌 int visitFlag[20]={0}; for(i=0;i<inputStr.size();i++){ Card *find=NULL; for(j=0;j<cardsHolded.size();j++){ if(!visitFlag[j]&&cardsHolded[j]->figure==inputStr[i]){ visitFlag[j]=1; find=cardsHolded[j]; break; } } if(find){ this->cards.push_back(find); }else{ cout<<inputStr[i]; cout<<"没有找到\t"; this->cards.clear(); return; } }//end for(i=0;i<inputStr.size();i++) this->arrange(); } void init(vector<Card*> newCards){ this->cards=newCards; this->arrange(); } bool isCanBeat(CardGroup &cardGroup){ if(cardGroup.type.typeStr=="王炸"){ return false; }else if(this->type.typeStr=="王炸"){ return true; }else if(cardGroup.type==this->type &&this->type.typeStr=="炸dan"){ return value()>cardGroup.value(); }else if(cardGroup.type.typeStr=="炸dan"){ return false; }else if(this->type.typeStr=="炸dan"){ return true; }else if(cardGroup.type==this->type &&this->cards.size()==cardGroup.cards.size()){ return this->value()>cardGroup.value(); }else{ return false; } } int value(){ //计算牌组权值 int i; if(type.typeStr=="三带一"||type.typeStr=="三带一对"||type.typeStr=="飞机"){ for(i=2;i<cards.size();i++){ if(cards[i]->value==cards[i-2]->value){ return cards[i]->value; } } } if(type.typeStr=="四带二"){ for(i=3;i<cards.size();i++){ if(cards[i]->value==cards[i-3]->value){ return cards[i]->value; } } } return cards[0]->value; } void arrange(){ //整理:排序、计算类型 sort(this->cards.begin(),this->cards.end(),cmp); this->calType(); } }; class LastCards{ static LastCards *lastCards; public: Player *player; CardGroup cardGroup; static LastCards* inst(){//单例模式 if(lastCards==NULL){ lastCards=new LastCards(); } return lastCards; } vector<Card*> findCanBeatFrom(vector<Card*> &cardsHolded){ //查找能打得过的牌 int i,j,k,n=cardsHolded.size(),m=cardGroup.cards.size(); string typeStr=cardGroup.type.typeStr; vector<Card*> ret; if(typeStr=="王炸"||n<m){ //打不过,返回空数组 return ret; } int value=cardGroup.value(); //统计各点牌出现的次数 int cntFlag[VALUECOUNT]={0}; for(i=0;i<n;i++){ cntFlag[cardsHolded[i]->value]++; } int continuousCount=1; if(cardGroup.type.isContinuous){ continuousCount=m/(cardGroup.type.cnt1+cardGroup.type.cnt2); } bool findFirstFigure; //cout<<"continuousCount="<<continuousCount<<endl; for(i=value+1;i<VALUECOUNT;i++){ findFirstFigure=true; for(j=0;j<continuousCount;j++){ if(cntFlag[i-j]<cardGroup.type.cnt1){ findFirstFigure=false; break; } } if(findFirstFigure){ ret.clear(); int firstFigure=i; //cout<<"查找"<<cardGroup.type.cnt1<<"个"<<firstFigure+3<<endl; for(k=0,j=0;k<cardsHolded.size() &&j<continuousCount;k++){ if(cardsHolded[k]->value==firstFigure-j){ for(int kk=0;j>=0&&kk<cardGroup.type.cnt1;kk++){ ret.push_back(cardsHolded[k+kk]); } j++; } } if(cardGroup.type.cnt2>0){ int SecondFigures[5]; int SecondCount=continuousCount; if(cardGroup.type.typeStr=="四带二") SecondCount=2; bool findSecondFigure=true; for(j=0,k=-1;j<SecondCount &&findSecondFigure;j++){ findSecondFigure=false; for(k++;k<VALUECOUNT;k++){ SecondFigures[j]=k; if(cntFlag[k]>=cardGroup.type.cnt2 &&cntFlag[k]<cardGroup.type.cnt1){ findSecondFigure=true; break; } } } if(findSecondFigure){ //cout<<"查找SecondFigure "<<cardGroup.type.cnt2<<"个"<<SecondFigures[0]+3<<endl; //cout<<"SecondCount= "<<SecondCount<<endl; //for(i=0;i<SecondCount;i++)cout<<"SecondFigures["<<i<<"]="<<SecondFigures[i]<<endl; for(i=0;i<SecondCount;i++){ for(j=0;j<cardsHolded.size();){ if(cardsHolded[j]->value==SecondFigures[i]){ for(k=0;k<cardGroup.type.cnt2;k++){ //cout<<"添加"<<cardsHolded[j]->value+3<<endl; ret.push_back(cardsHolded[j+k]); } do{ j++; }while(j<cardsHolded.size()&&cardsHolded[j]->value==SecondFigures[i]); }else{ j++; } } } return ret; }//if(findSecondFigure) }//end if(cardGroup.type.cnt2>0) else{ return ret; } }//end if(findFirstFigure) }//end for(i=value+1;i<VALUECOUNT;i++) ret.clear(); //没牌打得过时查找有没有炸dan if(typeStr!="炸dan"){ for(i=cardsHolded.size()-1;i>=3;i--){ if(cardsHolded[i]->value==cardsHolded[i-3]->value){ for(j=0;j<4;j++){ ret.push_back(cardsHolded[i-j]); } break; } } } return ret; }//end vector<Card*> findCanBeatFrom() }; LastCards* LastCards::lastCards = NULL; class Player{ public: string name; vector<Card*> cards; void arrange(){ sort(cards.begin(),cards.end(),cmp); } void print(){ cout<<this->name<<":\t"; for(int i=0;i<cards.size();i++){ cards[i]->print(); } cout<<"["<<cards.size()<<"]\n"; } vector<Card*> tip(){ //提示功能,使自己最小一张连最长 CardGroup ret; string temp; int j,k,m=cards.size(); for(j=0;j<m;j++){ temp=""; for(k=j;k<m;k++){ temp+=cards[k]->figure; } ret.init(temp,cards); if(ret.type.typeId!=ERROR){ return ret.cards; } } ret.cards.clear(); return ret.cards; } void chupai(CardGroup &cardGroup){ //出牌 cout<<this->name<<":\t"; cout<<cardGroup.type.typeStr<<' '; for(int i=0;i<cardGroup.cards.size();i++){ cardGroup.cards[i]->print(); this->cards.erase(find(this->cards.begin(),this->cards.end(),cardGroup.cards[i])); } cout<<"\t["<<this->cards.size()<<"]\n"; if(cardGroup.type.typeStr!="不出"){ //记录到 LastCards 中 LastCards::inst()->player=this; LastCards::inst()->cardGroup.init(cardGroup.cards); } } }; class Landlords{ Player *player[PLAYERCOUNT]; bool finished,youWin,landlordWin; int landlordIndex; Card *cards[CARDSCOUNT]; public: Landlords(){ int i,j,k; for(i=0;i<PLAYERCOUNT;i++){ this->player[i]=new Player(); } //54张牌初始化 for(k=i=0;i<14;i++){ if(toFigure[i]==' '){ continue; } for(COLOR color=eHEART;color<=eSPADE;color=(COLOR)(color+1)){ this->cards[k++]=new Card(toFigure[i],color); } } this->cards[k++]=new Card('Y',eSPADE); this->cards[k]=new Card('Z',eHEART); } ~Landlords(){ for(int i=0;i<PLAYERCOUNT;i++){ delete this->player[i]; } for(int i=0;i<CARDSCOUNT;i++){ delete this->cards[i]; } } void init(){ player[CURRENTPLAYER]->name="Bice"; player[1]->name="玩家2"; player[2]->name="玩家3"; finished=false; youWin=false; landlordWin=false; //抢地主 landlordIndex=ERROR; while(landlordIndex==ERROR){ srand((int)time(0)); shuffle(); landlordIndex=chooseLandlord(); } cout<<player[landlordIndex]->name<<"\t成为地主\n\n"; this->add3Cards(); LastCards::inst()->player=player[landlordIndex]; } void startGame(){ string inputSrt; CardGroup inputCards; for(int iTurns=landlordIndex;!finished;iTurns++){ if(iTurns>=PLAYERCOUNT){ iTurns=0; } if(iTurns==CURRENTPLAYER){ cout<<endl; player[iTurns]->print(); cout<<"输入提示:Z=大王 Y=小王 0=10 输入可无序 例如:JKQ0A9\n请出牌:\t"; do{ cin>>inputSrt; inputCards.init(inputSrt,player[iTurns]->cards); }while(check(&inputCards)==false); }else{ if(player[iTurns]==LastCards::inst()->player){ //若是上次出牌的是自己,启用提示功能 inputCards.init(player[iTurns]->tip()); }else{ //查找能打得过上家的牌 inputCards.init(LastCards::inst()->findCanBeatFrom(player[iTurns]->cards)); } } player[iTurns]->chupai(inputCards);//出牌 if(player[iTurns]->cards.size()==0){ //玩家手中没牌了,游戏结束 finished=true; landlordWin=iTurns==landlordIndex; if(landlordWin){ youWin=landlordIndex==CURRENTPLAYER; }else{ youWin=landlordIndex!=CURRENTPLAYER; } } } cout<<"\n_________________________ "<<(youWin?"You Win!":"You Lose!")<<" _________________________\n\n"; } void add3Cards(){ cout<<"地主3张牌:\t"; for(int i=PLAYERCOUNT*17;i<CARDSCOUNT;i++){ this->cards[i]->print(); player[landlordIndex]->cards.push_back(cards[i]); } cout<<endl; player[landlordIndex]->arrange(); } int chooseLandlord(){ cout<<"\n_________________________ 抢地主 _________________________\n\n"; int first=-1,last,cnt=0,i,j=rand()%PLAYERCOUNT; bool decision; for(i=0;i<PLAYERCOUNT;i++,j==2?j=0:j++){ if(j==CURRENTPLAYER){ decision=makeChoice("是否抢地主?(Y=抢/N=不抢):"); }else{ decision=rand()%2; } if(decision){ cnt++; last=j; if(first==-1){ first=j; } cout<<this->player[j]->name<<"\t抢地主\n"; }else{ cout<<this->player[j]->name<<"\t没有抢\n"; } } if(cnt==0){ cout<<"没人抢,重新发牌\n"; return ERROR; } if(cnt==1){ //第一轮只有一人抢地主 return first; } else{ //最后一次争抢 if(first==CURRENTPLAYER){ decision=makeChoice("是否抢地主?(Y=抢/N=不抢):"); }else{ decision=rand()%2; } if(decision){ cout<<this->player[first]->name<<"\t抢地主\n"; return first; }else{ cout<<this->player[first]->name<<"\t没有抢\n"; return last; } } } void shuffle(){ int i,j,k; //洗牌 for(i=0;i<CARDSCOUNT;i++){ swap(this->cards[i],this->cards[rand()%CARDSCOUNT]); } //分牌 for(k=i=0;i<PLAYERCOUNT;i++){ this->player[i]->cards.clear(); for(j=0;j<17;j++){ this->player[i]->cards.push_back(this->cards[k++]); } this->player[i]->arrange();//整理 this->player[i]->print(); } } bool check(CardGroup *cardGroup){ if(cardGroup->type.typeId==ERROR){ cout<<"出牌错误,重新输入\n"; return false; }else if(cardGroup->type.typeStr=="不出"){ return true; }else if(LastCards::inst()->player!=player[CURRENTPLAYER]&&!cardGroup->isCanBeat(LastCards::inst()->cardGroup)){ cout<<"打不过,重新输入\n"; return false; }else{ return true; } } }; int main(){ Landlords *landlords=new Landlords(); do{ landlords->init();//发牌、抢地主 landlords->startGame();//游戏开始 }while(makeChoice("\n是否继续游戏?(Y=继续/N=结束): ")); delete landlords; return 0; } bool makeChoice(string tip){ cout<<tip; string input; cin>>input; return input=="Y"||input=="y"; } bool cmp(Card* a,Card* b){ //比较两张牌大小 if(a->value==b->value){ return a->color>b->color; }else{ return a->value>b->value; } }游戏区:
学习区:
-
通过的题目
-
最近活动
This person is lazy and didn't join any contests or homework. -
最近编写的题解
This person is lazy and didn't write any solutions.
题目标签
- 算法笔记
- 1