(包括任务书计划、已完成的计划、已解决的困难、解决不了困难、指导教师的态度)
任务书计划:
(1)入口程序及全局变量:程序的入口函数WinMain,还有定义一些结构体和全局变量,主要功能是程序循环和结束条件的判断及保存一些全局使用的变量。
(2)创建窗口类:对windows创建窗口的API进行简单的封装,实现程序基本窗口的创建。
(3)网络通信类:对Socket发送UDP广播消息]6[、接收UDP广播消息、发送TCP消息]7[、接收TCP消息进行简单的封装;实现局域网中的数据交换。
(4)大厅窗口消息处理类:主要是大厅界面的实现,还有根据用户在大厅的不同操作启动相应的线程。
(5)游戏窗口消息处理类:主要是游戏界面的实现,还有根据用户的不同操作做出不同的响应。
(6)线程处理类:线程处理函数都集中在这里,可以根据不同功能,在启动线程时,调用不同的线程处理函数。
(7)游戏逻辑处理类:包含了棋子的定位,棋子能否启动的判断,棋子命中,选中与取消棋子的判断等相关功能的处理。
(8)服务端网络消息处理类:处理从客户端接收到的消息,主要功能是判断吃子逻辑,并根据不同的结果返回不同的消息。
(9)客户端网络消息处理类:处理从服务端接收到的消息,主要功能是根据吃子结果,对棋盘进行相应的处理。
已解决的困难:
(1)关于消息收不到这个问题,我猜测可能是因为两次消息发送的间隔太短,所以才会出现没有发送出去的情况。解决方法是在每次发送消息前Sleep一下。果然,这样子问题就解决了。
(2)线程一直阻塞,可以确定是因为recv和send两个函数都是阻塞函数,导致了线程被阻塞。这里用的解决方法是使用select模型。Select模型可以判断Socket是否可读写,如果可读写的话,再用recv或send去读写消息,这样从理论上来讲,recv和send因有数据可读写,是不会阻塞住的,这样问题就解决了。
(3)服务器关闭后,客户机还是保存着这个不存在的服务器,这个问题刚开始想了很久,不知道怎么解决,最后发现原来是那么简单,只要在服务器关闭的时候发送一条广播消息,告诉所有客户机,此服务器已关闭,客户机再将其从map中删除就可以。
解决不了的困难:
(1)局域网中有多个服务器时,如何查找并区分出来。
(2)客户端程序负责处理游戏的显示和操作界面,客户端具有简单的逻辑处理功能,同时负责接收发送与服务器端交互的数据包。
(3)服务器程序负责处理服务器端逻辑、游戏逻辑以及客户端之间的网络信息传递,同时服务器端还要承担客户端数据的接收、转发工作。
指导教师态度:
非常好。 |