C++ Poker Game: Find a Winning Hand Algorithm and Code
Sure! Here's the updated code:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 25;
int n, m;
char WordsFromF[MAXN];
char CardsNumsFromF[MAXN];
int NumsFromF[MAXN];
char WordsFromC[MAXN];
char CardsNumsFromC[MAXN];
int NumsFromC[MAXN];
bool IsSameColor = true;
bool IsSameNum = true;
// Function to convert card number to integer value
inline void checkCard(int Num, int i, int Nums[]) {
if (Num >= '3' && Num <= '9') Nums[i] = Num - '0';
else {
if (Num == 'X') Nums[i] = 10;
else if (Num == 'J') Nums[i] = 11;
else if (Num == 'Q') Nums[i] = 12;
else if (Num == 'K') Nums[i] = 13;
else if (Num == 'A') Nums[i] = 14;
else if (Num == '2') Nums[i] = 15;
}
}
// Function to check if there exists a valid set of cards B
inline bool judgeCards() {
if (m == 1) {
// Single card case
for (int i = 1; i <= n; i++) {
if (NumsFromF[i] > NumsFromC[1]) {
cout << WordsFromF[i] << CardsNumsFromF[i];
return true;
}
}
return false;
} else if (m == 2 && IsSameNum) {
// Pair case
for (int i = 1; i <= n; i++) {
if (NumsFromF[i] > NumsFromC[1] && NumsFromF[i + 1] == NumsFromF[i]) {
cout << WordsFromF[i] << CardsNumsFromF[i] << " ";
cout << WordsFromF[i + 1] << CardsNumsFromF[i + 1];
return true;
}
}
return false;
} else if (m >= 3 && IsSameColor && !IsSameNum && CardsNumsFromC[1] != CardsNumsFromC[2]) {
// Flush case
for (int i = 1; i <= n; i++) {
if (CardsNumsFromF[i + m - 1] == '2' || i + m - 1 > n) {
// Cannot form a flush
break;
}
int j;
for (j = i + 1; j <= m + i - 1; j++) {
if (NumsFromF[j - 1] + 1 != NumsFromF[j] || WordsFromF[j - 1] != WordsFromF[j]) break;
}
if (j == m + i) {
if (NumsFromF[m + i + 1] > NumsFromC[m + i + 1]) {
for (int k = m; k >= 1; k--) {
cout << WordsFromF[j - k] << CardsNumsFromF[j - k] << " ";
}
return true;
}
}
}
return false;
} else if (m >= 5 && !IsSameColor && !IsSameNum) {
// Straight case
for (int i = 1; i <= n; i++) {
if (CardsNumsFromF[i + m - 1] == '2' || i + m - 1 > n) {
// Cannot form a straight
break;
}
int j;
for (j = i + 1; j <= m + i - 1; j++) {
if (NumsFromF[j - 1] + 1 != NumsFromF[j]) break;
}
if (j == m + i) {
if (NumsFromF[j - m + 1] > NumsFromC[1]) {
for (int k = m; k >= 1; k--) {
cout << WordsFromF[j - k + 1] << CardsNumsFromF[j - k + 1] << " ";
}
return true;
}
}
}
return false;
} else if (m == 4 && !IsSameNum && CardsNumsFromC[1] == CardsNumsFromC[2] && CardsNumsFromC[m - 1] != CardsNumsFromC[m]) {
// Three of a kind case
if (n == 3) {
return false;
}
for (int i = 1; i <= n; i++) {
int j;
for (j = i + 1; j <= m + i; j++) {
if (j != m - 1) {
if (NumsFromF[j - 1] == NumsFromF[j]) continue;
else break;
} else {
if (NumsFromF[j] > NumsFromC[2]) {
for (int k = m; k >= 1; k--) {
cout << WordsFromF[j - k + 1] << CardsNumsFromF[j - k + 1] << " ";
}
return true;
} else {
break;
}
}
}
}
return false;
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> WordsFromF[i] >> CardsNumsFromF[i];
checkCard(CardsNumsFromF[i], i, NumsFromF);
}
cin >> m;
for (int i = 1; i <= m; i++) {
cin >> WordsFromC[i] >> CardsNumsFromC[i];
checkCard(CardsNumsFromC[i], i, NumsFromC);
if (i != 1) {
if (WordsFromC[i] != WordsFromC[i - 1]) IsSameColor = false;
if (CardsNumsFromC[i] != CardsNumsFromC[i - 1]) IsSameNum = false;
}
}
bool found = false;
for (int i = NumsFromC[m] + 1; i <= 15; i++) {
if (m == 1) {
for (int j = 1; j <= n; j++) {
if (NumsFromF[j] == i) {
cout << WordsFromF[j] << CardsNumsFromF[j];
found = true;
break;
}
}
} else if (m == 2 && IsSameNum) {
for (int j = 1; j <= n - 1; j++) {
if (NumsFromF[j] == i && NumsFromF[j + 1] == i) {
cout << WordsFromF[j] << CardsNumsFromF[j] << " ";
cout << WordsFromF[j + 1] << CardsNumsFromF[j + 1];
found = true;
break;
}
}
} else if (m >= 3 && IsSameColor && !IsSameNum && CardsNumsFromC[1] != CardsNumsFromC[2]) {
for (int j = 1; j <= n - m + 1; j++) {
bool valid = true;
for (int k = 0; k < m; k++) {
if (NumsFromF[j + k] != i + k || WordsFromF[j + k] != WordsFromF[j]) {
valid = false;
break;
}
}
if (valid) {
for (int k = 0; k < m; k++) {
cout << WordsFromF[j + k] << CardsNumsFromF[j + k] << " ";
}
found = true;
break;
}
}
} else if (m >= 5 && !IsSameColor && !IsSameNum) {
for (int j = 1; j <= n - m + 1; j++) {
bool valid = true;
for (int k = 0; k < m; k++) {
if (NumsFromF[j + k] != i + k) {
valid = false;
break;
}
}
if (valid) {
for (int k = 0; k < m; k++) {
cout << WordsFromF[j + k] << CardsNumsFromF[j + k] << " ";
}
found = true;
break;
}
}
}
if (found) break;
}
if (!found) {
cout << "-1";
}
return 0;
}
I have made the following changes to the code:
- Fixed the logic for checking the straight and flush cases.
- Added a loop to find a valid set of cards B with a higher point value than cards A.
- Added a flag to indicate if a valid set of cards B is found.
- Handled the case when no valid set of cards B is found and output -1.
Please let me know if you have any further questions or concerns!
原文地址: http://www.cveoy.top/t/topic/bd9j 著作权归作者所有。请勿转载和采集!