diff --git a/Landlords/CQP.lib b/Landlords/CQP.lib new file mode 100644 index 0000000..fbed93a Binary files /dev/null and b/Landlords/CQP.lib differ diff --git a/Landlords/Debug/Landlords.log b/Landlords/Debug/Landlords.log new file mode 100644 index 0000000..5abdcb7 --- /dev/null +++ b/Landlords/Debug/Landlords.log @@ -0,0 +1,2 @@ + Room.cpp + Landlords.vcxproj -> F:\C++\代码\斗地主\Landlords\Debug\me.cqp.jie.landlords.dll diff --git a/Landlords/Debug/Landlords.obj b/Landlords/Debug/Landlords.obj new file mode 100644 index 0000000..f12e349 Binary files /dev/null and b/Landlords/Debug/Landlords.obj differ diff --git a/Landlords/Debug/Landlords.tlog/CL.command.1.tlog b/Landlords/Debug/Landlords.tlog/CL.command.1.tlog new file mode 100644 index 0000000..2724eef Binary files /dev/null and b/Landlords/Debug/Landlords.tlog/CL.command.1.tlog differ diff --git a/Landlords/Debug/Landlords.tlog/CL.read.1.tlog b/Landlords/Debug/Landlords.tlog/CL.read.1.tlog new file mode 100644 index 0000000..626c899 Binary files /dev/null and b/Landlords/Debug/Landlords.tlog/CL.read.1.tlog differ diff --git a/Landlords/Debug/Landlords.tlog/CL.write.1.tlog b/Landlords/Debug/Landlords.tlog/CL.write.1.tlog new file mode 100644 index 0000000..13d5b95 Binary files /dev/null and b/Landlords/Debug/Landlords.tlog/CL.write.1.tlog differ diff --git a/Landlords/Debug/Landlords.tlog/Landlords.lastbuildstate b/Landlords/Debug/Landlords.tlog/Landlords.lastbuildstate new file mode 100644 index 0000000..9bf4952 --- /dev/null +++ b/Landlords/Debug/Landlords.tlog/Landlords.lastbuildstate @@ -0,0 +1,2 @@ +#TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.16299.0 +Debug|Win32|F:\C++\代码\斗地主\Landlords\| diff --git a/Landlords/Debug/Landlords.tlog/Landlords.write.1u.tlog b/Landlords/Debug/Landlords.tlog/Landlords.write.1u.tlog new file mode 100644 index 0000000..0bee709 Binary files /dev/null and b/Landlords/Debug/Landlords.tlog/Landlords.write.1u.tlog differ diff --git a/Landlords/Debug/Landlords.tlog/link.command.1.tlog b/Landlords/Debug/Landlords.tlog/link.command.1.tlog new file mode 100644 index 0000000..0997eac Binary files /dev/null and b/Landlords/Debug/Landlords.tlog/link.command.1.tlog differ diff --git a/Landlords/Debug/Landlords.tlog/link.read.1.tlog b/Landlords/Debug/Landlords.tlog/link.read.1.tlog new file mode 100644 index 0000000..b7a5826 Binary files /dev/null and b/Landlords/Debug/Landlords.tlog/link.read.1.tlog differ diff --git a/Landlords/Debug/Landlords.tlog/link.write.1.tlog b/Landlords/Debug/Landlords.tlog/link.write.1.tlog new file mode 100644 index 0000000..2768970 Binary files /dev/null and b/Landlords/Debug/Landlords.tlog/link.write.1.tlog differ diff --git a/Landlords/Debug/Player.obj b/Landlords/Debug/Player.obj new file mode 100644 index 0000000..ac909d6 Binary files /dev/null and b/Landlords/Debug/Player.obj differ diff --git a/Landlords/Debug/PlayingCards.obj b/Landlords/Debug/PlayingCards.obj new file mode 100644 index 0000000..ed700c4 Binary files /dev/null and b/Landlords/Debug/PlayingCards.obj differ diff --git a/Landlords/Debug/Process.obj b/Landlords/Debug/Process.obj new file mode 100644 index 0000000..a8a9586 Binary files /dev/null and b/Landlords/Debug/Process.obj differ diff --git a/Landlords/Debug/Room.obj b/Landlords/Debug/Room.obj new file mode 100644 index 0000000..55f724c Binary files /dev/null and b/Landlords/Debug/Room.obj differ diff --git a/Landlords/Debug/Server.obj b/Landlords/Debug/Server.obj new file mode 100644 index 0000000..7ef2b66 Binary files /dev/null and b/Landlords/Debug/Server.obj differ diff --git a/Landlords/Debug/dllmain.obj b/Landlords/Debug/dllmain.obj new file mode 100644 index 0000000..05ac742 Binary files /dev/null and b/Landlords/Debug/dllmain.obj differ diff --git a/Landlords/Debug/me.cqp.jie.landlords.Build.CppClean.log b/Landlords/Debug/me.cqp.jie.landlords.Build.CppClean.log new file mode 100644 index 0000000..37fa317 --- /dev/null +++ b/Landlords/Debug/me.cqp.jie.landlords.Build.CppClean.log @@ -0,0 +1,34 @@ +f:\c++\代码\斗地主\landlords\debug\me.cqp.jie.landlords.pch.codeanalysis +f:\c++\代码\斗地主\landlords\debug\vc141.pdb +f:\c++\代码\斗地主\landlords\debug\vc141.idb +f:\c++\代码\斗地主\landlords\debug\me.cqp.jie.landlords.pch.codeanalysisast +f:\c++\代码\斗地主\landlords\debug\stdafx.nativecodeanalysis.xml +f:\c++\代码\斗地主\landlords\debug\stdafx.obj +f:\c++\代码\斗地主\landlords\debug\me.cqp.jie.landlords.pch +f:\c++\代码\斗地主\landlords\debug\dllmain.nativecodeanalysis.xml +f:\c++\代码\斗地主\landlords\debug\landlords.nativecodeanalysis.xml +f:\c++\代码\斗地主\landlords\debug\player.nativecodeanalysis.xml +f:\c++\代码\斗地主\landlords\debug\process.nativecodeanalysis.xml +f:\c++\代码\斗地主\landlords\debug\room.nativecodeanalysis.xml +f:\c++\代码\斗地主\landlords\debug\server.nativecodeanalysis.xml +f:\c++\代码\斗地主\landlords\debug\server.obj +f:\c++\代码\斗地主\landlords\debug\room.obj +f:\c++\代码\斗地主\landlords\debug\process.obj +f:\c++\代码\斗地主\landlords\debug\player.obj +f:\c++\代码\斗地主\landlords\debug\landlords.obj +f:\c++\代码\斗地主\landlords\debug\dllmain.obj +f:\c++\代码\斗地主\landlords\debug\me.cqp.jie.landlords.lib +f:\c++\代码\斗地主\landlords\debug\me.cqp.jie.landlords.exp +f:\c++\代码\斗地主\landlords\debug\me.cqp.jie.landlords.dll +f:\c++\代码\斗地主\landlords\debug\me.cqp.jie.landlords.ilk +f:\c++\代码\斗地主\landlords\debug\me.cqp.jie.landlords.pdb +f:\c++\代码\斗地主\landlords\debug\nativecodeanalysis.read.1.tlog +f:\c++\代码\斗地主\landlords\debug\vc.nativecodeanalysis.all.xml +f:\c++\代码\斗地主\landlords\debug\me.cqp.jie.landlords.dll.lastcodeanalysissucceeded +f:\c++\代码\斗地主\landlords\debug\landlords.tlog\cl.command.1.tlog +f:\c++\代码\斗地主\landlords\debug\landlords.tlog\cl.read.1.tlog +f:\c++\代码\斗地主\landlords\debug\landlords.tlog\cl.write.1.tlog +f:\c++\代码\斗地主\landlords\debug\landlords.tlog\landlords.write.1u.tlog +f:\c++\代码\斗地主\landlords\debug\landlords.tlog\link.command.1.tlog +f:\c++\代码\斗地主\landlords\debug\landlords.tlog\link.read.1.tlog +f:\c++\代码\斗地主\landlords\debug\landlords.tlog\link.write.1.tlog diff --git a/Landlords/Debug/me.cqp.jie.landlords.dll b/Landlords/Debug/me.cqp.jie.landlords.dll new file mode 100644 index 0000000..0fb14d4 Binary files /dev/null and b/Landlords/Debug/me.cqp.jie.landlords.dll differ diff --git a/Landlords/Debug/me.cqp.jie.landlords.exp b/Landlords/Debug/me.cqp.jie.landlords.exp new file mode 100644 index 0000000..a967062 Binary files /dev/null and b/Landlords/Debug/me.cqp.jie.landlords.exp differ diff --git a/Landlords/Debug/me.cqp.jie.landlords.ilk b/Landlords/Debug/me.cqp.jie.landlords.ilk new file mode 100644 index 0000000..9810801 Binary files /dev/null and b/Landlords/Debug/me.cqp.jie.landlords.ilk differ diff --git a/Landlords/Debug/me.cqp.jie.landlords.lib b/Landlords/Debug/me.cqp.jie.landlords.lib new file mode 100644 index 0000000..7305db2 Binary files /dev/null and b/Landlords/Debug/me.cqp.jie.landlords.lib differ diff --git a/Landlords/Debug/me.cqp.jie.landlords.pch b/Landlords/Debug/me.cqp.jie.landlords.pch new file mode 100644 index 0000000..0da2d72 Binary files /dev/null and b/Landlords/Debug/me.cqp.jie.landlords.pch differ diff --git a/Landlords/Debug/me.cqp.jie.landlords.pdb b/Landlords/Debug/me.cqp.jie.landlords.pdb new file mode 100644 index 0000000..4f41cb0 Binary files /dev/null and b/Landlords/Debug/me.cqp.jie.landlords.pdb differ diff --git a/Landlords/Debug/stdafx.obj b/Landlords/Debug/stdafx.obj new file mode 100644 index 0000000..df512b7 Binary files /dev/null and b/Landlords/Debug/stdafx.obj differ diff --git a/Landlords/Debug/vc141.idb b/Landlords/Debug/vc141.idb new file mode 100644 index 0000000..ed6dde5 Binary files /dev/null and b/Landlords/Debug/vc141.idb differ diff --git a/Landlords/Debug/vc141.pdb b/Landlords/Debug/vc141.pdb new file mode 100644 index 0000000..f517304 Binary files /dev/null and b/Landlords/Debug/vc141.pdb differ diff --git a/Landlords/Landlords.cpp b/Landlords/Landlords.cpp new file mode 100644 index 0000000..8b98cb3 Binary files /dev/null and b/Landlords/Landlords.cpp differ diff --git a/Landlords/Landlords.h b/Landlords/Landlords.h new file mode 100644 index 0000000..443d28c --- /dev/null +++ b/Landlords/Landlords.h @@ -0,0 +1,3 @@ +#pragma once +#define CQAPPID "me.cqp.jie.landlords" //޸AppID http://d.cqp.me/Pro//Ϣ +#define CQAPPINFO CQAPIVERTEXT "," CQAPPID \ No newline at end of file diff --git a/Landlords/Landlords.sln b/Landlords/Landlords.sln new file mode 100644 index 0000000..ef527a1 --- /dev/null +++ b/Landlords/Landlords.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2036 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Landlords", "Landlords.vcxproj", "{B402092F-048F-49AD-83D4-2AA6147FFD4D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B402092F-048F-49AD-83D4-2AA6147FFD4D}.Debug|x64.ActiveCfg = Debug|x64 + {B402092F-048F-49AD-83D4-2AA6147FFD4D}.Debug|x64.Build.0 = Debug|x64 + {B402092F-048F-49AD-83D4-2AA6147FFD4D}.Debug|x86.ActiveCfg = Debug|Win32 + {B402092F-048F-49AD-83D4-2AA6147FFD4D}.Debug|x86.Build.0 = Debug|Win32 + {B402092F-048F-49AD-83D4-2AA6147FFD4D}.Release|x64.ActiveCfg = Release|x64 + {B402092F-048F-49AD-83D4-2AA6147FFD4D}.Release|x64.Build.0 = Release|x64 + {B402092F-048F-49AD-83D4-2AA6147FFD4D}.Release|x86.ActiveCfg = Release|Win32 + {B402092F-048F-49AD-83D4-2AA6147FFD4D}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C440E136-2D5E-4954-92E5-3F28627FC23B} + EndGlobalSection +EndGlobal diff --git a/Landlords/Landlords.vcxproj b/Landlords/Landlords.vcxproj new file mode 100644 index 0000000..431d70a --- /dev/null +++ b/Landlords/Landlords.vcxproj @@ -0,0 +1,190 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {B402092F-048F-49AD-83D4-2AA6147FFD4D} + Win32Proj + Landlords + 10.0.16299.0 + + + + DynamicLibrary + true + v141 + Unicode + + + DynamicLibrary + false + v141 + true + Unicode + + + DynamicLibrary + true + v141 + Unicode + + + DynamicLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + me.cqp.jie.landlords + + + true + + + false + me.cqp.jie.landlords + + + false + + + + Use + Level3 + Disabled + true + WIN32;_DEBUG;LANDLORDS_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Use + Level3 + Disabled + true + _DEBUG;LANDLORDS_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Use + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;LANDLORDS_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + Use + Level3 + MaxSpeed + true + true + true + NDEBUG;LANDLORDS_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Landlords/Landlords.vcxproj.filters b/Landlords/Landlords.vcxproj.filters new file mode 100644 index 0000000..fbfcf4e --- /dev/null +++ b/Landlords/Landlords.vcxproj.filters @@ -0,0 +1,84 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + + + + + + + + + + \ No newline at end of file diff --git a/Landlords/Landlords.vcxproj.user b/Landlords/Landlords.vcxproj.user new file mode 100644 index 0000000..7e04c94 --- /dev/null +++ b/Landlords/Landlords.vcxproj.user @@ -0,0 +1,6 @@ + + + + false + + \ No newline at end of file diff --git a/Landlords/Player.cpp b/Landlords/Player.cpp new file mode 100644 index 0000000..54f8453 --- /dev/null +++ b/Landlords/Player.cpp @@ -0,0 +1,13 @@ +#include "stdafx.h" +#include "Player.h" + + +Player::Player(playerID_t id): + m_id(id), m_name(), m_integral(0), m_currRoom(0), isReady(false) +{ +} + + +Player::~Player() +{ +} diff --git a/Landlords/Player.h b/Landlords/Player.h new file mode 100644 index 0000000..16c8fa0 --- /dev/null +++ b/Landlords/Player.h @@ -0,0 +1,36 @@ +#pragma once + +#include "define.h" +// #include + +class Player +{ +public: + Player() = delete; + Player(playerID_t id); + ~Player(); + + playerID_t getID() { return m_id; } + int getIntegral() { return m_integral; } + roomID_t getCurrRoom() { return m_currRoom; } + void setCurrRoom(roomID_t rid) { m_currRoom = rid; } + std::string getName() { return m_name; } + void setName(std::string newName) { m_name = newName; } + void setIntegral(int integral) { m_integral = integral; } + + // ÷ Ϊӷ Ϊ۷ + void score(int integral) { m_integral += integral; } + + bool operator==(Player &rhs) { return m_id == rhs.getID(); } + bool operator==(playerID_t pid) { return m_id == pid; } + bool operator<(Player &rhs) { return m_id < rhs.getID(); } + bool operator<(playerID_t pid) { return m_id < pid; } +public: + bool isReady; // ׼ +private: + playerID_t m_id; // ΨһID + std::string m_name; // dz + int m_integral; // + roomID_t m_currRoom; // ǰڷ(0Ϊ) +}; + diff --git a/Landlords/PlayingCards.cpp b/Landlords/PlayingCards.cpp new file mode 100644 index 0000000..1f32acb --- /dev/null +++ b/Landlords/PlayingCards.cpp @@ -0,0 +1,153 @@ +#include "stdafx.h" +#include "PlayingCards.h" + +void PlayingCards::updata() +{ + if (cards.empty()) + { + type = c0; + return; + } + std::sort(cards.begin(), cards.end()); + size = cards.size(); + if (size == 2 && cards[0] == _S && cards[1] == _B) + { + type = c11; + } + else if (size < 5) // С5 + { + // βͬ ˫ ը + if (cards.front() == cards.back()) + { + if (size == 1) + type = c1; + else if (size == 2) + type = c2; + else if (size == 3) + type = c3; + else if (size == 4) + type = c4; + max = cards[0]; + } + else if (size == 4) // Ųͬ һ? + { + if (cards[0] == cards[2]) + type = c31, max = cards[0]; + else if (cards[1] == cards[3]) + type = c31, max = cards[1]; + else + type = c0; + } + } + else if (size >= 5) // ڵ5 + { + // std::vector cards; Ҫʶ + // arr[0] ظһε + // arr[1] ظε + // arr[2] ظε + // arr[3] ظĴε + std::vector arr[4]; + for (int index = 0; index < size;) + { + card_t temp = cards[index++]; + int count = 1; + for (; index < size && temp == cards[index]; ++index) + count++; + if (temp == _S || temp == _B && count > 1) // Сжģ + type = c0; + if (count > 4) // һģ + type = c0; + else + arr[count - 1].push_back(temp); + } + + // һ + if (size == 5 && arr[2].size() == 1 && arr[1].size() == 1) + type = c32, max = arr[2].front(); + // Ĵ 333345666677 + else if (size == 6 && arr[3].size() == 1) + type = c411, max = arr[3].front(); + // Ĵ + else if (size == 8 && arr[3].size() == 1 && arr[1].size() == 2) + type = c422, max = arr[3].front(); + // ˳ + else if (size == arr[0].size() + && arr[0].back() - arr[0].front() == size - 1 // һżһ == -1 + && arr[0].back() < _2) // С2 + { + type = c123, max = arr[0].back(); + } + // + else if (size / 2 >= 3 && (size % 2 == 0) // жǷ3Բż + && arr[1].size() == size / 2 // DzǶǶ + && arr[1].back() - arr[1].front() == size / 2 - 1 // Dzŵ + && arr[1].back() < _2) // С2 + { + type = c1122, max = arr[1].back(); + } + // ɻ + else if (arr[2].size() == size / 3 + && (size % 3 == 0) + && arr[2].back() - arr[2].front() == (size / 3 - 1) + && arr[2].back() < _2) + { + type = c111222, max = arr[2].back(); + } + // ɻ + else if (arr[2].size() >= 2 + && arr[2].size() == size / 4 + && (size % 4 == 0) + && arr[2].back() - arr[2].front() == size / 4 - 1 + && arr[2].back() < _2) + { + type = c11122234, max = arr[2].back(); + } + // ɻ ˫ + else if (arr[2].size() >= 2 + && arr[2].size() == size / 5 + && (size % 5 == 0) // 5 + && arr[2].back() - arr[2].front() == size / 5 - 1 // Ƿ + && arr[1].size() == size / 5 // ͬĶ + && arr[2].back() < _2) + { + type = c1112223344, max = arr[2].back(); + } + // ʲôǣܳ + else + type = c0; + + // ƽͬǰ + if (type != c0) + { + int index = 0; + for (int r = 3; r >= 0; --r) + { + for (int i = 0; i < arr[r].size(); ++i) + { + for (int j = 0; j < r+1; ++j) + cards[index++] = arr[r][i]; + } + } + + } + } // ڵ5 -- end + +} + +bool PlayingCards::operator<(const PlayingCards & rhs) const +{ + // ը + if (type == c11) + return false; + else if (rhs.type == c11) + return true; + + // ը + if (type == c4 && rhs.type != c4) + return false; + else if (type != c4 && rhs.type == c4) + return true; + + // ٶһȽȨֵ + return max < rhs.max; +} diff --git a/Landlords/PlayingCards.h b/Landlords/PlayingCards.h new file mode 100644 index 0000000..5c110bf --- /dev/null +++ b/Landlords/PlayingCards.h @@ -0,0 +1,41 @@ +#pragma once +#include "define.h" +#include + +enum CardType { + c1, // + c2, // + c3, //3 + c4, //ը + c11, //ը + c31, //31 + c32, //32 + c411, //42һ + c422, //42 + c123, // + c1122, // + c111222, //ɻ + c11122234, //ɻ + c1112223344,//ɻ + c0 //ܳ +}; + + + +class PlayingCards +{ +public: + PlayingCards() = delete; + PlayingCards(const std::vector& incards):cards(incards) { updata(); }; + void updata(); + std::vector cards; + const std::vector & getVec() const { return cards; } + CardType getType() const { return type; } + int getSize() const { return size; } + // ȽϴСǷ + bool operator<(const PlayingCards& rhs) const; +private: + CardType type; // + card_t max; // Ȩֵ + int size; // Ƶ +}; \ No newline at end of file diff --git a/Landlords/Process.cpp b/Landlords/Process.cpp new file mode 100644 index 0000000..d0f9478 --- /dev/null +++ b/Landlords/Process.cpp @@ -0,0 +1,773 @@ +#include "stdafx.h" +#include "Process.h" +using namespace std; +extern int ac; +string playerInfoToString(Player* pplayer) +{ + ostringstream out; + if (pplayer == nullptr) + { + out << "ҲϢ" << endl; + } + else { + out << "dz:" << pplayer->getName() << '\t' + << "id:" << pplayer->getID() << '\t' + << ":" << pplayer->getIntegral() << '\t'; + roomID_t rid = pplayer->getCurrRoom(); + if (rid != 0) + { + out << "ID:" << rid; + } + else { + out << ""; + } + } + return out.str(); +} + +string playerInfoToString(playerID_t pid) +{ + ostringstream out; + auto pplayer = server().getPlayer(pid); + out << playerInfoToString(pplayer); + return out.str(); +} + +string playerListToString() +{ + ostringstream out; + for (auto i : server().getPlayerList()) + { + out << playerInfoToString(&i) << endl; + } + return out.str(); +} + +string roomInfoToString(roomID_t rid) +{ + ostringstream out; + Room *proom = server().getRoom(rid); + if (proom == nullptr) + { + out << "Ҳ÷"; + return out.str(); + } + out << "id:" << proom->getID() << endl; + auto plist = proom->getPlayerIDList(); + out << ":" << plist.size() << endl; + out << "ϸϢ:" << endl; + for (auto i : plist) + { + auto pplayer = server().getPlayer(i); + if (pplayer == nullptr) + { + out << "ҲϢ" << endl; + } + else { + out << "dz:" << pplayer->getName() + << "\t:" << pplayer->getIntegral() + << (pplayer->isReady ? "\t׼" : "\tδ׼") + << endl; + } + } + return out.str(); +} + +std::string roomListToString(bool isHideFull) +{ + std::ostringstream out; + auto & vec = server().getRoomList(); + if (vec.empty()) + { + out << "[]"; + } + else { + bool flag = false; + for (auto &i : vec) + { + if (isHideFull && i.full()) + { + continue; + } + if (flag == false) + { + out << "ID\t\t״̬" << endl; + flag = true; + } + out << i.getID() << '\t' << i.getSize() << '/' << roomPlayerLimit << '\t'; + if (i.getStatus() == roomStatus_t::Waiting) + out << "ȴ"; + else if (i.getStatus() == roomStatus_t::playing) + out << "Ϸ"; + out << endl; + } + if (flag == false) + out << "[]"; + } + return out.str(); +} + +inline playerID_t QQToPID(uint64_t fromQQ) +{ + return playerID_t(fromQQ); +} +inline uint64_t PIDToQQ(playerID_t pid) +{ + return uint64_t(pid); +} + +// 㲥ϢָIDķ䣨Ϣ͸ָ֮ˣ +void broadcast(playerID_t pid, const string& msg) +{ + //logFile << "Թ㲥÷ָIDңָID" << pid << std::endl; + Player * pplayer = server().getPlayer(pid); + if (pplayer == nullptr) + { + logFile << "û" << std::endl; + return; + } + + Room *proom = server().getRoom(pplayer->getCurrRoom()); + if (proom == nullptr) + { + logFile << "û" << std::endl; + return; + } + for (const auto i : proom->getPlayerIDList()) + { + if (pid != i) + { + // logFile << "ڷ͸pid:" << i; + CQ_sendPrivateMsg(ac, PIDToQQ(i), msg.c_str()); + // logFile << " --- " << std::endl; + } + } +} +// 㲥ϢָIDķ䣨Ϣ͸÷ˣ +void broadcast(roomID_t rid, const string& msg) +{ + //logFile << "Թ㲥÷ңID" << rid << std::endl; + + Room *proom = server().getRoom(rid); + if (proom == nullptr) + { + logFile << "û" << std::endl; + return; + } + for (const auto i : proom->getPlayerIDList()) + { + // logFile << "ڷ͸pid:" << i; + CQ_sendPrivateMsg(ac, PIDToQQ(i), msg.c_str()); + // logFile << " --- " << std::endl; + } +} + +void instruction(uint64_t fromQQ, string msg) +{ + ostringstream out; + playerID_t pid = QQToPID(fromQQ); + Player *pplayer = server().getPlayer(pid); + + + if (msg == "׼") + { + if (server().playerReady(pid)) + { + if (pplayer->isReady) + { + out << "׼"; + roomID_t rid = pplayer->getCurrRoom(); + broadcast(pid, "׼"); + + // ʼϷ˾ͷƸңֱӷ + if (server().startGame(rid)) + { + broadcast(rid, "ϷѾʼ"); + broadcast(rid, roomCardsToString(rid)); + Room *proom = server().getRoom(rid); + // ҿ + for (auto pid : proom->getPlayerIDList()) + CQ_sendPrivateMsg(ac, PIDToQQ(pid), CardsToString(proom->getPlayerCards(pid)).c_str()); + NotifyNextPlayer(rid, "Ƿе [е] []", "ȴ[" + server().getPlayer(proom->getThisTurn())->getName() + "]е"); + return; + } + } + else { + out << "ȡ"; + broadcast(pid, "ȡ׼"); + } + broadcast(pplayer->getCurrRoom(), string("ǰϢ\n") + roomInfoToString(pplayer->getCurrRoom())); + } + else { + out << "ʧ"; + } + } + else if (msg == "") + { + roomID_t rid = server().createRoom(pid); + if (rid != 0) + out << "ɹ"; + else + out << "ʧ"; + } + else if (msg.substr(0, 4) == "") { + std::istringstream tempin(msg.substr(4)); + roomID_t rid = 0; + tempin >> rid; + if (tempin.bad()) + { + out << "Ƿ +ID" << endl; + out << " 1"; + } + else if (server().joinRoom(pid, rid)) + { + out << "뷿ɹ"; + broadcast(pid, "Ҽ룡"); + broadcast(rid, string("ǰϢ\n") + roomInfoToString(rid)); + } + else { + out << "뷿ʧ"; + } + } + else if (msg == "˳") + { + roomID_t rid = pplayer->getCurrRoom(); + if (server().leaveRoom(pid)) + { + out << "˳ɹ"; + if (server().getRoom(rid)) + { + broadcast(rid, string("˳\nǰϢ\n") + roomInfoToString(rid)); + } + } + else { + out << "˳ʧ"; + } + } + else if (msg == "鿴") + { + roomID_t rid = pplayer->getCurrRoom(); + if (rid == 0) + out << "㵱ǰڴ޷鿴ǰ"; + else + out << roomInfoToString(rid); + } + else if (msg.substr(0, 8) == "б") + { + if (msg[8] == '1') + { + out << roomListToString(true); + } + else { + out << roomListToString(false); + out << "\n *б1 ˷"; + } + } + else if (msg == "б") + { + out << playerListToString(); + } + else if (pplayer->getCurrRoom() != 0) + { + msg = "[" + pplayer->getName() + "]˵" + msg; + broadcast(pplayer->getCurrRoom(), msg.c_str()); + } + CQ_sendPrivateMsg(ac, fromQQ, out.str().c_str()); +} + +std::string roomCardsToString(roomID_t rid) +{ + ostringstream out; + Room *proom = server().getRoom(rid); + if (proom == nullptr) + out << "δ뷿"; + else if (proom->getStatus() != roomStatus_t::playing) + out << "ǰδʼϷ"; + else + { + for (auto pid : proom->getPlayerIDList()) + { + Player *pplayer = server().getPlayer(pid); + if (proom->getLandID() != 0) + { + if (proom->getLandID() == pid) + out << ""; + else + out << "ũ"; + } + out << '[' << pplayer->getName() << "]\tʣ" << proom->getPlayerCardsSize(pid) << endl; + } + } + return out.str(); +} + +std::string CardToString(card_t card) +{ + std::string str; + switch (card) + { + case _3:str = " 3";break; + case _4:str = " 4";break; + case _5:str = " 5";break; + case _6:str = " 6";break; + case _7:str = " 7";break; + case _8:str = " 8";break; + case _9:str = " 9";break; + case _10:str = "10";break; + case _J:str = " J";break; + case _Q:str = " Q";break; + case _K:str = " K";break; + case _A:str = " A";break; + case _2:str = " 2";break; + case _S:str = "С";break; + case _B:str = ""; break; + } + str = "[" + str + "]"; + return str; +} + +std::string CardsToString(const vector &cards) +{ + ostringstream out; + for (auto i : cards) + { + out << CardToString(i); + } + return out.str(); +} + +std::string CardTtypeToString(CardType ct) +{ + std::string str; + switch (ct) + { + case c1: str = ""; break; + case c2: str = ""; break; + case c3: str = ""; break; + case c4: str = "ը"; break; + case c11: str = "ը"; break; + case c31: str = "һ"; break; + case c32: str = ""; break; + case c411: str = "Ĵ"; break; + case c422: str = "Ĵ"; break; + case c123: str = "˳"; break; + case c1122: str = ""; break; + case c111222: str = "ɻ"; break; + case c11122234: str = "ɻ"; break; + case c1112223344: str = "ɻ"; break; + case c0: str = "ܳ"; break; + } + return str; +} + +vector< card_t > StringToCards(const string src) { + vector< card_t > cards; + card_t temp; + for (size_t i = 0; i < src.size(); ++i) { + if (src[i] == '1' && src[i + 1] == '0') { + i++; + temp = _10; + } + else if (src.substr(i, i + 4) == "") { + i += 3; + temp = _B; + } + else if (src.substr(i, i + 2) == ""){ + i += 1; + temp = _B; + } + else if (src.substr(i, i + 4) == "С") { + i += 3; + temp = _S; + } + else if (src.substr(i, i + 2) == "С") { + i += 1; + temp = _S; + } + else if (src.substr(i, i + 4) == "ը") { + cards.push_back(_B); + cards.push_back(_S); + break; + } + else { + switch (src[i]) { + case 'a': + case 'A': + temp = _A; + break; + case '2': + temp = _2; + break; + case '3': + temp = _3; + break; + case '4': + temp = _4; + break; + case '5': + temp = _5; + break; + case '6': + temp = _6; + break; + case '7': + temp = _7; + break; + case '8': + temp = _8; + break; + case '9': + temp = _9; + break; + case 'j': + case 'J': + temp = _J; + break; + case 'q': + case 'Q': + temp = _Q; + break; + case 'k': + case 'K': + temp = _K; + break; + default: + continue; + } + } + cards.push_back(temp); + } + return cards; +} + +void becomeLandlord(Room * proom) +{ + ostringstream out; + Player * pLand = server().getPlayer(proom->getLandID()); + broadcast(pLand->getID(), "[" + pLand->getName() + "]Ϊ˵"); + out << "Ϊ˵ƣ\n"; + out << CardsToString(proom->getPlayerCards(pLand->getID())); + string temp; + for (auto i : proom->getLandCards()) + temp += CardToString(i); + broadcast(proom->getID(), "ƣ" + temp); + CQ_sendPrivateMsg(ac, PIDToQQ(pLand->getID()), out.str().c_str()); + NotifyNextPlayer(proom->getID(), "ֵ", "ȴ"); +} + +// ֪ͨ +// msg Ƿ͸ֵҵϢ +// otherMsg Ƿ͸ҵϢ +void NotifyNextPlayer(roomID_t rid, std::string msg, std::string otherMsg) +{ + Room * proom = server().getRoom(rid); + for (auto pid : proom->getPlayerIDList()) + { + if (proom->getThisTurn() == pid) + { + CQ_sendPrivateMsg(ac, PIDToQQ(pid), msg.c_str()); + CQ_sendPrivateMsg(ac, PIDToQQ(pid), CardsToString(proom->getPlayerCards(pid)).c_str()); + } + else + { + CQ_sendPrivateMsg(ac, PIDToQQ(pid), otherMsg.c_str()); + } + } +} + + +// Ϸָ +void gameCommand(uint64_t fromQQ, string msg) +{ + ostringstream out; + playerID_t pid = QQToPID(fromQQ); + Player *pplayer = server().getPlayer(pid); + roomID_t rid = pplayer->getCurrRoom(); + Room * proom = server().getRoom(rid); +do {/******************** do while ************************/ + if (pplayer == nullptr || + proom == nullptr || + proom->getStatus() != roomStatus_t::playing) + { + out << "ǰ״̬޷ʹϷָϷ״̬²ſʹ"; + break; + } + if (msg == "") + { + out << roomCardsToString(rid); + out << CardsToString(proom->getPlayerCards(pid)); + break; + } + if (msg == "" || msg == "" || msg == "е") + { + if (proom->getLandID() != 0) + { + out << "ѾĽ׶Σ"; + break; + } + if (proom->getThisTurn() != pid) + { + out << "ûֵŶ"; + break; + } + if (proom->isColledLand()) + { + out << "Ľ׶Σ"; + break; + } + if (msg == "" || msg == "е") + { + proom->coll(true); + broadcast(pid, "["+pplayer->getName()+"]е"); + + if (proom->getLandID() == pid) + { + becomeLandlord(proom); + } + else + { + NotifyNextPlayer(rid, "Ƿ [] []", "ȴ[" + server().getPlayer(proom->getThisTurn())->getName() + "]"); + } + } + else + { + if (!proom->coll(false)) // ؼٱʾû˽еԶؿϷ + { + broadcast(rid, "˶ûеؿ"); + // ҿ + for (auto pid : proom->getPlayerIDList()) + CQ_sendPrivateMsg(ac, PIDToQQ(pid), CardsToString(proom->getPlayerCards(pid)).c_str()); + } + else + { + out << "㲻е"; + broadcast(pid, "[" + pplayer->getName() + "]е"); + } + NotifyNextPlayer(rid, "Ƿе [е] []", "ȴ[" + server().getPlayer(proom->getThisTurn())->getName() + "]е"); + } + } + else if (msg == "" || msg == "" + || msg == "" || msg == "") + { + if (proom->getLandID() != 0) + { + out << "ѾĽ׶Σ"; + break; + } + if (proom->getThisTurn() != pid) + { + out << "ûֵŶ"; + break; + } + if (!proom->isColledLand()) + { + out << "ǽеĽ׶Σ"; + break; + } + if (msg == "" || msg == "" || msg == "") + { + broadcast(pid, "[" + pplayer->getName() + "]"); + if (proom->grab(true)) + { + becomeLandlord(proom); + } + else { + NotifyNextPlayer(rid, "Ƿ [] []", "ȴ[" + server().getPlayer(proom->getThisTurn())->getName() + "]"); + } + } + else + { + broadcast(pid, "[" + pplayer->getName() + "]"); + if (proom->grab(false)) + { + becomeLandlord(proom); + } + else { + NotifyNextPlayer(rid, "Ƿ [] []", "ȴ[" + server().getPlayer(proom->getThisTurn())->getName() + "]"); + } + } + } + else if (msg.substr(0, 2) == "") + { + if (proom->getLandID() == 0) + { + out << "ڻĽ׶Σ"; + break; + } + if (proom->getThisTurn() != pid) + { + out << "ûֵŶ"; + break; + } + vector vec = StringToCards(msg.substr(2)); + PlayingCards pc(vec); + logFile << CardsToString(vec) << std::endl; + if (pc.getType() == c0) + { + out << "ƲϹ"; + } + if (proom->popCards(pc)) + { + ostringstream outTemp; + outTemp << "["; + outTemp << pplayer->getName(); + outTemp << "]["; + outTemp << CardTtypeToString(pc.getType()); + outTemp << "]\n"; + outTemp << CardsToString(vec); + broadcast(rid, outTemp.str()); + outTemp.str(""); + if (proom->isEndGame()) + { + outTemp << "Ϸ" << std::endl;; + if (pplayer->getID() == proom->getLandID()) + outTemp << "ʤ" << std::endl; + else + outTemp << "ũʤ" << std::endl; + for (auto pid : proom->getPlayerIDList()) + { + int score = proom->settle(pid); + Player *pPlayerTemp = server().getPlayer(pid); + pPlayerTemp->score(score); + outTemp << "[" << pPlayerTemp->getName() << "] ÷:" << score << std::endl; + } + outTemp << " 鿴 鿴ǰ\n 鿴 鿴ǰϢ"; + broadcast(rid, outTemp.str()); + return; + } + + if (proom->isPopCards()) + NotifyNextPlayer(rid, " [ xxx]", "ȴ[" + server().getPlayer(proom->getThisTurn())->getName() + "]"); + else + NotifyNextPlayer(rid, " [ xxx] []", "ȴ[" + server().getPlayer(proom->getThisTurn())->getName() + "]"); + } + else + { + out << "ûϼҴϼҳƣ\n"; + out << CardsToString(proom->getLastRoundCards()); + } + } + else if (msg == "" || msg == "Ҫ" || msg == "Ҫ") + { + if (proom->getLandID() == 0) + { + out << "ڻĽ׶Σ"; + break; + } + if (proom->getThisTurn() != pid) + { + out << "ûֵŶ"; + break; + } + if (proom->pass()) + { + broadcast(rid, "[" + pplayer->getName() + "]"); + if (proom->isPopCards()) + NotifyNextPlayer(rid, " [ xxx]", "ȴ[" + server().getPlayer(proom->getThisTurn())->getName() + "]"); + else + NotifyNextPlayer(rid, " [ xxx] []", "ȴ[" + server().getPlayer(proom->getThisTurn())->getName() + "]"); + } + else + { + out << "dzƽ׶Σ޷passƣ"; + } + } + + else if (msg == "ǿؿ") + { + logFile << "ǿؿϷ"; + broadcast(rid, "ǿؿϷ 鿴"); + proom->start(); + } + else + { + msg = "[" + pplayer->getName() + "]˵" + msg; + broadcast(rid, msg.c_str()); + break; + } +}while(0);/************** do while ****************/ + CQ_sendPrivateMsg(ac, fromQQ, out.str().c_str()); +} + +void Receive(uint64_t fromQQ, string msg) +{ + ostringstream out; + playerID_t pid = QQToPID(fromQQ); + Player *pplayer = server().getPlayer(pid); + if (msg.substr(0, 4) == "ע" && pplayer == nullptr) + { + string name; + istringstream in(msg.substr(4)); + in >> name; + Player temp(pid); + temp.setName(name.substr(0, 12)); + if (server().loginPlayer(temp)) + { + out << "עɹdzƣ" << name << std::endl; + out << " ˵ õָб"; + } + else { + out << "עʧܣ"; + } + CQ_sendPrivateMsg(ac, fromQQ, out.str().c_str()); + return; + } + if (pplayer == nullptr) + { + out << "ǰQQδעᣬظ ע dz עᣡ" << std::endl; + out << "ӣע " << std::endl; + out << "ע⣬dz6ֻ12ĸ,ע,впո"; + CQ_sendPrivateMsg(ac, fromQQ, out.str().c_str()); + return; + } + Room *proom = server().getRoom(pplayer->getCurrRoom()); + if (msg == "˵") + { + out << + "+--------ָб--------+\n" + "| ˵ -- ָб |\n" + "| ע -- ע dz |\n" + "| -- dz |\n" + "| 鿴 -- 鿴ǰϢ |\n" + "| -- β |\n" + "| [Ϣ] -- ڷ |\n" + "|---- ָ ----|\n" + "|׼ -- ׼ȡ|\n" + "| -- һ|\n" + "|[id] -- ָ|\n" + "|˳ -- ˳ǰ|\n" + "|鿴 -- 鿴ǰ|\n" + "|б -- 鿴з|\n" + "|б -- 鿴|\n" + "|*עָϷн*|\n" + "|---- Ϸָ ----|\n" + "| -- 鿴ǰƾ|\n" + "|е/ /|\n" + "|/ xxxx |\n" + "|*עϷָн*|\n" + "+--------ָб--------+"; + } + else if (msg == "鿴") + { + out << playerInfoToString(pid); + } + else if (msg.substr(0, 4) == "") + { + string name; + istringstream in(msg.substr(4)); + in >> name; + pplayer->setName(name.substr(0, 12)); + out << "޸ɣǰdz:" << name; + } + else if (msg == "") + { + out << "ļжݵĹܣڴ"; + } + else if (proom == nullptr || proom->getStatus() != roomStatus_t::playing) + instruction(fromQQ, msg); + else if (proom->getStatus() == roomStatus_t::playing) + gameCommand(fromQQ, msg); + else + out << " ˵ õָб"; + CQ_sendPrivateMsg(ac, fromQQ, out.str().c_str()); +} \ No newline at end of file diff --git a/Landlords/Process.h b/Landlords/Process.h new file mode 100644 index 0000000..b82d14b --- /dev/null +++ b/Landlords/Process.h @@ -0,0 +1,42 @@ +#pragma once +#include "cqp.h" +#include "Server.h" +#include "Room.h" +#include "Player.h" +#include +#include +#include +std::string playerInfoToString(Player* pplayer); +std::string playerInfoToString(playerID_t pid); +std::string playerListToString(); +std::string roomInfoToString(roomID_t rid); + +std::string roomListToString(bool isHideFull); + +inline playerID_t QQToPID(uint64_t fromQQ); + +inline uint64_t PIDToQQ(playerID_t pid); + +// 㲥ϢָIDķ䣨Ϣ͸ָ֮ˣ +void broadcast(playerID_t pid, const std::string& msg); + +// 㲥ϢָIDķ䣨Ϣ͸÷ˣ +void broadcast(roomID_t rid, const std::string& msg); + + +void instruction(uint64_t fromQQ, std::string msg); + +std::string roomCardsToString(roomID_t rid); + +std::string CardToString(card_t card); + +std::string CardsToString(const std::vector &cards); +void becomeLandlord(Room * proom); + +// ֪ͨ +// msg Ƿ͸ֵҵϢ +// otherMsg Ƿ͸ҵϢ +void NotifyNextPlayer(roomID_t rid, std::string msg, std::string otherMsg); +void gameCommand(uint64_t fromQQ, std::string msg); + +void Receive(uint64_t fromQQ, std::string msg); \ No newline at end of file diff --git a/Landlords/Room.cpp b/Landlords/Room.cpp new file mode 100644 index 0000000..f917cf5 --- /dev/null +++ b/Landlords/Room.cpp @@ -0,0 +1,352 @@ +#include "stdafx.h" +#include "Room.h" + + +Room::Room(roomID_t rid, playerID_t pid) : + m_id(rid), m_roomStatus(roomStatus_t::Waiting), m_PIDList(), + m_turn(0), m_landlord(0), m_X(100), m_lastRoundCards(std::vector()) +{ + logFile << "Room::Room(" << rid << ", " << pid << ")\n"; + playerJoin(pid); + int n = 0; + for (int i = 0; i < 52; ++i) + { + if (i % 4 == 0) + ++n; + m_cards[i] = card_t(n); + } + m_cards[52] = card_t::_S; + m_cards[53] = card_t::_B; +} + +Room::~Room() +{ +} + +bool Room::playerJoin(playerID_t pid) +{ + //logFile << "ID:<" << pid << ">ͼ뷿:" << m_id << std::endl; + if (m_PIDList.size() == 3) + { + logFile << m_id << "" << std::endl; + return false; + } + m_PIDList.push_back(pid); + logFile << "ID:<" << pid << ">Ѿ뷿:" << m_id << std::endl; + return true; +} + +bool Room::playerLeave(playerID_t pid) +{ + //logFile << "ID:<" << pid << ">ͼ뿪:" << m_id << std::endl; + if (m_PIDList.empty()) + { + logFile << "Ϊ" << std::endl; + return false; + } + auto it = std::find(m_PIDList.begin(), m_PIDList.end(), pid); + if (it == m_PIDList.end()) + { + logFile << "ڸ÷ҲID" << std::endl; + return false; + } + m_PIDList.erase(it); + logFile << "ID:<" << pid << ">Ѿ뿪:" << m_id << std::endl; + return true; +} + +void Room::start() +{ + m_roomStatus = roomStatus_t::playing; + logFile << "ID<" << m_id << ">ѾʼϷ" << std::endl; + m_landlord = -1; // ʼΪ + m_lastPop = -1; + m_first = -1; + m_turn = landU(e); // һ˿ʼ + logFile << "" << m_turn << std::endl; + m_multiple = 1; + for (int i = 0; i < roomPlayerLimit; ++i) + m_Grad[i] = true; + Refresh(); // ϴ + distribution(); // +} + +std::array Room::getLandCards() +{ + // ǵ + return std::array{m_cards[51], m_cards[52], m_cards[53]}; +} + +const std::vector& Room::getPlayerCards(playerID_t pid) +{ + //logFile << "ID<" << pid << ">ԵõԼ" << std::endl; + return m_playerCards[findPlayer(pid)]; +} + +size_t Room::getPlayerCardsSize(playerID_t pid) +{ + //logFile << "ID<" << pid << ">ԵõƵ" << std::endl; + return m_playerCards[findPlayer(pid)].size(); +} + +int Room::settle(playerID_t pid) +{ + int score = m_X * m_multiple; + // + if (pid == getLandID()) // ǵ + { + score *= 2; // ַ + if (m_turn != m_landlord) // ƵIJǵ + score = -score; // ۷ + } + else { // ǵ + if (m_turn == m_landlord) //Ƶǵ + score = -score; // ۷ + } + return score; +} + +int Room::findPlayer(playerID_t pid) +{ + //logFile << "ID<" << pid << ">Բڵǰ±" << std::endl; + int i = 0; + for (; i < 3; ++i) + if (m_PIDList[i] == pid) + break; + if (i == 3) + { + logFile << "Ҳ" << std::endl; + throw "Ҳڵǰ"; + } + else + return i; +} + +void Room::setLandlords(int n) +{ + m_lastPop = m_turn = m_landlord = n; + logFile << n << "Ϊ" << std::endl; + // + m_playerCards[m_landlord].insert(m_playerCards[m_landlord].end(), + m_cards.end() - 3, m_cards.end()); + // + std::sort(m_playerCards[m_landlord].begin(), m_playerCards[m_landlord].end()); +} + +bool Room::isSubset(const std::vector& sub) +{ + auto & vec = m_playerCards[m_turn]; + if (sub.size() > vec.size()) + return false; + int arr[16] = { 0 }; + for (auto i : sub) + arr[i]++; + for (auto i : vec) + arr[i]--; + for (auto i : arr) + if (i > 0) + return false; + return true; +} + +bool Room::removeSubset(const std::vector& sub) +{ + auto & vec = m_playerCards[m_turn]; + if (sub.size() > vec.size()) + return false; + int arr[16] = { 0 }; + for (auto i : sub) + arr[i]++; + for (auto it = vec.begin(); it != vec.end(); ) + if (arr[*it]-- > 0) + it = vec.erase(it); + else + ++it; + return true; +} + +bool Room::coll(bool isColl) +{ + if (m_first != -1) + return true; + if (isColl) + { + logFile << m_turn << " е" << std::endl; + m_lastPop = m_first = m_turn; + for (turnNext(); !m_Grad[m_turn]; turnNext()) + logFile << m_turn << "ûʸһ" << std::endl; + logFile << m_turn << "ʸ" << std::endl; + if (m_first == m_turn) + { + setLandlords(m_turn); + logFile << "һУõ" << std::endl; + return true; + } + return true; + } + m_Grad[m_turn] = false; + logFile << m_turn << "еʧȥʸ" << std::endl; + turnNext(); + if (!m_Grad[m_turn]) // ûʸе˵û˽е + { + logFile << "û˽еؿ" << std::endl; + start(); + return false; + } + return true; +} + +bool Room::grab(bool isGrab) +{ + if (m_landlord != -1) + return false; + if (isGrab) + { + logFile << m_turn << "" << std::endl; + m_lastPop = m_turn; + doubleMultiple(); + for (turnNext(); !m_Grad[m_turn]; turnNext()) + logFile << m_turn << "ûʸһ" << std::endl; + logFile << m_turn << "ʸ" << std::endl; + if (m_lastPop == m_turn) // תһȦˣ˵һʸ + { + logFile << m_turn << "Ϊ" << std::endl; + setLandlords(m_lastPop); + return true; + } + m_Grad[m_lastPop] = false; + } + else + { + int temp = m_turn; + logFile << m_turn << "" << std::endl; + for (turnNext(); !m_Grad[m_turn]; turnNext()) + logFile << m_turn << "ûʸһ" << std::endl; + logFile << m_turn << "ʸ" << std::endl; + + if (temp == m_turn) // ˶ûʸ˵( ...) + { + setLandlords(m_lastPop); + return true; + } + + // һʸľǽеģͬʱҲһҪģֱӳΪ + if (m_turn == m_first && m_first == m_lastPop) + { + logFile << m_turn << "Ϊ" << std::endl; + setLandlords(m_first); + return true; + } + m_Grad[temp] = false; + } + return false; +} + +bool Room::popCards(const PlayingCards & cards) +{ + logFile << " " << cards.getType() << std::endl; + if (cards.getType() == c0) + return false; + if (!isSubset(cards.getVec())) + { + logFile << "û" << std::endl; + return false; + } + // ը ӶԹ + if (cards.getType() == c11) + { + logFile << "ը" << std::endl; + doubleMultiple(); + } + // ƽ׶ ֻҪ ͵ е Գ + else if (isPopCards()) + { + if (cards.getType() == c4) // ըը + { + logFile << "ը" << std::endl; + doubleMultiple(); + } + // ĶԳ + } + // ƽ׶ + else if (cards.getType() == c4) // ը + { + if (!(m_lastRoundCards < cards))// ûϼҴ + return false; + } + // ųըըͲֱͬӷؼ + else if (cards.getType() != m_lastRoundCards.getType()) + { + return false; + } + // ųͲͬͬһؼ + else if (cards.getSize() != m_lastRoundCards.getSize()) + { + return false; + } + // ͬͬ󲻹ϼңһؼ + else if (!(m_lastRoundCards < cards)) + { + return false; + } + // ƿ϶ǵóȥ + m_lastPop = m_turn; + m_lastRoundCards = cards; + removeSubset(cards.getVec()); + logFile << "Ƴɹ" << std::endl; + + if (m_playerCards[m_turn].empty()) + { + endGame(); + return true; + } + + if (cards.getType() != c11) // ըҲֵ¼ + turnNext(); + return true; +} + +bool Room::pass() +{ + logFile << "" << std::endl; + // Ϊƽ׶ ޷ + if (m_turn == m_lastPop) // һƵľ + return false; + else + { + turnNext(); + return true; + } +} + +void Room::Refresh() +{ + for (int i = 0; i < 54; ++i) + std::swap(m_cards[i], m_cards[cardsU(e)]); +} + +void Room::distribution() +{ + for (size_t i = 0; i < m_playerCards.size(); ++i) + { + m_playerCards[i].clear(); + m_playerCards[i].insert(m_playerCards[i].begin(), + m_cards.begin() + (i * 17), m_cards.begin() + ((i + 1) * 17)); + std::sort(m_playerCards[i].begin(), m_playerCards[i].end()); + logFile << i << "ҵõˣ"; + for (auto n : m_playerCards[i]) + logFile << n << ' '; + logFile << std::endl; + } +} + +void Room::endGame() +{ + m_roomStatus = roomStatus_t::Waiting; + + for (auto pid : m_PIDList) + { + server().playerReady(pid); + } + +} diff --git a/Landlords/Room.h b/Landlords/Room.h new file mode 100644 index 0000000..ebcef6b --- /dev/null +++ b/Landlords/Room.h @@ -0,0 +1,115 @@ +#pragma once + +#include "define.h" +#include "Server.h" +#include "PlayingCards.h" +#include +#include + +enum roomStatus_t :char { + Waiting, + playing +}; + +const int roomPlayerLimit = 3; + +class Room +{ +public: + Room() = delete; + Room(roomID_t rid, playerID_t pid); + ~Room(); + + roomID_t getID() const { return m_id; }; + roomStatus_t getStatus() const { return m_roomStatus; } + const std::vector& getPlayerIDList() const { return m_PIDList; } + size_t getSize() const { return m_PIDList.size(); } + // void setStatus(roomStatus_t status) { roomStatus = status; } + bool full() const { return m_PIDList.size() >= roomPlayerLimit; } +public: + bool playerJoin(playerID_t pid); + bool playerLeave(playerID_t pid); + +public: + // ʼ playing״̬ + void start(); +/********** ²ֻڽplaying״̬ſʹ ************/ + + // õ + std::array getLandCards(); + + // ID ûе0 + playerID_t getLandID() { return m_landlord==-1?0:m_PIDList[m_landlord]; } + + // õĿҵ + const std::vector &getPlayerCards(playerID_t pid); + + // õĿҵʣ + size_t getPlayerCardsSize(playerID_t pid); + + // õǰֵҵID + playerID_t getThisTurn() { logFile << "ֵ" << m_turn << std::endl; return m_PIDList.at(m_turn); } + + // еúʾѾؼٱʾؿ + bool coll(bool isColl); + // е + bool isColledLand() { return m_first != -1; } + // ˳Ϊ棬򷵻ؼ + bool grab(bool isGrab); + + // ƣdzƣƳɹ + // ʱͲϷߴ󲻹ϼ ؼ + // ըȻǸҳ + // ƲԲ + bool popCards(const PlayingCards & cards); + + // ע⣺ƽ׶޷passôؼ + bool pass(); + + // õһ + const std::vector & getLastRoundCards() { return m_lastRoundCards.getVec(); } + + // Ƿƽ׶Σƽ׶Σ + bool isPopCards() { return m_turn == m_lastPop; } + + // ǷϷѾ + bool isEndGame() { return m_roomStatus == roomStatus_t::Waiting; } + // ص÷ + int settle(playerID_t pid); + + +public: + bool operator==(roomID_t rid) { return m_id == rid; } +private: + int findPlayer(playerID_t pid); + void doubleMultiple() { m_multiple *= 2; } + void turnNext() { ++m_turn %= m_PIDList.size(); } + void setLandlords(int n); + bool isSubset(const std::vector &sub); + bool removeSubset(const std::vector &sub); + + void Refresh(); + void distribution(); + + + // Ϸȴ״̬ + void endGame(); + +private: + roomID_t m_id; + roomStatus_t m_roomStatus; + std::vector m_PIDList; + std::array m_cards; + std::array, roomPlayerLimit> m_playerCards; + PlayingCards m_lastRoundCards; // һ +/*********************************************************/ + int m_first; // һе + bool m_Grad[roomPlayerLimit]; // ʸ +/*********************************************************/ + int m_lastPop; // һ/ + int m_turn; // ǰֵ + int m_landlord; // + int m_X; // ϵ ÷ֹʽ X * m (*2) + uint32_t m_multiple; // +}; + diff --git a/Landlords/Server.cpp b/Landlords/Server.cpp new file mode 100644 index 0000000..ee262ac --- /dev/null +++ b/Landlords/Server.cpp @@ -0,0 +1,284 @@ +#include "stdafx.h" +#include "Server.h" +#include + +std::default_random_engine e; +std::uniform_int_distribution landU(0, 2); // ѡ + +std::uniform_int_distribution cardsU(0, 53); // ϴ + + +Server::Server() +{ + logFile << "Server::Server()" << std::endl; + std::ifstream fin("data.dat"); + if (!fin.is_open()) + { + logFile << "data.dat ļʧ" << std::endl; + return; + } + std::string str; + playerID_t pid; + std::string name; + int integral = 0; + while (fin.good() && std::getline(fin, str)) + { + std::istringstream sin(str); + sin >> pid >> name >> integral; + m_playerList.emplace_back(pid); + m_playerList.back().setName(name); + m_playerList.back().setIntegral(integral); + } + fin.close(); + + std::random_device rd; + e.seed(rd()); + srand((unsigned int)time(NULL)); +} + + +Server::~Server() +{ + if (m_playerList.empty()) + return; + std::ofstream fout("data.dat"); + if (!fout.is_open()) + { + logFile << "data.dat ļʧ" << std::endl; + return; + } + for (auto i : m_playerList) + { + fout << i.getID() << '\t' << i.getName() << '\t' << i.getIntegral() << std::endl; + } + fout.close(); +} + +Room * Server::getRoom(roomID_t rid) +{ + if (m_roomList.empty()) + return nullptr; + /* + auto it = m_roomList.begin(); + for (; it != m_roomList.end(); ++it) + if (it->getID() == rid) + break; + if (it == m_roomList.end()) + return nullptr; + else + return &(*it); + */ + // ڸ÷ãҷбȷԲö㷨Ч + int left = 0; + int right = m_roomList.size() - 1; + while (left <= right) + { + int mid = left + ((right - left) >> 1); + if (m_roomList[mid].getID() == rid) + return &m_roomList[mid]; + else if (m_roomList[mid].getID() > rid) + right = mid - 1; + else + left = mid + 1; + } + return nullptr; +} + +Player * Server::getPlayer(playerID_t pid) +{ + if (m_playerList.empty()) + return nullptr; + /* + auto it = m_playerList.begin(); + for (; it != m_playerList.end(); ++it) + if (it->getID() == pid) + break; + if (it == m_playerList.end()) + return nullptr; + else + return &(*it); + */ + // ڸ÷ãҷбȷԲö㷨Ч + int left = 0; + int right = m_playerList.size() - 1; + while (left <= right) + { + int mid = left + ((right - left) >> 1); + if (m_playerList[mid].getID() == pid) + return &m_playerList[mid]; + else if (m_playerList[mid].getID() > pid) + right = mid - 1; + else + left = mid + 1; + } + return nullptr; +} + +roomID_t Server::createRoom(playerID_t pid) +{ + logFile << "id:" << pid << " ͼ" << std::endl; + Player *pplayer = getPlayer(pid); + if (pplayer->getCurrRoom() != 0) + { + logFile << "ʧܣΪڷ" << std::endl; + return 0; + } + roomID_t rid = 0; + if (m_roomList.empty()) + rid = 1; + else + rid = m_roomList.back().getID() + 1; + m_roomList.push_back(Room(rid, pid)); + pplayer->setCurrRoom(rid); + logFile << "id:" << pid << " ɹid:" << rid << std::endl; + return rid; +} + +playerID_t Server::loginPlayer(Player player) +{ + logFile << "id:" << player.getID() << "ע" << std::endl; + Player * pplayer = getPlayer(player.getID()); + if (pplayer != nullptr) + { + logFile << "иϢ޷ظע" << std::endl; + return 0; + } + m_playerList.push_back(player); + std::sort(m_playerList.begin(), m_playerList.end()); + return player.getID(); +} + +bool Server::joinRoom(playerID_t pid, roomID_t rid) +{ + logFile << "id:" << pid << " Լ뷿䣬id:" << rid << std::endl; + if (rid == 0) + { + logFile << "IDǷ" << std::endl; + return false; + } + Player *pplayer = getPlayer(pid); + if (pplayer == nullptr) + { + logFile << "û" << std::endl; + return false; + } + if (pplayer->getCurrRoom() == rid) + { + logFile << "ҵǰĿ귿" << std::endl; + return false; + } + Room * proom = getRoom(rid); + if (proom == nullptr) + { + logFile << "Ҳ÷" << std::endl; + return false; + } + else { + // ڷ䣬˳ǰ + if (pplayer->getCurrRoom() != 0) + leaveRoom(pid); + if (proom->playerJoin(pid)) + { + pplayer->setCurrRoom(rid); + pplayer->isReady = false; + logFile << "id:" << pid << "ɹ뷿:" << rid << std::endl; + return true; + } + else { + return false; + } + } +} + +bool Server::leaveRoom(playerID_t pid) +{ + logFile << "id:" << pid << " ˳ǰ" << std::endl; + Player * pplayer = getPlayer(pid); + if (pplayer == nullptr) + { + logFile << "û" << std::endl; + return false; + } + roomID_t rid = pplayer->getCurrRoom(); + if (rid == 0) + { + logFile << "ûмκη䣬޷˳" << std::endl; + return false; + } + auto it = std::find(m_roomList.begin(), m_roomList.end(), rid); + if (it->playerLeave(pid)) + { + pplayer->setCurrRoom(0); + pplayer->isReady = false; + logFile << "id:" << pid << " Ѿ˳ǰ䣬ID:" << rid << std::endl; + if (it->getPlayerIDList().empty()) + { + logFile << "ǰΪգɾ÷ id:" << rid << std::endl; + m_roomList.erase(it); + } + return true; + } + else { + return false; + } +} + +bool Server::playerReady(playerID_t pid) +{ + Player *pplayer = getPlayer(pid); + roomID_t rid = pplayer->getCurrRoom(); + logFile << "id:" << pid << "׼/ȡ׼" << std::endl; + if (pplayer == nullptr || rid == 0) + { + logFile << "޸һ߷Ϊ" << std::endl; + return false; + } + + pplayer->isReady = !pplayer->isReady; + logFile << "óɹpplayer->isReady:" << pplayer->isReady << std::endl; + return true; +} + +bool Server::startGame(roomID_t rid) +{ + Room *proom = getRoom(rid); + if (isRoomAllReady(proom)) + { + proom->start(); + return true; + } + else { + return false; + } +} + +bool Server::isRoomAllReady(Room* proom) +{ + if (proom == nullptr || !proom->full()) + return false; + bool flag = true; + for (auto i : proom->getPlayerIDList()) + { + // δ׼flagΪfalse + if (!getPlayer(i)->isReady) + flag = false; + } + // ʶλδüٱʾ˶Ѿ׼ + if (flag) + { + logFile << "id:" << proom->getID() << " Ѿ׼" << std::endl; + return true; + } + else { + return false; + } +} + + + + +Server & server() +{ + static Server s; + return s; +} diff --git a/Landlords/Server.h b/Landlords/Server.h new file mode 100644 index 0000000..0bda7b2 --- /dev/null +++ b/Landlords/Server.h @@ -0,0 +1,40 @@ +#pragma once +#include +#include +#include +#include +#include +#include "Player.h" +#include "Room.h" +class Room; +class Server +{ +public: + Server(); + ~Server(); + + Room * getRoom(roomID_t rid); + Player * getPlayer(playerID_t pid); + + roomID_t createRoom(playerID_t pid); + playerID_t loginPlayer(Player player); + bool joinRoom(playerID_t pid, roomID_t rid); + bool leaveRoom(playerID_t pid); + + const std::vector & getRoomList() { return m_roomList; } + const std::vector & getPlayerList() { return m_playerList; } + + // δڷ䣬ؼ١Ѿ׼ȡ׼δ׼׼ + bool playerReady(playerID_t pid); + + bool startGame(roomID_t rid); +private: + // Ƿ˶׼ + bool isRoomAllReady(Room* proom); + +private: + std::vector m_playerList; + std::vector m_roomList; +}; + +Server &server(); // \ No newline at end of file diff --git a/Landlords/appmain.cpp b/Landlords/appmain.cpp new file mode 100644 index 0000000..71d28aa --- /dev/null +++ b/Landlords/appmain.cpp @@ -0,0 +1,196 @@ +/* +* CoolQ Demo for VC++ +* Api Version 9 +* Written by Coxxs & Thanks for the help of orzFly +*/ + +#include "stdafx.h" +#include "string" +#include "cqp.h" +#include "appmain.h" //ӦAppIDϢȷдQ޷ + +using namespace std; + +int ac = -1; //AuthCode ÿQķʱҪõ +bool enabled = false; + + +/* +* ӦõApiVerAppid󽫲 +*/ +CQEVENT(const char*, AppInfo, 0)() { + return CQAPPINFO; +} + + +/* +* ӦAuthCodeQȡӦϢܸӦãAuthCode +* Ҫڱκδ룬ⷢ쳣ִгʼStartup¼ִУType=1001 +*/ +CQEVENT(int32_t, Initialize, 4)(int32_t AuthCode) { + ac = AuthCode; + return 0; +} + + +/* +* Type=1001 Q +* ۱ӦǷãڿQִһΣִӦóʼ롣 +* DZҪشڡӲ˵ûֶ򿪴ڣ +*/ +CQEVENT(int32_t, __eventStartup, 0)() { + + return 0; +} + + +/* +* Type=1002 Q˳ +* ۱ӦǷãڿQ˳ǰִһΣִвرմ롣 +* Ϻ󣬿Qܿرգ벻Ҫ̵ͨ߳ȷʽִ롣 +*/ +CQEVENT(int32_t, __eventExit, 0)() { + + return 0; +} + +/* +* Type=1003 Ӧѱ +* Ӧñú󣬽յ¼ +* QʱӦѱã_eventStartup(Type=1001,Q)ú󣬱ҲһΡ +* DZҪشڡӲ˵ûֶ򿪴ڣ +*/ +CQEVENT(int32_t, __eventEnable, 0)() { + enabled = true; + return 0; +} + + +/* +* Type=1004 Ӧýͣ +* Ӧñͣǰյ¼ +* QʱӦѱͣã򱾺**á +* ۱ӦǷãQرǰ**á +*/ +CQEVENT(int32_t, __eventDisable, 0)() { + enabled = false; + return 0; +} + + +/* +* Type=21 ˽Ϣ +* subType ͣ11/Ժ 1/״̬ 2/Ⱥ 3/ +*/ +CQEVENT(int32_t, __eventPrivateMsg, 24)(int32_t subType, int32_t msgId, int64_t fromQQ, const char *msg, int32_t font) { + + //ҪظϢÿQͣ return EVENT_BLOCK - ضϱϢټ ע⣺ӦȼΪ""(10000)ʱʹñֵ + //ظϢ֮Ӧ/ return EVENT_IGNORE - ԱϢ + return EVENT_IGNORE; +} + + +/* +* Type=2 ȺϢ +*/ +CQEVENT(int32_t, __eventGroupMsg, 36)(int32_t subType, int32_t msgId, int64_t fromGroup, int64_t fromQQ, const char *fromAnonymous, const char *msg, int32_t font) { + + return EVENT_IGNORE; //ڷֵ˵, _eventPrivateMsg +} + + +/* +* Type=4 Ϣ +*/ +CQEVENT(int32_t, __eventDiscussMsg, 32)(int32_t subType, int32_t msgId, int64_t fromDiscuss, int64_t fromQQ, const char *msg, int32_t font) { + + return EVENT_IGNORE; //ڷֵ˵, _eventPrivateMsg +} + + +/* +* Type=101 Ⱥ¼-Ա䶯 +* subType ͣ1/ȡԱ 2/ùԱ +*/ +CQEVENT(int32_t, __eventSystem_GroupAdmin, 24)(int32_t subType, int32_t sendTime, int64_t fromGroup, int64_t beingOperateQQ) { + + return EVENT_IGNORE; //ڷֵ˵, _eventPrivateMsg +} + + +/* +* Type=102 Ⱥ¼-ȺԱ +* subType ͣ1/ȺԱ뿪 2/ȺԱ 3/Լ(¼) +* fromQQ QQ(subTypeΪ23ʱ) +* beingOperateQQ QQ +*/ +CQEVENT(int32_t, __eventSystem_GroupMemberDecrease, 32)(int32_t subType, int32_t sendTime, int64_t fromGroup, int64_t fromQQ, int64_t beingOperateQQ) { + + return EVENT_IGNORE; //ڷֵ˵, _eventPrivateMsg +} + + +/* +* Type=103 Ⱥ¼-ȺԱ +* subType ͣ1/Աͬ 2/Ա +* fromQQ QQ(ԱQQ) +* beingOperateQQ QQ(ȺQQ) +*/ +CQEVENT(int32_t, __eventSystem_GroupMemberIncrease, 32)(int32_t subType, int32_t sendTime, int64_t fromGroup, int64_t fromQQ, int64_t beingOperateQQ) { + + return EVENT_IGNORE; //ڷֵ˵, _eventPrivateMsg +} + + +/* +* Type=201 ¼- +*/ +CQEVENT(int32_t, __eventFriend_Add, 16)(int32_t subType, int32_t sendTime, int64_t fromQQ) { + + return EVENT_IGNORE; //ڷֵ˵, _eventPrivateMsg +} + + +/* +* Type=301 - +* msg +* responseFlag ʶ() +*/ +CQEVENT(int32_t, __eventRequest_AddFriend, 24)(int32_t subType, int32_t sendTime, int64_t fromQQ, const char *msg, const char *responseFlag) { + + //CQ_setFriendAddRequest(ac, responseFlag, REQUEST_ALLOW, ""); + + return EVENT_IGNORE; //ڷֵ˵, _eventPrivateMsg +} + + +/* +* Type=302 -Ⱥ +* subType ͣ1/Ⱥ 2/Լ(¼)Ⱥ +* msg +* responseFlag ʶ() +*/ +CQEVENT(int32_t, __eventRequest_AddGroup, 32)(int32_t subType, int32_t sendTime, int64_t fromGroup, int64_t fromQQ, const char *msg, const char *responseFlag) { + + //if (subType == 1) { + // CQ_setGroupAddRequestV2(ac, responseFlag, REQUEST_GROUPADD, REQUEST_ALLOW, ""); + //} else if (subType == 2) { + // CQ_setGroupAddRequestV2(ac, responseFlag, REQUEST_GROUPINVITE, REQUEST_ALLOW, ""); + //} + + return EVENT_IGNORE; //ڷֵ˵, _eventPrivateMsg +} + +/* +* ˵ .json ļò˵Ŀ +* ʹò˵ .json ˴ɾò˵ +*/ +CQEVENT(int32_t, __menuA, 0)() { + MessageBoxA(NULL, "menuA봰ڣ߽", "" ,0); + return 0; +} + +CQEVENT(int32_t, __menuB, 0)() { + MessageBoxA(NULL, "menuB봰ڣ߽", "" ,0); + return 0; +} diff --git a/Landlords/appmain.h b/Landlords/appmain.h new file mode 100644 index 0000000..3fe465b --- /dev/null +++ b/Landlords/appmain.h @@ -0,0 +1,2 @@ +#define CQAPPID "com.example.democ" //޸AppID http://d.cqp.me/Pro//Ϣ +#define CQAPPINFO CQAPIVERTEXT "," CQAPPID \ No newline at end of file diff --git a/Landlords/cqp.h b/Landlords/cqp.h new file mode 100644 index 0000000..62f8933 --- /dev/null +++ b/Landlords/cqp.h @@ -0,0 +1,226 @@ +/* +* CoolQ SDK for VC++ +* Api Version 9 +* Written by Coxxs & Thanks for the help of orzFly +*/ +#pragma once + +#include + +#define CQAPIVER 9 +#define CQAPIVERTEXT "9" + +#ifndef CQAPI +#define CQAPI(ReturnType) extern "C" __declspec(dllimport) ReturnType __stdcall +#endif + +#define CQEVENT(ReturnType, Name, Size) __pragma(comment(linker, "/EXPORT:" #Name "=_" #Name "@" #Size))\ + extern "C" __declspec(dllexport) ReturnType __stdcall Name + +typedef int32_t CQBOOL; + + +#define EVENT_IGNORE 0 //¼_ +#define EVENT_BLOCK 1 //¼_ + +#define REQUEST_ALLOW 1 //_ͨ +#define REQUEST_DENY 2 //_ܾ + +#define REQUEST_GROUPADD 1 //_Ⱥ +#define REQUEST_GROUPINVITE 2 //_Ⱥ + +#define CQLOG_DEBUG 0 // ɫ +#define CQLOG_INFO 10 //Ϣ ɫ +#define CQLOG_INFOSUCCESS 11 //Ϣ(ɹ) ɫ +#define CQLOG_INFORECV 12 //Ϣ() ɫ +#define CQLOG_INFOSEND 13 //Ϣ() ɫ +#define CQLOG_WARNING 20 // ɫ +#define CQLOG_ERROR 30 // ɫ +#define CQLOG_FATAL 40 // + + +/* +* ˽Ϣ, ɹϢID +* QQID ĿQQ +* msg Ϣ +*/ +CQAPI(int32_t) CQ_sendPrivateMsg(int32_t AuthCode, int64_t QQID, const char *msg); +/* +* ȺϢ, ɹϢID +* groupid Ⱥ +* msg Ϣ +*/ +CQAPI(int32_t) CQ_sendGroupMsg(int32_t AuthCode, int64_t groupid, const char *msg); + +/* +* Ϣ, ɹϢID +* discussid +* msg Ϣ +*/ +CQAPI(int32_t) CQ_sendDiscussMsg(int32_t AuthCode, int64_t discussid, const char *msg); + +/* +* Ϣ +* msgid ϢID +*/ +CQAPI(int32_t) CQ_deleteMsg(int32_t AuthCode, int64_t msgid); + +/* +* ֻ +* QQID QQ +*/ +CQAPI(int32_t) CQ_sendLike(int32_t AuthCode, int64_t QQID); + +/* +* ȺԱƳ +* groupid ĿȺ +* QQID QQ +* rejectaddrequest ٽմ˼Ⱥ룬 +*/ +CQAPI(int32_t) CQ_setGroupKick(int32_t AuthCode, int64_t groupid, int64_t QQID, CQBOOL rejectaddrequest); + +/* +* ȺԱ +* groupid ĿȺ +* QQID QQ +* duration Եʱ䣬λΪ롣Ҫд0 +*/ +CQAPI(int32_t) CQ_setGroupBan(int32_t AuthCode, int64_t groupid, int64_t QQID, int64_t duration); + +/* +* ȺԱ +* groupid ĿȺ +* QQID QQ +* setadmin true:ùԱ false:ȡԱ +*/ +CQAPI(int32_t) CQ_setGroupAdmin(int32_t AuthCode, int64_t groupid, int64_t QQID, CQBOOL setadmin); + +/* +* ȫȺ +* groupid ĿȺ +* enableban true: false:ر +*/ +CQAPI(int32_t) CQ_setGroupWholeBan(int32_t AuthCode, int64_t groupid, CQBOOL enableban); + +/* +* ȺԱ +* groupid ĿȺ +* anomymous ȺϢ¼յ anomymous +* duration Եʱ䣬λΪ롣ֽ֧ +*/ +CQAPI(int32_t) CQ_setGroupAnonymousBan(int32_t AuthCode, int64_t groupid, const char *anomymous, int64_t duration); + +/* +* Ⱥ +* groupid ĿȺ +* enableanomymous true: false:ر +*/ +CQAPI(int32_t) CQ_setGroupAnonymous(int32_t AuthCode, int64_t groupid, CQBOOL enableanomymous); + +/* +* ȺԱƬ +* groupid ĿȺ +* QQID ĿQQ +* newcard Ƭ(dz) +*/ +CQAPI(int32_t) CQ_setGroupCard(int32_t AuthCode, int64_t groupid, int64_t QQID, const char *newcard); + +/* +* Ⱥ˳ , ˽ӿҪϸȨ +* groupid ĿȺ +* isdismiss Ƿɢ true:ɢȺ(Ⱥ) false:˳Ⱥ(ȺԱ) +*/ +CQAPI(int32_t) CQ_setGroupLeave(int32_t AuthCode, int64_t groupid, CQBOOL isdismiss); + +/* +* ȺԱרͷ ȺȨ +* groupid ĿȺ +* QQID ĿQQ +* newspecialtitle ͷΣҪɾգ +* duration רͷЧڣλΪ롣Чд-1 +*/ +CQAPI(int32_t) CQ_setGroupSpecialTitle(int32_t AuthCode, int64_t groupid, int64_t QQID, const char *newspecialtitle, int64_t duration); + +/* +* ˳ +* discussid Ŀ +*/ +CQAPI(int32_t) CQ_setDiscussLeave(int32_t AuthCode, int64_t discussid); + +/* +* ú +* responseflag ¼յ responseflag +* responseoperation REQUEST_ALLOW REQUEST_DENY +* remark Ӻĺѱע +*/ +CQAPI(int32_t) CQ_setFriendAddRequest(int32_t AuthCode, const char *responseflag, int32_t responseoperation, const char *remark); + +/* +* Ⱥ +* responseflag ¼յ responseflag +* requesttype¼ REQUEST_GROUPADD REQUEST_GROUPINVITE +* responseoperation REQUEST_ALLOW REQUEST_DENY +* reason ɣ REQUEST_GROUPADD REQUEST_DENY ʱ +*/ +CQAPI(int32_t) CQ_setGroupAddRequestV2(int32_t AuthCode, const char *responseflag, int32_t requesttype, int32_t responseoperation, const char *reason); + +/* +* ȡȺԱϢ +* groupid ĿQQȺ +* QQID ĿQQ +* nocache ʹû +*/ +CQAPI(const char *) CQ_getGroupMemberInfoV2(int32_t AuthCode, int64_t groupid, int64_t QQID, CQBOOL nocache); + +/* +* ȡİϢ +* QQID ĿQQ +* nocache ʹû +*/ +CQAPI(const char *) CQ_getStrangerInfo(int32_t AuthCode, int64_t QQID, CQBOOL nocache); + +/* +* ־ +* priority ȼCQLOG ͷij +* category +* content +*/ +CQAPI(int32_t) CQ_addLog(int32_t AuthCode, int32_t priority, const char *category, const char *content); + +/* +* ȡCookies , ˽ӿҪϸȨ +*/ +CQAPI(const char *) CQ_getCookies(int32_t AuthCode); + +/* +* ȡCsrfToken , ˽ӿҪϸȨ +*/ +CQAPI(int32_t) CQ_getCsrfToken(int32_t AuthCode); + +/* +* ȡ¼QQ +*/ +CQAPI(int64_t) CQ_getLoginQQ(int32_t AuthCode); + +/* +* ȡ¼QQdz +*/ +CQAPI(const char *) CQ_getLoginNick(int32_t AuthCode); + +/* +* ȡӦĿ¼ص·ĩβ"\" +*/ +CQAPI(const char *) CQ_getAppDirectory(int32_t AuthCode); + +/* +* ʾ +* errorinfo Ϣ +*/ +CQAPI(int32_t) CQ_setFatal(int32_t AuthCode, const char *errorinfo); + +/* +* Ϣе(record),ر \data\record\ Ŀ¼µļ +* file յϢеļ(file) +* outformat ӦļʽĿǰ֧ mp3 amr wma m4a spx ogg wav flac +*/ +CQAPI(const char *) CQ_getRecord(int32_t AuthCode, const char *file, const char *outformat); diff --git a/Landlords/define.h b/Landlords/define.h new file mode 100644 index 0000000..9109bb1 --- /dev/null +++ b/Landlords/define.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include + +using playerID_t = uint64_t; +using roomID_t = uint32_t; + +extern std::ofstream logFile; +// +extern std::default_random_engine e; +// ֲ +extern std::uniform_int_distribution landU; // ѡ + +extern std::uniform_int_distribution cardsU; // ϴ + +enum card_t { + _3 = 1, + _4, + _5, + _6, + _7, + _8, + _9, + _10, + _J, + _Q, + _K, + _A, + _2, + _S, + _B +}; diff --git a/Landlords/dllmain.cpp b/Landlords/dllmain.cpp new file mode 100644 index 0000000..bc73c03 Binary files /dev/null and b/Landlords/dllmain.cpp differ diff --git a/Landlords/me.cqp.jie.landlords.json b/Landlords/me.cqp.jie.landlords.json new file mode 100644 index 0000000..0d6ad6b --- /dev/null +++ b/Landlords/me.cqp.jie.landlords.json @@ -0,0 +1,76 @@ +// ǰӦõ .dll, .json ļappidӦAppInfoصΪappid +// appid=com.example.democ, dlljsonļֱΪ com.example.democ.dllcom.example.democ.json +{ + "ret":1, // 룬̶Ϊ1 + "apiver":9, // Api汾SDKΪ9 + "name":"-", // Ӧ + "version":"1.0.0", // Ӧð汾 + "version_id":1, // Ӧ˳汾ÿηʱ+1 + "author":"Example", // Ӧ + "description":" -- ԰汾", + "event":[ // ¼бͬһ¼Ϳظ壨ǰɾ¼ + { + "id":1, // ¼ID + "type":21, // ¼ + "name":"˽Ϣ", // ¼ + "function":"_eventPrivateMsg", // ¼Ӧ + "priority":30000 // ¼ȼ(μ cq.im/deveventpriority) + }, + { + "id":2, + "type":2, + "name":"ȺϢ", + "function":"_eventGroupMsg", + "priority":30000 + }, + { + "id":3, + "type":4, + "name":"Ϣ", + "function":"_eventDiscussMsg", + "priority":30000 + }, + { + "id":1001, + "type":1001, + "name":"Q¼", + "priority":30000, + "function":"_eventStartup" + }, + { + "id":1002, + "type":1002, + "name":"Qر¼", + "priority":30000, + "function":"_eventExit" + }, + { + "id":1003, + "type":1003, + "name":"Ӧѱ", + "priority":30000, + "function":"_eventEnable" + }, + { + "id":1004, + "type":1004, + "name":"Ӧýͣ", + "priority":30000, + "function":"_eventDisable" + } + ], + "menu":[ // ò˵ǰɾò˵ò˵ȫɾ + { + "name":"", //˵ + "function":"_menu" //˵Ӧ + } + ], + "status":[ // ״̬ com.example.status + + ], + "auth":[ // ӦȨޣǰɾȨޣ + 101, //ȺϢ sendGroupMsg + 103, //Ϣ sendDiscussMsg + 106 //˽Ϣ sendPrivateMsg + ] +} \ No newline at end of file diff --git a/Landlords/recording.txt b/Landlords/recording.txt new file mode 100644 index 0000000..f999d59 --- /dev/null +++ b/Landlords/recording.txt @@ -0,0 +1,104 @@ +-------- ռ -------- +2018/2/24 һ +ճεĹУͻȻԶʱصĿQ +ŷŵʹܵ˿Q°ĿQ AirͬʱõһSDK +ȻҾͿʼSDK֮ϱдʱ + +磬ͻȻSDKдһϷãʺQQԻϷУдѾˡ +Ҿ룬ܲдһȽдϷDZûдġ +ͻȻ뵽ҪдһϷҷһ£ôɡ +ԣҾһϷ + +¶ĺҿʼĵ ͨ󣬲Ӧ뿪 +ĵд˲ҿʼһĿܣʵ˼򵥵 뷿׼ȹ +ǣ֪ʲô⣬ͨѯʱݴҲ֪ +Ҳ²ҵ⡣һϣδ⡣ +ȥȺˣȻûн⣬ѧ˺ܶϵ֪ʶ +Ҿع + + + +2018/2/25 ڶ +֮󣬵һǴ򿪵ԣȻϴ +ȻعҾ͸֮ǰĿļ[]ıǩ +Ҳϰˡ + +ҽ֮ǰĿĻܸ˹඼ʵһ +ҲIDƣзʶIJͨIDõö +ȻϴεⲻˣȻҲûイϴηʲô + +һһʱ䣬ʵ˻ + ˵䣬뷿䣬˳䡣 +鿴Ϣ鿴Ϣ鿴б鿴б +ŶһעṦܣҽϢ浽˱ + +2018/2/25 +ѧǿѧӣϧУ԰ʱѾԶңҲҪȥҹˡ + +ǰƪǽдģҪʵֵ +ʵֻϷܣ +㲥 +׼/ȡ׼ +ʼϷԶģҶ׼Զʼ +ϴƷ +ƣе + + + +ϣڽ꣬ɡ + +鿴б + +㲥 +⣬if (proom = nullptr) +ǣ + +ʼϷ + +ϴƷ + + +һʱ˼ˮȺ +Ҿģʽ +ijλҽ󣬰մÿλҾֻһΡĻᡣ +ѡûҼȨڸҡ +ûκѡȨڡеҡ +ÿһΣϷ *2 +йе޷СIJ + +еBUG࣬ + + +2018/2/27 + +Ҫе޸ʱüͿʼдƹ + +14:00 ޸ + +ʼдƹ + +ʶСж + +/ + +2018/2/28 + + + +ݣ +еָ "" +ָ "", "" +Ϣָ "" " 㵹ǿư" +ҳʱʾǰ + +ݣ + Ϣٴ֣Ϸֱӷ + ֵʱŻʾ + Ƶõƾʱʾũ + +ݣ +޸ ʱϢظ + + ڷҲ + ȥϢʱطͳɹĻظ + ˵ \ No newline at end of file diff --git a/Landlords/stdafx.cpp b/Landlords/stdafx.cpp new file mode 100644 index 0000000..9e21867 Binary files /dev/null and b/Landlords/stdafx.cpp differ diff --git a/Landlords/stdafx.h b/Landlords/stdafx.h new file mode 100644 index 0000000..e2e6307 Binary files /dev/null and b/Landlords/stdafx.h differ diff --git a/Landlords/targetver.h b/Landlords/targetver.h new file mode 100644 index 0000000..e2da66c Binary files /dev/null and b/Landlords/targetver.h differ