From bf01db687902c056949f13eaac5fba2150279739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B6=BE=E7=80=AC=E6=A1=83=E6=A1=83?= Date: Thu, 27 Jun 2024 00:45:18 +0800 Subject: [PATCH] final --- .gitignore | 7 + Build.bat | 1 + .../CardGame.Test.GamePlay1.vcxproj | 1 + ...ardGame.Test.GamePlay2.WhenPlayerAWins.cpp | 205 ++++++++++++++++++ ...ame.Test.GamePlay2.WhenPlayerAWins.vcxproj | 145 +++++++++++++ ....GamePlay2.WhenPlayerAWins.vcxproj.filters | 36 +++ .../CardGame.Test.GamePlay2.cpp | 42 +++- .../CardGame.Test.GamePlay2.vcxproj | 1 + CardGame.sln | 16 ++ CardGame/CardGame.vcxproj | 1 + ExpReportTemplate.docx | Bin 13975 -> 0 bytes 11 files changed, 452 insertions(+), 3 deletions(-) create mode 100644 CardGame.Test.GamePlay2.WhenPlayerAWins/CardGame.Test.GamePlay2.WhenPlayerAWins.cpp create mode 100644 CardGame.Test.GamePlay2.WhenPlayerAWins/CardGame.Test.GamePlay2.WhenPlayerAWins.vcxproj create mode 100644 CardGame.Test.GamePlay2.WhenPlayerAWins/CardGame.Test.GamePlay2.WhenPlayerAWins.vcxproj.filters delete mode 100644 ExpReportTemplate.docx diff --git a/.gitignore b/.gitignore index 648b64a..6c2d4cf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ +Report/ +Report.docx +Report.pdf +SimilarityDetectionReport.pdf +AIGCDetectionReport.pdf +Final/ + ### C++ ### # Prerequisites *.d diff --git a/Build.bat b/Build.bat index c7086b2..5ba228d 100644 --- a/Build.bat +++ b/Build.bat @@ -1,4 +1,5 @@ @echo off +chcp 65001 set "MSBUILD_PATH=" for /f "delims=" %%i in ('where /r "C:\Program Files\Microsoft Visual Studio" msbuild.exe') do ( set "MSBUILD_PATH=%%i" diff --git a/CardGame.Test.GamePlay1/CardGame.Test.GamePlay1.vcxproj b/CardGame.Test.GamePlay1/CardGame.Test.GamePlay1.vcxproj index d02b97d..1cafb1a 100644 --- a/CardGame.Test.GamePlay1/CardGame.Test.GamePlay1.vcxproj +++ b/CardGame.Test.GamePlay1/CardGame.Test.GamePlay1.vcxproj @@ -107,6 +107,7 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + /utf-8 %(AdditionalOptions) Console diff --git a/CardGame.Test.GamePlay2.WhenPlayerAWins/CardGame.Test.GamePlay2.WhenPlayerAWins.cpp b/CardGame.Test.GamePlay2.WhenPlayerAWins/CardGame.Test.GamePlay2.WhenPlayerAWins.cpp new file mode 100644 index 0000000..aa406f0 --- /dev/null +++ b/CardGame.Test.GamePlay2.WhenPlayerAWins/CardGame.Test.GamePlay2.WhenPlayerAWins.cpp @@ -0,0 +1,205 @@ +#include +using namespace std; +#include "SqList.h" +#include "SqQueue.h" +#include "SqStack.h" +#include "Functions.h" + +// 发牌 +void DealCards(int N, SqList*& PA, SqList*& PB, int times) +{ + int* CardPile = new int[N]; // 发牌堆 + srand((int)time(nullptr) + times); // 基于当前时间和游玩次数(对于测试代码,多次测试可能在同一秒完成)设置随机数种子 + for (int i = 0; i < N; i++) CardPile[i] = 2; // 默认情况下每个面值有两张牌 + for (int i = 0; i < N * 2; i++) + { + int j = 1, k = 1; + int num = rand() % N; // 获取一个 0~N-1 的随机数 + while (true) + { + if (CardPile[num] != 0) // 如果该数对应面值的牌未发完 + { + if (i % 2 == 0) // 发给PA + { + InsertElem_i(*PA, j++, num + 1); + CardPile[num]--; + } + else // 发给PB + { + InsertElem_i(*PB, k++, num + 1); + CardPile[num]--; + } + break; + } + else num = (num + 1) % N; // 若发完则检查下一位数字对应面值的牌 + } + } + delete[] CardPile; // 释放发牌堆占用的内存 +} + +// 输出B的手牌 +void DisplayPlayerBCards(int*& QB, int N) +{ + for (int i = 0; i < N; i++) + for (int j = 0; j < QB[i]; j++) + cout << i + 1 << " "; + cout << endl; +} + +bool IsPlayerAWin(int*& QB, int N) +{ + for (int i = 0; i < N; i++) + if (QB[i] > 0) return false; + return true; +} + +// 玩家B出牌 +int PlayerBPlay(int*& QB, SqStack& Desk, int N) +{ + // 如果栈为空,且B有两张相同面值的牌,则出该面值的牌 + if (StackEmpty(Desk)) + for (int i = 1; i <= N; i++) + if (QB[i - 1] == 2) + return i; + // 如果栈非空,则从栈底遍历,找到第一张手牌中拥有的牌出之 + for (int i = 0; i <= Desk.top; i++) + { + int card = Desk.base[i]; + if (QB[card - 1] > 0) + return card; + } + // 如果以上情况都不满足,则随机出一张牌 + int card; + do + card = rand() % N + 1; + while (QB[card - 1] == 0); + return card; +} + +int GamePlay2(SqList& PA, SqList& PB, int N) +{ + int winner = 0; + SqStack* Desk = new SqStack; // 牌桌上的牌 + InitStack(*Desk, N * 2 + 1); + // 玩法2初始化 + // 对于玩法2,PA为先抓到的牌先出,赢的牌加在牌尾;PB为任意出牌 + SqQueue* QA = new SqQueue; + InitQueue(*QA, N * 2 + 1); + // PB手牌存储方式:下标为面值-1,值为张数 + int* QB = new int[N]; + for (int i = 0; i < N; i++) QB[i] = 0; + // 将PA的牌放入QA + for (int i = 1; i <= N; i++) + { + int e = 0; + GetElem_i(PA, i, e); + EnQueue(*QA, e); + } + // 将PB的牌放入QB + for (int i = 1; i <= N; i++) + { + int e = 0; + GetElem_i(PB, i, e); + QB[e - 1]++; + } + // Step2 玩牌 + int a = 0, b = 0, i = 0; // i的奇偶性决定出牌方 + while (true) + { + int x = 0; + // 双方交替出牌 + if (i++ % 2 == 0) { + DeQueue(*QA, a); + x = a; + } + else { + b = PlayerBPlay(QB, *Desk, N); + QB[b - 1]--; + x = b; + } + // 如果桌面上没有面值为X的牌,则将牌放到牌桌上 + if (FindElem(*Desk, x) == -1) Push(*Desk, x); + // 如果桌面上有面值为X的牌 + else + { + int times = FindElem(*Desk, x); + if (IsPlayerA(i)) // 如果是A出的牌 + { + // 将X放入牌尾 + EnQueue(*QA, x); + // 将桌面上直到X的牌依次放入牌尾 + for (int j = 0; j <= times; j++) + { + int e = 0; + Pop(*Desk, e); + EnQueue(*QA, e); + } + } + else // 如果是B出的牌 + { + // 将X放入手牌 + QB[x - 1]++; + // 将桌面上直到X的牌依次放入手牌 + for (int j = 0; j <= times; j++) + { + int e = 0; + Pop(*Desk, e); + QB[e - 1]++; + } + } + } + // 判断是否有一方获胜 + if (QueueEmpty(*QA)) + { + winner = 2; + break; + } + else if (IsPlayerAWin(QB, N)) + { + winner = 1; + break; + } + } + DestroyStack(*Desk); + DestroyQueue(*QA); + delete Desk; + delete QA; + delete[] QB; + return winner; +} + +int main() +{ + int counts; + cout << "Enter after how many times A win the program stops: "; + cin >> counts; + int i = 0; + int N = 9; + int flag = 0; + while (true) + { + i++; + SqList* PA = new SqList; // PA的手牌 + InitList(*PA, N); + SqList* PB = new SqList; // PB的手牌 + InitList(*PB, N); + DealCards(N, PA, PB, i); + int result = GamePlay2(*PA, *PB, N); + if (result == 1) + { + cout << "-----------------" << endl; + DispList(*PA); + DispList(*PB); + flag++; + } + DestroyList(*PA); + DestroyList(*PB); + delete PA; + delete PB; + if (flag == counts) + { + cout << "Totally run " << i << " times." << endl; + break; + } + } +} \ No newline at end of file diff --git a/CardGame.Test.GamePlay2.WhenPlayerAWins/CardGame.Test.GamePlay2.WhenPlayerAWins.vcxproj b/CardGame.Test.GamePlay2.WhenPlayerAWins/CardGame.Test.GamePlay2.WhenPlayerAWins.vcxproj new file mode 100644 index 0000000..fa8760f --- /dev/null +++ b/CardGame.Test.GamePlay2.WhenPlayerAWins/CardGame.Test.GamePlay2.WhenPlayerAWins.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {029c5a36-ca7e-4ee4-afa9-873f937689a4} + CardGameTestGamePlay2WhenPlayerAWins + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + ..\include;$(IncludePath) + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + /utf-8 %(AdditionalOptions) + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CardGame.Test.GamePlay2.WhenPlayerAWins/CardGame.Test.GamePlay2.WhenPlayerAWins.vcxproj.filters b/CardGame.Test.GamePlay2.WhenPlayerAWins/CardGame.Test.GamePlay2.WhenPlayerAWins.vcxproj.filters new file mode 100644 index 0000000..62f375c --- /dev/null +++ b/CardGame.Test.GamePlay2.WhenPlayerAWins/CardGame.Test.GamePlay2.WhenPlayerAWins.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;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/CardGame.Test.GamePlay2/CardGame.Test.GamePlay2.cpp b/CardGame.Test.GamePlay2/CardGame.Test.GamePlay2.cpp index 98b59dd..826abb0 100644 --- a/CardGame.Test.GamePlay2/CardGame.Test.GamePlay2.cpp +++ b/CardGame.Test.GamePlay2/CardGame.Test.GamePlay2.cpp @@ -5,6 +5,31 @@ using namespace std; #include "SqStack.h" #include "Functions.h" +// 计算两张面值相同的牌在同一个人的手牌中的情况 +int CalcTwoCardsWithSameNumInOnePlayersPile(SqList& PA, SqList& PB, int N) +{ + int count = 0; + int* QA = new int[N]; + int* QB = new int[N]; for (int i = 0; i < N; i++) QA[i] = QB[i] = 0; + for (int i = 1; i <= N; i++) + { + int e = 0; + GetElem_i(PA, i, e); + QA[e - 1]++; + int f = 0; + GetElem_i(PB, i, f); + QB[f - 1]++; + } + for (int i = 0; i < N; i++) + { + if (QA[i] == 2) count++; + if (QB[i] == 2) count++; + } + delete[] QA; + delete[] QB; + return count; +} + // 发牌 void DealCards(int N, SqList*& PA, SqList*& PB, int times) { @@ -176,6 +201,7 @@ int main() int N = 9; int PlayerAWinCount = 0, PlayerBWinCount = 0; int RealCounts = counts; + int TwoCardsWithSameNumInOnePlayersPileA = 0, TwoCardsWithSameNumInOnePlayersPileB = 0; for (int i = 0; i < counts; i++) { SqList* PA = new SqList; // PA的手牌 @@ -184,18 +210,28 @@ int main() InitList(*PB, N); DealCards(N, PA, PB, i); int result = GamePlay2(*PA, *PB, N); + if (result == 1) + { + PlayerAWinCount++; + TwoCardsWithSameNumInOnePlayersPileA += CalcTwoCardsWithSameNumInOnePlayersPile(*PA, *PB, N); + } + else if (result == 2) + { + PlayerBWinCount++; + TwoCardsWithSameNumInOnePlayersPileB += CalcTwoCardsWithSameNumInOnePlayersPile(*PA, *PB, N); + } + else RealCounts--; DestroyList(*PA); DestroyList(*PB); delete PA; delete PB; - if (result == 1) PlayerAWinCount++; - else if (result == 2) PlayerBWinCount++; - else RealCounts--; } double PlayerAWinRate = (double)PlayerAWinCount / RealCounts; double PlayerBWinRate = (double)PlayerBWinCount / RealCounts; cout << "Test Result:\n"; cout << "Total test counts: " << RealCounts << endl; cout << "Player A wins: " << PlayerAWinCount << " times, rate: " << PlayerAWinRate * 100 << "%" << endl; + cout << "Average number of two cards with same number in one player's pile: " << (double)TwoCardsWithSameNumInOnePlayersPileA / PlayerAWinCount << endl; cout << "Player B wins: " << PlayerBWinCount << " times, rate: " << PlayerBWinRate * 100 << "%" << endl; + cout << "Average number of two cards with same number in one player's pile: " << (double)TwoCardsWithSameNumInOnePlayersPileB / PlayerBWinCount << endl; } \ No newline at end of file diff --git a/CardGame.Test.GamePlay2/CardGame.Test.GamePlay2.vcxproj b/CardGame.Test.GamePlay2/CardGame.Test.GamePlay2.vcxproj index a359c73..8a825ae 100644 --- a/CardGame.Test.GamePlay2/CardGame.Test.GamePlay2.vcxproj +++ b/CardGame.Test.GamePlay2/CardGame.Test.GamePlay2.vcxproj @@ -107,6 +107,7 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + /utf-8 %(AdditionalOptions) Console diff --git a/CardGame.sln b/CardGame.sln index 3743fb0..5abbfed 100644 --- a/CardGame.sln +++ b/CardGame.sln @@ -9,6 +9,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CardGame.Test.GamePlay1", " EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CardGame.Test.GamePlay2", "CardGame.Test.GamePlay2\CardGame.Test.GamePlay2.vcxproj", "{6383C4B6-1282-4F20-864A-7208EC5805CA}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "杂项", "杂项", "{8CC18327-DB10-409C-B35B-3CE741ECBF57}" + ProjectSection(SolutionItems) = preProject + MultipleAttemptsTestResult.txt = MultipleAttemptsTestResult.txt + TaskInfo.md = TaskInfo.md + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CardGame.Test.GamePlay2.WhenPlayerAWins", "CardGame.Test.GamePlay2.WhenPlayerAWins\CardGame.Test.GamePlay2.WhenPlayerAWins.vcxproj", "{029C5A36-CA7E-4EE4-AFA9-873F937689A4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -41,6 +49,14 @@ Global {6383C4B6-1282-4F20-864A-7208EC5805CA}.Release|x64.Build.0 = Release|x64 {6383C4B6-1282-4F20-864A-7208EC5805CA}.Release|x86.ActiveCfg = Release|Win32 {6383C4B6-1282-4F20-864A-7208EC5805CA}.Release|x86.Build.0 = Release|Win32 + {029C5A36-CA7E-4EE4-AFA9-873F937689A4}.Debug|x64.ActiveCfg = Debug|x64 + {029C5A36-CA7E-4EE4-AFA9-873F937689A4}.Debug|x64.Build.0 = Debug|x64 + {029C5A36-CA7E-4EE4-AFA9-873F937689A4}.Debug|x86.ActiveCfg = Debug|Win32 + {029C5A36-CA7E-4EE4-AFA9-873F937689A4}.Debug|x86.Build.0 = Debug|Win32 + {029C5A36-CA7E-4EE4-AFA9-873F937689A4}.Release|x64.ActiveCfg = Release|x64 + {029C5A36-CA7E-4EE4-AFA9-873F937689A4}.Release|x64.Build.0 = Release|x64 + {029C5A36-CA7E-4EE4-AFA9-873F937689A4}.Release|x86.ActiveCfg = Release|Win32 + {029C5A36-CA7E-4EE4-AFA9-873F937689A4}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/CardGame/CardGame.vcxproj b/CardGame/CardGame.vcxproj index 6024606..49fbd03 100644 --- a/CardGame/CardGame.vcxproj +++ b/CardGame/CardGame.vcxproj @@ -107,6 +107,7 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + /utf-8 %(AdditionalOptions) Console diff --git a/ExpReportTemplate.docx b/ExpReportTemplate.docx deleted file mode 100644 index 06143b6a61692f7c856a331e97a407087ad816b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13975 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 J5bJNL{|BP5%>n=b