基于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 页。基于cocos2d-x的斗地主游戏开发毕业设计
相关推荐
筑结构 安全等级为二级 ,使用年限为 50 年,抗震设防烈度为 7 度。 该工程长度为 ,不需要设置伸缩缝, 不必设置后浇带。 施工缝可留于房屋中部,折线型 , 按两个施工段进行施工。 因为 是 坡屋顶,所以 工程量计算较复杂。 二、本课题的基本任务、拟解决的主要问题,及其实现途径、方法和手段 本课题的 基本任务: 根据给定的建筑施工图、结构施工图, 完成工程量计算 ; 根据给定的施工条件
比例和尺度,运用节奏韵律、虚实对比等规律,设计出体型完整,形式与内容统一的建筑立面。 完整的立面设计,并不只是美观问题,它和平面、剖面的设计一样,同样也有使用要青岛工学院毕业设计 8 求,结构构造等功能的技术方面的问题。 立面处理的方法有以下几种: 立面造型 立面设计着重考虑建筑物的体量大小、体型组合、立面及细部处理等。 在满足使用功能和经济合理的前提下,运用不同的材料、结构形式、装饰细部、构
min =- 178 N/mm2 m i nm a x 178 0 . 9 6 7 0184 b/t=160/3= = 9 8k =+ + = 上翼缘 max =184N/mm2 min =- 175 N/mm2 m inm a x184 0 .9 5 1175 b/t=70/3= =- = 21 =
码。 货位编码好比货物的地址,货物编号好比姓名一样。 每一种物品都有一个对应的地址和姓名,当存取时才能迅速而准确地进行工作。 本系统用地址式的编码方法。 即利用储区中的现成参考单位,如建筑物第几栋、区段、排、行、层、格等。 按相关顺序编码。 这是物流中心使用较普遍的编码方法。 2. 货位管理 1) 货位分配原则 对货位进行管理,是要合理的分配 和使用货位。 即考虑如何提高货位的利用律
成国际高速公路网。 总之当今世界公路基础设施的发展趋势是,发达国家以完善、维护和提高现有路网和通行能力为主,发展中国家则是普及和提高相结合,在增加公路通车里程的同时,大力提高干线公路的技术水平。 国内:作为发展中国家的中国, 公路基础建设取得历史性突破。 新世纪以来的几年,无疑是我国公路运输发展最快最好的时期。 2020年,我国公路投资高达 亿元,比 2020 年增加 亿元,同比增长 %。