C/C++ 斗地主

题目描述

        火箭:即双王(大王和小王)。炸弹:四张同数值牌。单牌:单个牌。对牌:数值相同的两张牌。三张牌:数值相同的三张牌。三带一:数值相同的三张牌 + 一张单牌或一对牌。例如: 333+6或444+99单顺:五张或更多的连续单牌(如:45678或78910JQK)。不包括2点和双王。双顺:三对或更多的连续对牌(如:334455)。不包括2点和双王。三顺:二个或更多的连续三张牌(如:333444)。不包括2点和双王。飞机带翅膀:三顺+同数量的单牌(或同数量的对牌)。如:444555+79 或333444555+7799JJ四带二:四张牌+两手牌(如:5555+3+8或4444+55+77)。 
给定n张牌,判断能不能一次出完。

输入

         第一行输入一个整数T(T <= 50),表示有几组数据。每组数据占一行,每一行的第一个数n(0 < n <= 20)表示这组测试数据有n张牌,接下来是n张牌。 
(总共有15张不同的牌:A 2 3 4 5 6 7 8 9 10 J Q K J1 J2, J1、J2代表大小王,其它相同的牌最多四张)

输出

     对于每组测试数据占一行,格式为:Case #a: Str,a是第几组数据,从1开始。如果能一次出完则Str 为Yes, 否则为No。

样例

C++写的基于MFC界面的斗地主小游戏源码,内含详细注释,附带了简单的AI出牌规则,放出来供大家参考交流。vs2010编写,vs2015测试可用,理论上vs05及以上都可正常编译运行。 void Judge::MainFlow() { switch(DataCenter::Instance().GetPlayState()) { case EM_LandHolderBorn_PlayState: { //先检查是否已经问完了 //遍历玩家检查是否已经询问过了,如果已经都问过了,则设置叫分最高的为地主 BOOL bAllAsked = TRUE;//是否已经询问完了 vector & vecPlayer = DataCenter::Instance().GetPlayerList(); for (UINT i = 0; i m_nCurHighstScore) { m_nCurHighstScore = vecPlayer[i].GetLandOwerScore(); m_pToBeLandOwer = &vecPlayer;[i]; } if (vecPlayer[i].GetLandOwerScore() SetLandOwer(TRUE); } //然后根据情况执行询问流程 //如果地主已经产生,则跳入下一阶段 if (NULL != DataCenter::Instance().GetLandOwner()) { m_pCurPlayer = NULL; DataCenter::Instance().SetPlayState(EM_WaitPlayer_PlayState); MainFlow(); return; } //如果当前player为空,设置当前player为地主牌得主 if (m_pCurPlayer == NULL) { m_pCurPlayer = DataCenter::Instance().GetLandOwnerCardHolder(); } //对当前玩家执行地主问询 ASSERT(m_pCurPlayer); m_pCurPlayer->ExcuteCallLandOwer(); } break; case EM_WaitPlayer_PlayState: { //如果游戏已经结束,则执行结束逻辑 BOOL bLandOwerWin = FALSE; if (DataCenter::Instance().IsOver(bLandOwerWin)) { if (bLandOwerWin) { AfxMessageBox(_T("地主赢了!")); } else { AfxMessageBox(_T("佃户赢了!")); } DataCenter::Instance().SetPlayState(EM_WaitToStart_PlayState); //将所有玩家明牌 DataCenter::Instance().ShowAllPlayerCard(); RefreshView(); return; } //如果是出牌阶段而当前player为空,设置当前player为地主,并发予底牌 if (m_pCurPlayer == NULL) { m_pCurPlayer = DataCenter::Instance().GetLandOwner(); DataCenter::Instance().SendOutBottomCard(); RefreshView(); } ASSERT(m_pCurPlayer); m_pCurPlayer->ExcuteCallCardPlay(); } break; } } void Judge::CurPlayerCallScore(int nScore) { if (m_pCurPlayer == NULL) { ASSERT(FALSE); return; } //将玩家选择的分数设置给玩家 m_pCurPlayer->SetLandOwerScore(nScore); //如果当前玩家为空,直接返回 if(m_pCurPlayer == NULL) { return; } if (nScore == 3) { //如果玩家叫了三分,直接设为地主 m_pCurPlayer->SetLandOwer(TRUE); } else { //玩家叫的不是三分,则记下玩家叫的分数 m_pCurPlayer->SetLandOwerScore(nScore); } if (nScore == 0) { CString strWord; strWord.Format(_T("不叫")); m_pCurPlayer->Say(strWord); } else { CString strWord; strWord.Format(_T("%d分"), nScore); m_pCurPlayer->Say(strWord); } //玩家叫分后隐藏叫地主按钮 Judge::Instance().ShowCallLandOwerBtn(FALSE); //切换到下一个玩家,流程继续 SwitchToNextPlayer(); MainFlow(); }
Sure! Here's a simple implementation of a console-based "Landlord" game in C++: ```cpp #include <iostream> #include <vector> #include <algorithm> // Function to print the cards in a player's hand void printHand(const std::vector<int>& hand) { for (int card : hand) { std::cout << card << " "; } std::cout << std::endl; } int main() { // Create a deck of cards std::vector<int> deck; for (int i = 3; i <= 15; i++) { deck.push_back(i); } // Shuffle the deck std::random_shuffle(deck.begin(), deck.end()); // Distribute the cards to three players std::vector<int> player1, player2, player3; for (int i = 0; i < 51; i += 3) { player1.push_back(deck[i]); player2.push_back(deck[i + 1]); player3.push_back(deck[i + 2]); } // Sort the cards in each player's hand std::sort(player1.begin(), player1.end()); std::sort(player2.begin(), player2.end()); std::sort(player3.begin(), player3.end()); // Print each player's hand std::cout << "Player 1: "; printHand(player1); std::cout << "Player 2: "; printHand(player2); std::cout << "Player 3: "; printHand(player3); return 0; } ``` This code represents a simplified version of the "Landlord" game. It generates a deck of cards from 3 to 15 (where 11 represents Jack, 12 represents Queen, 13 represents King, 14 represents Ace, and 15 represents 2). The deck is then shuffled and distributed to three players. Finally, the cards in each player's hand are sorted and printed on the console. Please note that this implementation doesn't include the game logic for playing rounds or determining the winner. It only demonstrates the initial distribution of cards.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值