基于mfc的对战象棋设计与实现毕业设计(编辑修改稿)内容摘要:
止。 1) 可以采用鼠标操作进行 对弈; 2) 可以实现走棋 、悔棋、还原 、认输 功能 ; 3) 可以满足两人 局域网内 对弈; 4) 可以在任意时间重新开始游戏; 5) 可以进行简单错误判断,并直接返回到前一步棋子状态; 6) 可以进行背景棋盘和棋子种类的变换; 7) 可以实现自由设置棋谱(怪棋); 8) 可以实现棋子黏在鼠标上移动,增加美感 淮阴师范学院毕业论文(设计) 10 软件信息 1) 软件名称:基于 MFC 的局域网内对战象棋设计与实现 2) 开发平台: Microsoft Visual C++ 3) 用户:象棋爱好者 4) 本设计 在各个方面均具有可行性,方便易用,无需安装即可使用 流程图 ( 1) 游戏交互图 ,如 图 21所示 图 21 游戏交互图 ( 2)程序流程图 首先,选择是否建立主机,否则为客户机。 若建立主机 ,则建立一个端口,用于和客户机的交互连接,然后等待知道有客户机连上。 客户机建立,则选择主机的 ip 地址和端口。 游戏双方先后点击开始,开始游戏。 红方、黑方在到自己状态时,可以移动自己的棋子 ,悔棋,还原,认输等等。 走棋, 点击鼠标左键选中棋子,移动,放到想到达的地方,系统调用 CanGoTo 函数,判断是否可到,若可到,则棋子放到目的地,否则返回棋子原来的地方能够。 走棋成功后,发送消息给对方,对方接收消息后,进行相应的操作。 进行若干步之后,若帅或者将被吃掉,则判定胜负。 具体流程 , 见图 22程序流程图。 游戏界面 网络 游戏内核 淮阴师范学院毕业论文(设计) 11 图 22 程序流程图 开始 结束 等待直到收到消息 调用 FetchMsg 处理相应的信息 如 果帅编号属性不是帅 等待直到收到消息 调用 FetchMsg 处理相应的信息 如果将编号属性不是将 Y 输入主机 IP 地址 和端口号 N m_State=1 建立主机 建立端口 m_State=0 走棋 ,悔棋 ,还原 操作 SendMsg 相应消息 Y N Y (m_State+1)%2 Y Y N N N 淮阴师范学院毕业论文(设计) 12 3 程序详细设计说明 界面设计 本程序界面简单明了,包括棋盘显示, listbox,开始、悔棋、还原、认输四个按钮,还有用于聊天的 edit 和发送按钮。 菜单栏包括文件,控制 ,背景,帮助。 其中 listbox 是记录每步棋子走棋 的信息 和聊天信息 ,也是实现悔棋功能的一个重要存储器。 它是一个栈,可以记录,删除,提取每步棋子的信息。 悔棋操作可以从 中得到相应的数据来实现悔棋功能。 文件内有新游戏、摆棋操作,控制内有悔棋、还原、认输操作,背景内有棋盘和棋子的切换操作。 主界面,如图 31所示 图 31 主界面 淮阴师范学院毕业论文(设计) 13 棋盘、棋子的位图载入与切换 ( 1) 棋盘、棋子的位图载入 本设计 实现了棋盘和棋子的自由无限制转换,采用了外部图片载入的方式,加载的位图,棋盘棋子一起加载,没有自己繁琐的自绘棋盘棋子过程。 本 设计 有 6 种棋盘, 3 种棋子可以搭配。 若程序在开始时就全部加载,会浪费大量内存,因为游戏过程中只需要一副棋盘棋子,且不利于更多棋盘和棋子种类的更新,也 不利于后期维护。 故本程序采用外部图片载入的方式,载入棋盘棋子,每次切换调用SetBoardandPiece(CString strBoard , CString strPiece)重新对棋盘棋子的位图进行赋值。 strBoard, strPiece 代表棋盘, 棋子 的存放文件夹相对物理地址。 HBITMAP CChess_mView::LoadFileBmp(CString filePath) { Return(HBITMAP)LoadImage(AfxGetInstanceHandle(),filePath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE)。 } void CChess_mView::SetBoardandPiece(CString strBoard, CString strPiece ) { //0 红兵 1 红袍 2红车 3 红马 4红相 5红士 6 红帅 7黑兵 8 黑袍 9黑车 10黑马 11 黑象 12黑士 13 黑将 大于 13 不是棋子 ChessList[13] = LoadFileBmp(strPiece + )。 ChessList[12] = LoadFileBmp(strPiece + )。 ChessList[11] = LoadFileBmp(strPiece + )。 ChessList[10] = LoadFileBmp(strPiece + )。 ChessList[9] = LoadFileBmp(strPiece + )。 ChessList[8] = LoadFileBmp(strPiece + )。 ChessList[7] = LoadFileBmp(strPiece + )。 ChessList[6] = LoadFileBmp(strPiece + )。 ChessList[5] = LoadFileBmp(strPiece + )。 ChessList[4] = LoadFileBmp(strPiece + )。 ChessList[3] = LoadFileBmp(strPiece + )。 ChessList[2] = LoadFileBmp(strPiece + )。 ChessList[1] = LoadFileBmp(strPiece + )。 ChessList[0] = LoadFileBmp(strPiece + )。 ChessList[14] = LoadFileBmp(strPiece + )。 //光标位图 ChessList[15] = LoadFileBmp(strBoard)。 ChessList[16] = LoadFileBmp(strPiece + )。 //用于遮罩技术(见关键技术) } ( 2) 棋盘、棋子的 切换 当点击菜单栏背景的棋盘或者 棋子,可以选择不同的 棋盘和棋子。 减少玩家的 视觉审美疲劳。 每按一个按钮,其实是改变了存放棋盘或棋子的函数 SetBoardandPiece(CString 淮阴师范学院毕业论文(设计) 14 strBoard , CString strPiece)中的 strBoard 或 strPiece,即棋谱棋子的存放文件夹相对物理地址 ,完成了棋盘棋子的种类切换,并用 Invalidate(FALSE)及时更新显示。 例如点击棋盘的水滴 棋盘 void CChess_mView::OnDrop() { m_strBoard = res\\images\\。 SetBoardandPiece(res\\images\\,m_strPiece)。 Invalidate(FALSE)。 } 运行图 ,如图 31 所示 : 图 32 棋盘、棋子的 切换 光标生成 双方局域网内对战,消息传递过来,执行操作了,但是我 不 能马上知道对方动了哪个棋子 ;可能已经动了,但是我不知道,浪费时间。 光标的生 成 ,可以起到提醒对方我已经走过棋了, 也利于在我方还没有出招之前始终知道对方的上一步是怎么走的,只有在我方出招之后对方的操作痕迹才可能被销毁,这样的设计增强了棋谱的可读性,也减轻了玩家的记忆负担。 光标在棋盘载入的时候就一起载入了 ChessList[14] = LoadFileBmp(strPiece + )。 在选中棋子时,即鼠标左键按下后,鼠标 move 的时候就把光标位图贴到选中子的周围,鼠标 up再把位图贴到 up 的位置上。 具体代码见鼠标的消息处理函数, OnLButtonDown(), OnMouseMove(), OnLButtonUp() 运行结果,如图 32所示 : 图 33 光标生成 淮阴师范学院毕业论文(设计) 15 数据结构 本设计 主要包含 CChess, CChess_mView, Cmanager, CNet, CNetControl 四个类。 CNet, CNetControl 两个类用于网络部分,后面网络功能部分再详解。 ( 1) CChess 类是棋子类,存储了棋子的相关属性信息。 class CChess { public: int type。 //0 红兵 1 红袍 2 红车 3 红马 4 红相 5 红士 6 红帅 7 黑兵 8 黑袍 9 黑车10 黑马 11 黑象 12 黑士 13 黑将 大于 13 不是棋子 CString name。 int x。 int y。 }。 Type 即棋子的类别用于判定属于哪种棋子。 name 棋子的名字,例如“炮”。 x, y 是棋子在逻辑坐标轴上的坐标。 ( 2) Cmanager 类是棋子控制类 ,是游戏内核。 class CManager { public: CChess nChessinfo[32]。 //记录 32 个棋子的信息 int map[9][10]。 //记录棋盘上的信息 int PlayerAc。 //用来判 断是哪个棋手 void InitData()。 //数据初始化 int m_State。 // 游戏状态 游戏等待中 ,等待开始 0、游戏中 红方走棋 游戏中 黑方走棋 int top。 //记录游戏步数 int Marry[500][8]。 //记录 前一个的标号 ,type,x,y 后一个的标号 ,type,x,y 共八个信息 int MarryTop。 //记录游戏步数,为了还原时能够判断 int count。 //记录 listbox 的步数 包括游戏步奏和聊天记录 public: 淮阴师范学院毕业论文(设计) 16 int Search(int x,int y)。 //找是第几颗棋子 共 32 颗( 0~31),若不存在棋子,返回 32 bool CanGoTo(int Old_Point_x,int Old_Point_y,int Now_Point_x,int Now_Point_y,int chesstype)。 //判断棋子能否到达,是每个棋子的走法判断 bool ShuaiCanGoTo(int Old_Point_x,int Old_Point_y,int Now_Point_x,int Now_Point_y,int chesstype)。 //是关于将帅问题的能否到达判断,将帅不共线 }。 ( 3) CChess_mView 类是程序的显示类,也包含少部分的棋子控制操作功能和很多消息响应函数,由于篇幅问题没有全部显示。 class CChess_mView : public CView { protected: CChess_mView()。 DECLARE_DYNCREATE(CChess_mView) // Attributes public: CChess_mDoc* GetDocument()。 CNetControl *m_pControl。 //网络控制显示 int choosed。 //记录前一个棋子是第几个棋子 int OldType。 //记录前一个棋子的类型 int OldX。 //记录前一个棋子的横坐标 int OldY。 //记录前一个棋子的纵坐标 ///用于右键功能 int Rchoosed。 //记录当前一个棋子是第几个棋子 int ROldX。 //记录前一个棋子的横坐标 int ROldY。 //记录前一个棋子的纵坐标 //变量定义 HBITMAP ChessList[17]。 //位图数组 CString m_strPiece。 //棋子根目录 CString m_strBoard。 //棋盘根目录 int m_nBoardIndex,m_nPieceIndex。 //背景设置选择 //定义画图用 CDC CDC Background。 //背景句柄 淮阴师范学院毕业论文(设计) 17 CDC ChessAll。 //最终刷新句柄 CDC Buffer。 //缓冲句柄 用于双缓冲 CListBox m_listbox。 //用于 记录每步棋子走棋 的信息 和聊天信 息 CButton m_ok。 //开始按钮 CButton m_goback。 //悔棋按钮 CButton m_huanyuan。 //还原按钮 CButton m_renshu。 //认输按钮 CButton m_send。 //聊天发送 按钮 CEdit m_edit。 //用于聊天的 edit int down_move。 //用于鼠标按下时的控制 int move_up。 //用于鼠标弹上时的控制。基于mfc的对战象棋设计与实现毕业设计(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。