制作團隊:洛谷813622(Igallta) 989571(_ayaka_)
Mod:_ayaka_
雙人模式:Igallta
公告:
原先的9.8改名為 Alpha 1.0,以后每次更新都增加 0.1。
Alpha 1.11 改為 Beta 1.0。
手銬機制:朝自己開槍也算一個回合,例如:
上手銬+朝自己開槍 -> 朝對面開槍 -> 對面回合
Data:
Data 9.3:新增設定:對方死了之后對方的手銬也會解掉。
Data Alpha 1.1 :為防止有人鉆牛角尖,大部分改為 string 類型。
Data Alpha 1.2 :為防止有些人數道具是第幾號數大腦過載數暈過去了,顯示道具時會增加編號。
Data Alpha 1.3 :不能命名為上帝、God…不然就會&%#@&)DHD*#。
Data Alpha 1.4 :游戲結束后并不會立刻窗口結束,而是會等三秒后按任意鍵結束。
Data Alpha 1.5 :增加等待時間,讓你反應過來(原來只有 100ms,現在改為 500ms)。
Data Alpha 1.6 :縮短代碼長度,沒錯,僅此而已。
Data Alpha 1.7 :增加如果射出的是實彈那么窗口就會抖動、每次獲得的道具從固定4個改為 1~4 隨機。以及優化游玩體驗。
Data Alpha 1.8 :經討論,認為道具設置為 1~5 個/次更為合適。
Data Alpha 1.9 :優化玩家體驗。
Data Alpha 1.10 :修復關于輸入無限循環的 bug。
Data Beta 1.0 :刪除死亡后手銬解除的機制。
Data Beta 1.1 :修復在開發手銬時不小心讓p1直接獲得12個手銬的bug(汗),優化玩家體驗。
Date Beta 1.2:大大縮短代碼長度(目前有 bug 無法游玩)
/*
作者:洛谷813622、989571 csdn:luogu_Igallta
嚴禁搬遷
這個版本是Beta 1.1版本
*/
#include<bits/stdc++.h>
#include<windows.h>
#define clr system("cls")
#define int long long
using namespace std;
string dj[] = {"放大鏡", "華子", "小刀", "飲料", "手銬"}, zd[] = {"空彈", "實彈"}, pl1, pl2;
bool is1 = 1, sk, zs; //sk:手銬 zs:打自己
int yu, kb, sd, b1 = 2, win1,win2,b2 = 2, ls = 1, hit = 1, mxb = 2, jl; //jl:記錄被掛手銬后局數
vector<int>dj1, dj2;
queue<int>g;//槍械裝彈
inline void dist(int atime, int st = 20) {int shake_distance = 10, x, y, width, height;int counts = atime / st / 2;RECT rect;HWND window = NULL, oldwindow = NULL;for (int i = 1; i <= counts; i++) {window = GetForegroundWindow();if (window != oldwindow) {GetWindowRect(window, &rect);x = rect.left;y = rect.top;width = rect.right - x;height = rect.bottom - y;oldwindow = window;}MoveWindow(window, x - shake_distance, y, width, height, TRUE);Sleep(st);MoveWindow(window, x + shake_distance, y, width, height, TRUE);Sleep(st);}
}
inline void split() {clr;int shake_time = 20, shake_distance = 10, x, y, width, height;RECT rect;HWND window = NULL, oldwindow = NULL;clr;for (int i = 1; i <= 300; i++) {window = GetForegroundWindow();if (window != oldwindow) {GetWindowRect(window, &rect);x = rect.left;y = rect.top;width = rect.right - x;height = rect.bottom - y;oldwindow = window;}MoveWindow(window, x - shake_distance, y, width, height, TRUE);Sleep(shake_time);MoveWindow(window, x + shake_distance, y, width, height, TRUE);Sleep(shake_time);if (i == 1)cout << "你";else if (i == 20)cout << "怎";else if (i == 40)cout << "么";else if (i == 60)cout << "這";else if (i == 80)cout << "么";else if (i == 100)cout << "不";else if (i == 120)cout << "聽";else if (i == 140)cout << "話";else if (i == 160)cout << "呢";else if (i == 170)cout << "?";else if (i == 180)cout << "你";else if (i == 200)cout << "讓";else if (i == 220)cout << "我";else if (i == 240)cout << "要";else if (i == 260)cout << "消";else if (i == 280)cout << "失";else if (i == 300)cout << "了";}int t = 250;while (t--) {cout << "ERROR ";Sleep(3);}t = 20;while (t--)system("start cmd");t = 20;while (t--) {MessageBox(NULL, "ERROR!", "ERROR", MB_OK | MB_ICONWARNING);}exit(0);
}
inline void dontagain() {clr;Sleep(500);for (int i = 0; i <= 2; i++) {cout << '.';Sleep(1000);}cout << "夠";Sleep(2000);cout << "了!!!\n";dist(800);system("pause");cout << "你再這樣程序就出 bug 了!\n";system("pause");clr;
}
inline void drink() {int tmpo = g.front();g.pop();cout << "你選擇了飲料!退出的這發子彈是:" << zd[tmpo] << "!\n";--yu;if (tmpo) {--sd;} else --kb;Sleep(1500);
}
inline void over() {Sleep(1000);system("pause");clr;++ls;
}
inline void fdj() {cout << "當前子彈:";cout << zd[g.front()] << '\n';Sleep(1500);
}
signed main() {cout << "玩家1的名字:";cin >> pl1;int cnt1 = 0, cnt2 = 0;while (pl1 == "上帝" || pl1 == "GOD" || pl1 == "GOd" || pl1 == "GoD" || pl1 == "God" || pl1 == "gOD" || pl1 == "goD" || pl1 == "gOd" || pl1 == "god") {if (cnt1 == 6) {dontagain();}if (cnt1 == 12) {split();}cout << "ERROR 010101000110100001100101001000000100011101101111011001000010000001101000011000010111001100100000011000100110010101100101011011100010000001100100011001010110000101100100001011000111100101101111011101010010000001100011011000010110111000100111011101000010000001101110011000010110110101100101001000000111100101101111011101010111001000100000011011100110100101100011011010110110111001100001011011010110010100100000001000100100011101101111011001000010001000101110";cout << "\n你需要重新輸入一個名字......\n";++cnt1;cin >> pl1;}cout << "玩家2的名字:";cin >> pl2;while (pl2 == "上帝" || pl2 == "GOD" || pl2 == "GOd" || pl2 == "GoD" || pl2 == "God" || pl2 == "gOD" || pl2 == "goD" || pl2 == "gOd" || pl2 == "god") {if (cnt2 == 6) {dontagain();}if (cnt2 == 12) {split();}cout << "ERROR 010101000110100001100101001000000100011101101111011001000010000001101000011000010111001100100000011000100110010101100101011011100010000001100100011001010110000101100100001011000111100101101111011101010010000001100011011000010110111000100111011101000010000001101110011000010110110101100101001000000111100101101111011101010111001000100000011011100110100101100011011010110110111001100001011011010110010100100000001000100100011101101111011001000010001000101110";cout << "\n你需要重新輸入一個名字......\n";cin >> pl2;}clr;cout << "現在講解規則:\n小刀:可以讓下一發子彈傷害變成兩倍\n華子:可以回一滴血\n放大鏡:你可以查看當前子彈\n飲料:可以退一發子彈\n手銬:可以限制對方一回合動不了\n一共有3輪。\n";Sleep(1200);system("pause");clr;
start:;if (ls == 4) {clr;cout << "局數已到,游戲結束。\n";if(win1>win2){cout<<"p1贏了!";}else cout<<"p2贏了!";Sleep(2000);system("pause");exit(0);}//初始化b1 = 2 * ls;b2 = 2 * ls;hit = 1;zs = 0;sk = 0;yu = 0;kb = 0;sd = 0;jl = 0;mxb = b1;dj1.clear();dj2.clear();while (g.size())g.pop();cout << "第" << ls << "局\n目前比分(p1 : p2):"<<win1<<" : "<<win2<<'\n';Sleep(1200);clr;while (1) {clr;srand(time(0));if (!yu) {
sc:;int k = rand() % 5 + 1;cout << "現在開始上道具!\n" << pl1 << "(p1)獲得了:";for (int i = 1; i <= k; i++) {int t = rand() % 5;dj1.push_back(t);cout << dj[t] << ' ';Sleep(500);}cout << "\n現在" << pl1 << "(p1)擁有道具:\n";for (auto v : dj1) {cout << dj[v] << ' ';}cout << '\n';Sleep(1200);system("pause");clr;cout << pl2 << "(p2)獲得了:";for (int i = 1; i <= k; i++) {int t = rand() % 5;dj2.push_back(t);cout << dj[t] << ' ';Sleep(500);}cout << "\n現在" << pl2 << "(p2)擁有道具:\n";for (auto v : dj2) {cout << dj[v] << ' ';}cout << '\n';Sleep(1200);system("pause");clr;kb = rand() % 6 + 1;sd = rand() % 6 + 1;yu = (kb + sd);int tk = kb, ts = sd;cout << "空包彈有:" << kb << " 實彈有:" << sd << '\n';cout << "裝填子彈中......\n";srand(time(0));for (int i = 1; i <= yu; i++) {bool k = rand() % 2;if (k) {if (tk) {g.push(0);--tk;} else {g.push(1);--ts;}} else {if (ts) {g.push(1);--ts;} else {g.push(0);--tk;}}}Sleep(1200);}cout << "\n現在" << pl1 << "(p1)擁有道具:\n";for (auto v : dj1) {cout << dj[v] << ' ';}cout << "\n現在" << pl2 << "(p2)擁有道具:\n";for (auto v : dj2) {cout << dj[v] << ' ';}cout << "\n生命值(p1,p2):" << b1 << "," << b2 << "\n";cout << "空包彈有:" << kb << "發,實彈有:" << sd << "發\n";if (is1) {cout << "現在是" << pl1 << "(p1)的回合\n";
use1:;if (dj1.size()) {cout << "\n現在" << pl1 << "(p1)擁有道具:\n";int total = 0;for (auto v : dj1) {cout << (++total) << "號:" << dj[v] << " ";}cout << "你要使用道具嗎?(Y/N)\n";string t;
ques:;cin >> t;if (t.size() > 1) {cout << "請重新輸入:";goto ques;}char q = t[0];q = toupper(q);if (q == 'Y') {cout << "\n請告訴我要使用道具在你擁有的的編號(從1開始;輸入0代表不小心輸錯不使用道具):";int bh;string inp;
quesd1:;cin >> inp;if (inp.size() > 1) {cout << "不合法!\n請重新輸入!";goto quesd1;}if (!isdigit(inp[0])) {cout << "不合法!\n請重新輸入!";goto quesd1;}bh = inp[0] - 49;if (bh == -1)goto hit1;if (bh > dj1.size() - 1 || bh < 0) {cout << "不合法!\n請重新輸入!";goto quesd1;} else {int tmp = dj1[bh];dj1.erase(dj1.begin() + bh);switch (tmp) {case 0: {fdj();break;}case 1: {if (b1 == mxb) {cout << "達到上限值,無法回復。";} else {++b1;cout << "你選擇了華子!\n" << pl1 << "回復1點血量,現在他有" << b1 << "條生命值!";}Sleep(1500);break;}case 2: {if (hit == 2) {cout << "你在本回合已經使用了小刀,不能再使用了!將會新加小刀至末尾。\n";dj1.push_back(2);} else {hit = 2;cout << "你選擇了小刀!這一回合將造成雙倍傷害!\n";}Sleep(1500);break;}case 3: {drink();break;}case 4: {if (sk) {cout << "別人已經被銬起來了.....將把手銬移至末尾!\n";dj1.push_back(4);} else {sk = 1;jl = 0;cout << "你選擇了手銬!下一回合敵人將無法移動!\n";}Sleep(1500);break;}}if (!yu) {goto sc;}goto use1;}} else if (q == 'N') {cout << "好的。";} else {cout << "請重新輸入:";goto ques;}}
hit1:;cout << "你要打誰?(0:自己 1:另一名玩家):";string ht1;bool ht;cin>>ht1;if(ht1.size()>1||!isdigit(ht1[0])){cout<<"請重新輸入!\n";goto hit1; }ht=(ht1[0]-48);int k = g.front();if (ht) {if (k) {cout << "當前是實彈!" << pl2 << "受到了" << hit << "點傷害!\n";dist(400);b2 -= hit;--sd;} else {cout << "很遺憾,當前是空包彈。\n";--kb;}} else {zs = 1;if (k) {cout << "哦豁,當前是實彈!" << pl1 << "受到了" << hit << "點傷害!\n";dist(400);b1 -= hit;--sd;} else {cout << "恭喜你,當前是空包彈!\n";--kb;}}g.pop();Sleep(1000);--yu;hit = 1;} else {cout << "現在是" << pl2 << "(p2)的回合\n";
use2:;if (dj2.size()) {char q;int total = 0;cout << "\n現在" << pl2 << "(p2)擁有道具:\n";for (auto v : dj2) {cout << (++total) << "號:" << dj[v] << " ";}
ques2:;cout << "\n你要使用道具嗎?(Y/N)\n";string t;cin >> t;if (t.size() > 1) {cout << "請重新輸入:";goto ques2;}q = t[0];q = toupper(q);if (q == 'Y') {cout << "\n請告訴我要使用道具在你擁有的的編號(從1開始;輸入0代表不小心輸錯不使用道具):";string inp;
quesd2:;cin >> inp;if (inp.size() > 1) {cout << "不合法!\n請重新輸入!";goto quesd2;}if (!isdigit(inp[0])) {cout << "不合法!\n請重新輸入!";goto quesd2;}int bh = inp[0] - 49;if (bh == -1) {goto hit2;}if (bh > dj2.size() - 1 || bh < 0) {cout << "不合法!\n請重新輸入!";goto quesd2;} else {int tmp = dj2[bh];dj2.erase(dj2.begin() + bh);switch (tmp) {case 0: {fdj();break;}case 1: {if (b2 == mxb) {cout << "達到上限值,無法回復。";} else {++b2;cout << "你選擇了華子!\n" << pl2 << "回復1點血量,現在他有" << b2 << "條生命值!";}Sleep(1500);break;}case 2: {if (hit == 2) {cout << "你在本回合已經使用了小刀,不能再使用了!將會新加小刀至末尾。\n";dj2.push_back(2);} else {hit = 2;cout << "你選擇了小刀!這一回合將造成雙倍傷害!\n";}Sleep(1500);break;}case 3: {drink();break;}case 4: {if (sk) {cout << "別人已經被銬起來了......將把手銬移至末尾!\n";dj2.push_back(4);} else {sk = 1;jl = 0;cout << "你選擇了手銬!下一回合敵人將無法移動!\n";}Sleep(1500);break;}}if (!yu) {goto sc;}goto use2;}} else if (q == 'N') {cout << "好的。";} else {cout << "請重新輸入:";goto ques2;}}
hit2:;cout << "你要打誰?(0:自己 1:另一名玩家):";string ht1;bool ht;cin >> ht1;if(ht1.size()>1 || !isdigit(ht1[0])){cout<<"請重新輸入!\n";goto hit2;}ht=(ht1[0]-48);int k = g.front();if (ht) {if (k) {cout << "當前是實彈!" << pl1 << "受到了" << hit << "點傷害!\n";dist(400);b1 -= hit;--sd;} else {cout << "很遺憾,當前是空包彈。\n";--kb;}} else {zs = 1;if (k) {cout << "哦豁,當前是實彈!" << pl2 << "受到了" << hit << "點傷害!\n";dist(400);b2 -= hit;--sd;} else {cout << "恭喜你,當前是空包彈!\n";--kb;}}g.pop();Sleep(1000);--yu;hit = 1;}if (b1 <= 0) {clr;cout << pl2 << "贏了\n";++win2;over();goto start;}if (b2 <= 0) {clr;cout << pl1 << "贏了\n";++win1;over();goto start;}if (sk) {++jl;if (jl == 2) {sk = 0;jl = 0;}}if (!sk && !zs) {is1 = 1 - is1;}zs = 0;}return 0;
}
如果你的 Dev 說這個代碼 CE,解決方案如下:
最頂上一欄的“工具” -> “編譯選項” -> “編譯時加入以下參數”
填 -std=c++14 -O2 -lm -static
如果還是 CE,并且提示的里面含有 -std=c++14 -O2 -lm -static
,那么代表你的 Dev 版本過低,你需要下載 DevC++5.11 或 DevC++6.5(推薦下載 DevC++6.5)。
其他編譯器(諸如 VSCode Codeblock)我不知道,反正你使用的是 c++14 及以上版本即可。
歷代版本:
Alpha 1.2
Alpha 1.3
Alpha 1.4
Alpha 1.5
Alpha 1.6
Alpha 1.7
Alpha 1.8
Alpha 1.9
Alpha 1.10
Beta 1.0
Beta 1.1
Beta 1.2 很嚴重bug,修復中,請勿游玩
另外,我們也提供 Mod 玩法:
三國殺版本
-
如果原版復刻出現了 bug,請私信 Igallta 或者給這個博客回復。
-
如果Mod出現了 bug,請私信 _ayaka_ 或者給ta的博客回復。
-
有 bug 一定要說!而且一定要說明確,比如某些同學只說手銬有問題,我也不知道你出現了什么問題,只知道手銬有問題,導致我 de 了半天一點問題都沒看出來,也一頭霧水。如果你自己非要鉆牛角尖,輸入個什么轉義字符啊,ctrl啊…那些我們也沒辦法。就不要發出來了。
真要求改的話,你可以去找找 C/C++ 作者,和ta談談…