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 << "ע⣬dz6ֻ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