From 62562f8f8a3579c0c59704081c81e7ff9003d5b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B6=BE=E7=80=AC=E6=A1=83=E6=A1=83?= Date: Mon, 17 Jun 2024 19:31:40 +0800 Subject: [PATCH] feat: card play 2 --- .../.idea/.idea.CardGame/.idea/.gitignore | 13 + .../.idea/.idea.CardGame/.idea/encodings.xml | 4 + .../.idea.CardGame/.idea/indexLayout.xml | 8 + CardGame/.idea/.idea.CardGame/.idea/vcs.xml | 6 + CardGame/CardGame.cpp | 13 +- CardGame/CardGame.vcxproj | 1 - CardGame/CardGame.vcxproj.filters | 3 - CardGame/Functions.h | 12 +- CardGame/GamePlay1.cpp | 6 +- CardGame/GamePlay2.cpp | 127 ++++++++- CardGame/include/LinkList.h | 255 ------------------ ExpReportTemplate.dotx | Bin 0 -> 16941 bytes 12 files changed, 171 insertions(+), 277 deletions(-) create mode 100644 CardGame/.idea/.idea.CardGame/.idea/.gitignore create mode 100644 CardGame/.idea/.idea.CardGame/.idea/encodings.xml create mode 100644 CardGame/.idea/.idea.CardGame/.idea/indexLayout.xml create mode 100644 CardGame/.idea/.idea.CardGame/.idea/vcs.xml delete mode 100644 CardGame/include/LinkList.h create mode 100644 ExpReportTemplate.dotx diff --git a/CardGame/.idea/.idea.CardGame/.idea/.gitignore b/CardGame/.idea/.idea.CardGame/.idea/.gitignore new file mode 100644 index 0000000..b856034 --- /dev/null +++ b/CardGame/.idea/.idea.CardGame/.idea/.gitignore @@ -0,0 +1,13 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# Rider 忽略的文件 +/projectSettingsUpdater.xml +/.idea.CardGame.iml +/modules.xml +/contentModel.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/CardGame/.idea/.idea.CardGame/.idea/encodings.xml b/CardGame/.idea/.idea.CardGame/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/CardGame/.idea/.idea.CardGame/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/CardGame/.idea/.idea.CardGame/.idea/indexLayout.xml b/CardGame/.idea/.idea.CardGame/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/CardGame/.idea/.idea.CardGame/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/CardGame/.idea/.idea.CardGame/.idea/vcs.xml b/CardGame/.idea/.idea.CardGame/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/CardGame/.idea/.idea.CardGame/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/CardGame/CardGame.cpp b/CardGame/CardGame.cpp index 3f47372..f7dc53f 100644 --- a/CardGame/CardGame.cpp +++ b/CardGame/CardGame.cpp @@ -22,7 +22,14 @@ int main() DealCards(N, PA, PB); DispList(*PA); DispList(*PB); - - GamePlay1(*PA,*PB,N); - GamePlay2(*PA,*PB,N); + + cout << "------------------------------" << endl; + cout << "Game Play 1" << endl; + GamePlay1(*PA, *PB, N); + cout << "------------------------------" << endl; + cout << "Game Play 2" << endl; + GamePlay2(*PA, *PB, N); + + DestroyList(*PA); + DestroyList(*PB); } \ No newline at end of file diff --git a/CardGame/CardGame.vcxproj b/CardGame/CardGame.vcxproj index 7b34f64..5869263 100644 --- a/CardGame/CardGame.vcxproj +++ b/CardGame/CardGame.vcxproj @@ -133,7 +133,6 @@ - diff --git a/CardGame/CardGame.vcxproj.filters b/CardGame/CardGame.vcxproj.filters index 7ee0dd6..240ee54 100644 --- a/CardGame/CardGame.vcxproj.filters +++ b/CardGame/CardGame.vcxproj.filters @@ -38,9 +38,6 @@ 头文件 - - 头文件 - 头文件 diff --git a/CardGame/Functions.h b/CardGame/Functions.h index 7ad582e..479c11c 100644 --- a/CardGame/Functions.h +++ b/CardGame/Functions.h @@ -20,12 +20,12 @@ inline void DealCards(int N, SqList*& PA, SqList*& PB) { if (i % 2 == 0) // 发给PA { - InsertElem_i(* PA, j++, num + 1); + InsertElem_i(*PA, j++, num + 1); CardPile[num]--; } else // 发给PB { - InsertElem_i(* PB, k++, num + 1); + InsertElem_i(*PB, k++, num + 1); CardPile[num]--; } break; @@ -41,9 +41,7 @@ inline int FindElem(SqStack& S, int e) { int i = S.top; // 从栈顶开始查找 for (; i >= 0; i--) - { if (S.base[i] == e) return S.top - i; // 返回距离 - } return -1; } @@ -51,4 +49,10 @@ inline int FindElem(SqStack& S, int e) inline bool IsPlayerA(int i) { return i % 2 == 1; +} + +// 返回栈元素数量 +inline int StackSize(SqStack& S) +{ + return S.top + 1; } \ No newline at end of file diff --git a/CardGame/GamePlay1.cpp b/CardGame/GamePlay1.cpp index 66e444b..6fea6eb 100644 --- a/CardGame/GamePlay1.cpp +++ b/CardGame/GamePlay1.cpp @@ -25,9 +25,9 @@ void GamePlay1(SqList PA, SqList PB, int N) // 玩法1初始化 // 对于玩法1,双方均为先抓到的牌先出,赢的牌加在牌尾 SqQueue* QA = new SqQueue; - InitQueue(*QA, 2 * N + 1); + InitQueue(*QA, N * 2 + 1); SqQueue* QB = new SqQueue; - InitQueue(*QB, 2 * N + 1); + InitQueue(*QB, N * 2 + 1); // 将PA和PB的牌分别放入QA和QB for (int i = 1; i <= N; i++) { @@ -95,7 +95,7 @@ void GamePlay1(SqList PA, SqList PB, int N) break; } } - delete Desk; + DestroyStack(*Desk); DestroyQueue(*QA); DestroyQueue(*QB); } \ No newline at end of file diff --git a/CardGame/GamePlay2.cpp b/CardGame/GamePlay2.cpp index 753eda4..d9d56ac 100644 --- a/CardGame/GamePlay2.cpp +++ b/CardGame/GamePlay2.cpp @@ -3,19 +3,70 @@ using namespace std; #include "include/SqList.h" #include "include/SqQueue.h" #include "include/SqStack.h" -#include "include/LinkList.h" #include "FuncRef.h" +#include "Functions.h" + +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; +} + +void DisplayStatus(SqQueue& QA, int* QB, SqStack& Desk, int i, int N) +{ + cout << "------------------------------" << endl; + cout << "Round " << i << endl; + cout << "Player A: "; + DispQueue(QA); + cout << "Player B: "; + DisplayPlayerBCards(QB, N); + cout << "Desk: "; + DispStack(Desk); +} + +bool IsPlayerBWin(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; +} void GamePlay2(SqList PA, SqList PB, int N) { SqStack* Desk = new SqStack; // 牌桌上的牌 - InitStack(*Desk, N * 2); + InitStack(*Desk, N * 2 + 1); // 玩法2初始化 // 对于玩法2,PA为先抓到的牌先出,赢的牌加在牌尾;PB为任意出牌 SqQueue* QA = new SqQueue; - InitQueue(*QA, N + 1); - LNode* QB; - InitList(QB); + 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++) { @@ -28,8 +79,68 @@ void GamePlay2(SqList PA, SqList PB, int N) { int e = 0; GetElem_i(PB, i, e); - InsertElem_i(QB, i, e); + QB[e - 1]++; } - DispQueue(*QA); - DispList(QB); + // 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]++; + } + } + } + DisplayStatus(*QA, QB, *Desk, i, N); + // 判断是否有一方获胜 + if (QueueEmpty(*QA)) + { + cout << "Player B wins!" << endl; + break; + } + else if (IsPlayerBWin(QB, N)) + { + cout << "Player A wins!" << endl; + break; + } + } + DestroyStack(*Desk); + DestroyQueue(*QA); + delete[] QB; } \ No newline at end of file diff --git a/CardGame/include/LinkList.h b/CardGame/include/LinkList.h deleted file mode 100644 index a5833a6..0000000 --- a/CardGame/include/LinkList.h +++ /dev/null @@ -1,255 +0,0 @@ -#pragma once -#include - -template -struct LNode //链表结点 -{ - DT data; //数据域,存储数据元素值 - LNode* next; //指针域,指向下一个结点 -}; - -//算法2.1 -template -bool PriorElem_e(LNode
* L, DT e, DT& pre_e) // 求值为e的元素前驱 -{ - int k; - k = LocateElem_e(L, e); // 1.获取e的位序k - if (k > 1) // 2.位序k大于1 - { - GetElem_i(L, k - 1, pre_e); // 第k-1个元素为e的前驱 - return true; - } - else // 3.元素e无前驱 - return false; // 返回false -} - -//【算法2.14】 创建空单链表 -template -bool InitList(LNode
*& L) -{ - L = new LNode
; // 1.创建头结点 - if (!L) exit(1); // 2.创建失败,退出 - L->next = NULL; // 3.创建成功 - return true; // 返回true -} - -//【算法2.15】 尾插法创建n的元素 -template -bool CreateList_1(LNode
*& L, int n) -{ - int i; - LNode
* p, * s; - p = L; //1.工作指针初始化,指向尾结点 - cout << "依次输入" << n << "个数据元素:" << endl; - for (i = 1; i <= n; i++) // 2.按元素位序正序创建各结点 - { - s = new LNode
; // 2.1 新建一个结点s - if (!s) // 2.2 创建失败,返回false - return false; - cin >> s->data; // 2.3 输入结点值 - s->next = p->next; // 2.4 s 链在表尾 - p->next = s; - p = s; // 2.5 工作指针指向 s - } - return true; // 3.创建成功,返回true -} - -//【算法2.16】 头插法创建n个元素 -template -bool CreateList_2(LNode
* (&L), int n) -{ - int i; - LNode
* s; - cout << "逆序输入" << n << "个数据元素:" << endl; - for (i = 1; i <= n; i++) // 1.按元素位序逆序创建各结点 - { - s = new LNode
; // 1.1 新建一个结点 s - if (!s) // 1.2 创建失败,返回false - return false; - cin >> s->data; // 1.3 输入结点值 - s->next = L->next; // 1.4 s 在头结点后 - L->next = s; - } - return true; // 1.创建成功,返回true -} - -//【算法2.17】 -template -void DestroyList(LNode
* (&L)) // 释放链表所占空间 -{ - LNode
* p; - while (L) // 1. 表非空,从头结点开始,依次释放结点 - { - p = L; // 1.1 处理表头结点 - L = L->next; // 1.2 头指针后移 - delete p; // 1.3 释放表头结点所占内存 - } - L = NULL; // 2.头指针指向空 -} - -//【算法2.18】 获取第i个元素 -template -bool GetElem_i(LNode
* L, int i, DT& e) -{ - LNode
* p; // 1.初始化 - p = L->next; // 1.1 设置工作指针,从首结点开始数结点 - int j = 1; // 1.2 计数器初始化 - while (p && j < i) // 2.定位到第i个元素结点 - { - p = p->next; j++; - } - if (!p || j > i) // 3 未找到,返回false - return false; - else // 4. 找到 - { - e = p->data; // 获取第i个元素值 - return true; // 返回true - } -} - -//【算法2.19】 查找值为e的元素位序 -template -int LocateElem_e(LNode
* L, DT e) -{ - - LNode
* p; // 1.初始化从首元开始查找 - p = L->next; // 1.1从首元开始查找 - int j = 1; // 1.2 计数器初值 - while (p && p->data != e) // 2.顺序查找 - { - p = p->next; // 2.1未找到指针后移 - j++; // 2.2 计数器增1 - } - if (p == NULL) // 3. 判断是否找到 - return 0; // 3.1末找到,返回0 - else - return j; // 3.2 找到,返回位序 -} - -//【算法2.20】 插入第i个元素 -template -bool InsertElem_i(LNode
*& L, int i, DT e) -{ - - int j = 0; - LNode
* p; // 1.初始化 - p = L; // 工作指针初始化 - while (p && j < i - 1) // 2. 定位到插入点前驱 - { - p = p->next; - j++; - } - if (!p || j > i - 1) // 3.判断定位是否成功: - return false; // 3.1 定位失败,不能插入 - else // 3.2 定位成功 - { - LNode
* s; - s = new LNode
; // 3.2.1建立新结点 - s->data = e; // 3.2.2新结点赋值 - s->next = p->next; // 3.2.3结点S链接到p结点之后 - p->next = s; - return true; // 3.2.4 插入成功,返回true - } - -} - -//【算法2.21】 删除第i个元素 -template -bool DeleElem_i(LNode
* (&L), int i) -{ - - LNode
* p, * q; //1.初始化:设置工作指针 - p = L; //查找从头结点开始 - int j = 0; //计数器初始化 - while (p->next && j < i - 1) //2.p定位到删除点的前驱 - { - p = p->next; - j++; - } - if (!p->next || j > i - 1) //3.删除位置不合理,不能删除 - return false; //返回false - else //4.删除操作 - { - q = p->next; //4.1暂存删除结点位置 - p->next = q->next; //4.2从链表中摘除删除结点 - delete q; - return true; //4.3删除成功,返回true - } -} - - -//【算法2.22】 修改第i个元素值 -template -bool PutElem_i(LNode
* (&L), int i, DT e) -{ - LNode
* p; // 1.初始化:设置工作指针 - p = L->next; // 从首结点开始,数结点 - int j = 1; // 计数器初始化 - while (p && j < i) // 2.查找第i个元素结点 - { - p = p->next; j++; - } - if (!p || j > i) // 3.元素不存在,返回false - return false; - else // 4.定位成功 - { - p->data = e; // 修改元素值 - return true; // 返回true - } -} - -// 释放链表所占空间 -template -void ClearList(LNode
* (&L)) -{ - - LNode
* p; - while (L->next) // 从首元结点开始,依次释放结点 - { - p = L->next; - L->next = p->next; - delete p; - } - cout << endl << "表已清空!" << endl; -} - - -//【算法2.23】 测表长 -template -int ListLength(LNode
* L) -{ // 1.初始化 - int len = 0; // 1.1 结点计数器赋初值0 - LNode
* p; // 1.2设置工作指针 - p = L; // 指向头结点 - while (p->next) // 2.数结点个数。有后继结点, - { - len++; p = p->next; // 结点数增1,指针后移 - } - return len; // 3.返回表长 -} - -// -template -bool ListEmpty(LNode
* L) //测表空 -{ - if (L->next == NULL) - return true; //空表,返回1 - else - return false; //不空,返回0 -} - - -//【算法2.24】 遍历表 -template -void DispList(LNode
* L) // 显示表内容 -{ - LNode
* p; // 1. 设置工作指针 - p = L; // 从首元结点开始遍历 - while (p->next) // 2.依次输出各结点值 - { - p = p->next; cout << p->data << " "; - - - } - cout << endl; -} diff --git a/ExpReportTemplate.dotx b/ExpReportTemplate.dotx new file mode 100644 index 0000000000000000000000000000000000000000..d92ed535dc88a9dec65da1cfcb14dc1d14084603 GIT binary patch literal 16941 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%0DnVEj6 zga4-n}KK5yVVDug|Ab3ue$)#sHXce;F+g_bUWQ8)j7t-oUD6AX|}NYk$C7 z{7Sy+?QNyY-?6@aRAT0HKOgGPR`o23GY6oLa3SYt1$8LrQZzJPX(rUtmKUdle>&^C zl0Qy?(%;b)>3C7ESV&t3zgz`-AxH4%tA=DnxZ*dx|Hot*w`BOD7f^LS163F4&#J3$ zYx~1K{#SE>Y74y5mAb807+<#|?(<`HaMaA!W5J4v#xyME^aA=NC;dfMgsdc^lZoyg zrk%Fk_AB1TMD5IO$8DS}x-5Yj)~r=r*emW}zdep{8mC@Yl~3ZoppCH?b6VS^=GPxN z-Rb9W{m7?B8b)OZo22R{jbYD$ZH=h$CD?RAImeJrG_yxlBf`>n5U$&hIiy^ z>^W5c=Dc1kStygQ8li0LC|Dm>cZ-UmnE{KjhE728S6f1%5A`Gs8qYOv?{_RlygMx> zgWZrWF*dx|i*Kf9Bro7E(K0J=gTg`K!b(3<*Aadze9ivesmX-GsG=p1=o$3WwU)w2&+tdYiA2x(Icxu!fW)%XOQ#R$i;RHaD|r-h5buk_KI@G=jfHHk z8&CSzP$vU6)T3#l-FvImECU|$FXGRT|72|)`MKPCfUkrSsI~+^mHn09{R71FpDgcx z@zp<7_m3icvKsIc$n>Ibkn0vcj03^z}=@oFAc<<%+N~ zhUME-ERAE)s>L%Vj!JN;QyFGD)|^;U%;`F{f4=JkU5zV22=Md7!clnQ-Q;GE$a86W z;{t>ARW!&M69cyB)1wh}L}{a&5Yq-^?|Nwo0H(#_YSw4OT0#1+4E}m#^Un;HfnENgOh0w#cf#Kfsr@1)1}10zc4X~$^1mJr_(co?vJ3QL z|F^>ezjOK>3;v6jFw(y`{T1f+7l7OE+$%*pQz{tCS@Y5dORcX+}tJ~f2@dWye*6@I7xJ#YAnUIU1j|0&*I zS;XIoe-Cee5uY;sdN+R#cK^oVw*c)I2OE}uarjHP_B;JwJ?~%CK!=76_$Ge$!+$6L ztM~I~@)*uPk^jpV`knf(3(=pcMY#X`2LEYUQjmrOh7v!bQWTJJAiPA1_s75g0b1`_ APyhe` literal 0 HcmV?d00001