C++项目之斗地主

这是一款纸牌休闲类型的游戏,
采用C++语言开发,
实现了纸牌(斗地主)的基本功能,
综合了音乐,动画,美术等多种艺术表达形式。


游戏的实现框架:
CObject                 图片父类
CImageFile           图片类(CSprite精灵类)
CGUIEdit               文本框类
CardsBox             牌盒子类
CButton                按钮类
CUser                    电脑和玩家的父类
CPlayer                 玩家类
Computer             电脑类
CSceneManger   场景管理类
CGameApp           应用程序启动类

CObject类的实现:
//得到坐标
virtual void GetPosition(D3DXVECTOR3& vPos);
//设置坐标
virtual void  SetPosition(float x, float y);
//设置角度
virtual void SetRotationAngle(float fAngle);
//得到角度
virtual float GetRotationAngle(void);
//设置缩放系数
virtual void SetScaling(float x, float y);
//得到缩放系数
virtual D3DXVECTOR3 GetScaling();
//矩阵合成
virtual void ApplyMatrix(void);
//渲染
virtual void Render(void) = 0;

CCardsBox类的实现
// 洗牌
void Shuffle(void); 
//发牌
void SendCard(float timer);
//渲染
void Render(void);
//数据更新
void UpDate(float timer);
//设置发牌位置
void SetPosStep(int x, int y, int s);
//设置发牌速度
void SetSendSpeed(floatSendSpeed);
//回收站  记牌器
void RecyleAdd(Card* Temp);
//消息处理
void HandleMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

CUser(玩家)类
//数据更新
void Update(float timer);
//渲染
void Render(void);
//得到出牌的位置
D3DXVECTOR3 GetAppendPos();
//添加地主牌
void AppendCard(Card* pCardTemp);
//初始化玩家的位置,上家,下家,判断是否出牌
void Init(USERPOS UserPos,CCUser *pUp,CCUser *pDown,bool IsBright);
//将全部的牌打出
void OutPutCard(void);
//清除出了的牌
void ClearVOut(void);
//设置玩家生命值(金钱)
void SetMoney(UINT Money);
//得到金钱
UINT GetMoney();
//得到下家出的牌
CCUser* GetpDown(void);
 //得到上家出的牌
 CCUser* GetpUp(void);
//给牌设置记号
void ReSetEven(void);
//得到全部牌的数量
 int GetOwnCardNum(void);
//得到出牌的数量
int GetOutCardNum(void);
//得到出牌类型
BRANDSTATUS GetCardType(void);
//设置玩家的状态
 void SetUserState(USERSTATE state);
//设置玩家IDSetUserId(USERIDENTITY UserId);
//检查牌是否能出
void Check(BRANDSTATUSbrandStatus,vector<Card*> brand,bool IsLimit);











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(); }
C++课程设计斗地主》是一门将理论知识与实践技能紧密结合的计算机科学课程,旨在通过游戏开发项目深入理解并应用C++编程语言及相关的软件工程原理、算法设计等知识。 ### 开发过程概述: #### 1. 游戏规则理解和设计 首先,需要详细了解“斗地主游戏的基本规则,包括出牌顺序、胜利条件、特殊牌型等等。这个阶段往往涉及到对博弈论的理解,以及如何将复杂的规则转化为可编程的形式。 #### 2. 架构设计 接下来,进行游戏架构的设计。这包括选择合适的数据结构来存储玩家信息、牌堆、桌面状态等,并确定程序模块之间的交互方式。通常会采用面向对象的设计思想,如创建Player、Deck、Table、Game等类。 #### 3. 实现核心功能 这部分工作着重于实现游戏的核心机制,比如洗牌、发牌、判胜、计分等操作。需要关注的是效率和用户体验,例如快速高效的洗牌算法、流畅的游戏界面等。 #### 4. AI对手实现 为了让游戏更有挑战性和趣味性,可以加入人工智能角色作为对手。这涉及策略规划、决策树构建、甚至深度学习等技术,使得AI能够做出合理的出牌决策。 #### 5. 用户界面与交互设计 良好的用户界面能显著提升用户的体验感。因此,需要设计直观易用的操作界面,包括但不限于按钮布局、提示信息展示、结果反馈等元素。 #### 6. 测试与调试 完成编码后,进行充分的测试,包括单元测试、集成测试、压力测试等,确保程序的稳定性和性能。同时,修复发现的所有错误和异常情况。 #### 7. 文档编写与版本控制 编写详细的开发文档,记录项目的流程、关键决策、遇到的问题解决方案等,便于后期维护和团队协作。使用版本控制系统,如Git,管理代码库,确保代码历史清晰,方便回溯和多人协同开发。 ### 结果呈现: 最终,学生不仅能够独立完成一款完整的C++游戏项目,还能通过这个过程提升编程能力、解决问题的能力、团队合作能力和项目管理能力。此外,《C++课程设计斗地主》还能帮助学生熟悉软件开发生命周期各个阶段的工作内容和技巧,为将来从事更复杂的技术项目打下坚实基础。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值