基于cocos2d-x的斗地主游戏开发毕业设计内容摘要:

功能。 ( 6)网络通信 斗地主要实现联网打牌可通过 SOCKET 技术来实现服务器与客服端的通信,再借助多线程技术创建接受线程即可多接受的数据进行处理,从而转发给其他玩家,打到玩家间互相通信的效果。 ( 7) 人工智能 首先,电脑本身是不会出牌的,但是我们可给电脑玩家设计出一套出牌及跟牌的优先级,再结合地主与农 民身份的区别做一些特殊处理,即可实现简单的人工智能。 2 相关技术背景 Cocos2dx 简介 Cocos2Dx 中“ x”包含两个意思 :一方面是 C++ 的文件扩展 CXX,“ X”表示该项目是由 C++ 编写的 ;另一方面意味着交叉,这个开源项目的目标是让用户创建跨平台的代码。 Cocos2Dx 是用 C++ 重写的 Cocos2D 框架,因为Android 和 iOS 均支持 C++。 因为 Cocos2Dx 具有跨平台的特点,再加上 Cocos2D 全球社区的支持, Cocos2D 框架 简单易学、十分容易快速上手。 因此 Cocos2Dx 迅速成为开发者的首选。 经过一段时间的发展,众多开发者使用 Cocos2Dx 开发出了多款游戏,包括捕鱼达人、地铁总动员等 [3]。 2020 年年初, Cocos2Dx 团队再次开发出两个分支,分别是支持 Windows Phone 的 XNA 版和支持 HTML5 的 HTML5 版(后者还得到了 Google 公司的赞助)。 此外,在 Zygaena 的帮助下,还研发出绑定 JavaScript 的 Cocos2Dx 版本。 随着 Cocos2D 及其分支的发展,其会有更多跨平台特性,从而可以支持桂林 电子科技大学毕业设计(论文)报告用纸 第 5 页 共 49 页 更多的平台,这会提高开发者的开发效率。 相信 Cocos2Dx 将会更加受到广大开发者的欢迎, Cocos2Dx 引擎也可以扩大其影响,成为全平台的二维游戏引擎。 Cocos2Dx 继承了 Cocos2D 的全部特点,包括如下内容: ( 1) 流程控制:非常容易地管理不同场景之间的流程控制。 ( 2) 精灵:快速而方便的精灵。 ( 3) 动作:可组合精灵的动作(如移动、旋转和缩放等),使精灵动起来。 ( 4) 特效:包括波浪、旋转和透镜等特性。 ( 5) 平 面地图:支持平面地图和 45 度角地图。 ( 6) 转换:从一个场景移动到另外一个不同的场景。 ( 7) 菜单:创建内部菜单,包括主菜单和游戏菜单。 ( 8) 文本渲染:支持文本渲染标签。 ( 9) 文档:包括编程指南、 API 参考、视频教学和很多简单的测试例子。 ( 10) BSD 许可 : BSD( Berkelyan Software Distribution,伯克利软件套件)开源协议给予使用者很大的自由。 使用者可以自由使用、修改源代码,也可以将修改后的代码作为开源或者专有软件再次发布。 ( 11) 基于 OpenGL:支持硬件 加速。 数据结构及算法 对于一款像斗地主这样的纸牌游戏,需要对牌进行一些判定及分类,那么一种好的数据结构来存储这些牌数据是至关重要的。 ( 1) 顺序容器 vector Vector 是一种顺序容器,跟数组类似,可以将其称为动态数据 [4]。 选这种容器来存储牌数据有很多好处,我们可以利用其自带的一些方法来实现对数据的增删查改,如 push_back(), erase()等。 ( 2) 关联容器 map Map 是键 — 值对的集合, map 类型通常可以理解为关联容器:可使用其下标来获取一个值,正如内置数组类型一样。 而关联的本质 在于元素的值与某个特定的键相关联,而非通过元素在数组中的位置来获取 [4]。 当向 map容器里添加元素或访问元素时,如果元素不存在则会自动添加元素,这样我们在统计同样牌值牌的时候,可以利用 map 容器对牌的张数进行统计,进而找出牌的类型。 在设计一些判断牌的类型,找出牌的类型算法时,我们可以借助容器一些泛型算法对数据进行一些增删查改,像 map容器可以对数据进行分类、统计信息等。 桂林 电子科技大学毕业设计(论文)报告用纸 第 6 页 共 49 页 SOCKET 及多线程编程 SOCKET 编程 sockets(套接字)编程有三种,流式套接字( SOCK_STREAM),数据报套接字( SOCK_DGRAM),原始套接字( SOCK_RAW)。 基于 TCP 的 socket 编程是采用的流式套接字 [5]。 【 实现步骤 】 ( 1) 服务器端编程的步骤: ①加载套接字库,创建套接字 (WSAStartup()/socket()); ②绑定套接字到一个 IP 地址和一个端口上 (bind()); ③将套接字设置为监听模式等待连接请求 (listen()); ④请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept()); ⑤用返回的套接字和客户端进行通信 (send()/recv()); ⑥返回,等待另一连接请求; ⑦关闭套接字,关闭加载的套接字库 (closesocket()/WSACleanup())。 ( 2) 客户端编程的步骤: ①加载套接字库,创建套接字 (WSAStartup()/socket()); ②向服务器发出连接请求 (connect()); ③和服务器端进行通信 (send()/recv()); ④关闭套接字,关闭加载的套接字库 (closesocket()/WSACleanup())。 ( 3) Socket 编程通用步骤(模板): 第 1 步 加载 /释放 Winsock 库 : 加载方法 : WSADATA wsa。 /*初始化 socket 资源 */ if (WSAStartup(MAKEWORD(1,1),amp。 wsa) != 0) { return。 //代表失败 } 释放方法 : WSACleanup()。 第 2 步 构造 SOCKET: 桂林 电子科技大学毕业设计(论文)报告用纸 第 7 页 共 49 页 服务端 :构造监听 SOCKET,流式 SOCKET. SOCKET Listen_Sock = socket(AF_INET, SOCK_STREAM, 0) 客户端 :构造通讯 SOCKET,流式 SOCKET. SOCKET Client_Sock = socket(AF_INET, SOCK_STREAM, 0) 第 3 步 配置监听地址和端口 : 服务端 : SOCKADDR_IN serverAddr ZeroMemory((char *)amp。 serverAddr,sizeof(serverAddr))。 = AF_INET。 = htons(1234)。 /*本地监听端口 :1234*/ = htonl(INADDR_ANY)。 /*有 IP*/ 第 4 步 绑定 SOCKET: 服务端 :绑定监听 SOCKET. bind(Listen_Sock,(struct sockaddr *)amp。 serverAddr,sizeof(serverAddr)) 第 5 步 服务端 /客户端连接 : 服务端 :等待客户端接入 . SOCKET Command_Sock = accept(Listen_Sock, ...) 客户端 :请求与服务端连接 . int ret = connect(Client_Sock, ...) 第 6 步 收 /发数据 : 服务端 :等待客户端接入 .char buf[1024]. 接收数据 :recv(Command_Sock,buf, ...) 或 发送数据 :send(Command_Sock,buf, ...) 客户端 :请求与服务端连接 .char buf[1024]. 发送数据 :send(Client_Sock,buf, ...) 或 接收数据 :recv(Client_Sock,buf, ...) 第 7 步 关闭 SOCKET: 服务端 :关闭 SOCKET. closesocket(Listen_Sock) closesocket(Command_Sock) 客户端 :关闭 SOCKET. closesocket(Client_Sock) 桂林 电子科技大学毕业设计(论文)报告用纸 第 8 页 共 49 页 多线程编程 【多线程编程的步骤】 ( 1) 编写线程函数 所有线程必须从一个指定的函 数开始执行,该函数称为线程函数,它必须具有下列原型: DWORD WINAPI YourThreadFunc(LPVOID lpvThreadParm)。 该函数输入一个 LPVOID 型的参数,可以是一个 DWORD 型的整数, 也可以是一个指向一个缓冲区的指针, 返回一个 DWORD 型的值。 象 WinMain 函数一样,这个函数并不由操作系统调用, 操作系统调用包含在 中的非 C运行时的一个内部函数,如 StartOfThread,然后由 StartOfThread 函数建立起一个异常处理框架后,调用我们的函数 [6]。 以下代码为两个线程函数: void FunCount(PVOID arg) { while(1) { printf(funcout is executing.....\n)。 Sleep(10000)。 } } void Function1(PVOID arg) { while(1) { printf(function1 is executing.....\n)。 Sleep(20200)。 } } ( 2) 创建一个线程 一个进程的主线程是由操作系统自动生成,如果你要让一个主线程创建额外的线程,你可以调用来 CreateThread 完成。 HANDLECreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD cbstack, LPTHREAD_START_ROUTINE lpStartAddr, LPVOID lpvThreadParm, DWORDfdw Create, LPDWORDlpID Thread)。 桂林 电子科技大学毕业设计(论文)报告用纸 第 9 页 共 49 页 其中 lpsa 参数为一个指向 SECURITY_ATTRIBUTES 结构的指针。 如果想让对象为缺省安全属性的话,可以传一个 NULL,如果想让任一个子进程都可继承一个该线程对象句柄,必须指定一个 SECURITY_ATTRIBUTES 结构,其中bInheritHandle 成员初始化为 TRUE。 参数 cbstack 表示线 程为自己所用堆栈分配的地址空间大小, 0 表示采用系统缺省值 [6]。 参数 lpStartAddr 用来表示新线程开始执行时代码所在函数的地址,即为线程函数。 lpvThreadParm 为传入线程函数的参数, fdwCreate 参数指定控制线程创建的附加标志,可以取两种值。 如果该参数为 0,线程就会立即开始执行,如果该参数为 CREATE_SUSPENDED,则系统产生线程后,初始化 CPU,登记 CONTEXT结构的成员,准备好执行该线程函数中的第一条指令,但并不马上执行,而是挂起该线程。 最后一个参数 lpIDThread 是一个 DWORD 类型地址,返回赋给该新线程的 ID 值 [6]。 此外,还可以使用 _beginthread 等函数来创建线程。 handle=(HANDLE)_beginthread(FunCount,0, NULL)。 handle1=(HANDLE)_beginthread(Function1,0,NULL)。 记得要把 头文件 include 进来哦。 ( 3) 终止线程 如果某线程调用了 ExitThread 函数,就可以终止自己。 VOIDExitThread(UINTfuExitCode )。 这个函数为调用该函数的线程设置了退出码 fuExitCode 后, 就终止该线程。 调用 TerminateThread 函数亦可终止线程。 BOOLTerminateThread(HANDLE hThread,DWORDdwExitCode)。 该函数用来结束由 hThread 参数指定的线程, 并把 dwExitCode 设成该线程的退出码。 当某个线程不在响应时,我们可以用其他线程调用该函数来终止这个不响应的线程。 3 开发环境的配置 开发环境的配置 所谓“工欲善其事,必先利其器”。 学习 Cocos2Dx 的开发技巧,首先从搭建跨平台的开发环境开始。 目前, Cocos2Dx 以上版本支持 Win3 Android、iOS 三个平台的开发,接下来将分别介绍在这三个环境下的开发环境搭建。 一个完整的开发环境包括开发、编译、链接、运行和调试等几部分,所以需要相应的桂林 电子科技大学毕业设计(论文)报告用纸 第 10 页。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。