结对

一、原型设计

https://ofqa2i.axshare.com

说明你所采用的原型开发工具(1分)
pigTail采用的原型开发工具是:axure,ps

图片结合内容展示:

原型由以下几个页面构成
结对

登入页面有输入账号密码,密码为掩码构成,此外细节较为丰富,拥有“记住我”,“忘记密码”,音乐,设置,提示功能
结对

输入正确账号密码后跳转到游戏模式选择界面
结对

若选择人机对战模式,则有不同难度的人机模式供用户选择
结对

若选择在线对战,则进入在线对战模块,该页面细节也较为丰富,有创建对局,加入对局等功能(在线对战原型设计确实走心了)
结对

加入房间页面提供了目前空闲的uuid,用户可以点击加入房间,也可以选择查找uuid,若uuid存在,则显示出房间供用户选择加入与否。
此外还有该原型界面加入了一些细节,如刷新信息,随机加入,回到主页等功能
结对
结对

玩家在选择模式后,即将进入房间对局页面,期间会有3秒的动画等待过渡,期间可以选择退出等待,释放对局
结对

结对

[2.2.2]遇到的困难及解决方法:(4分)

困难描述(1分)
python中变量和包名不能取相同的名字,不然寻找bug时候就会有多绝望可以体会
python中pygame框架自我感觉不适合写交互类游戏,没有很多ui小组件啊,绝望。
本次作业用到py中两个主要框架,pyqt5和pygame,由于一些文档显示和输入内容难以在pygame框架中展现,在作业的最后几天临时添加进pyqt框架,使得这两个框架显示的ui界面无法很好的交互,主要由于时间问题,这个问题还有待解决。

解决过程(2分)
慢慢coding,一段段代码测试过去,才知道问题所在。
关于pygame和pyqt这两个框架,毫无疑问,pygame适合用来写游戏,但是一些交互信息文档类的ui界面就难以用pygame了,于是在网上查找另一些pyUI框架。决定用pyqt进行与pygame整合优缺点了。

有何收获(1分)
熟练掌握了pygame工具,对python更加膜拜了,网络请求库资源方便利索,也掌握了几种适用的pyui框架。想转python了,毕竟python,及时行乐。
增强了团队之间的容错率,分工明确,默契配合。

二、原型设计实现

1、代码实现思路

(1)网络接口的使用:

我们将测试组的同学们提供的接口文档细致阅读后,对于游戏的基本接口信息交互有了充分认知后,设计了一个类用于对每种接口的核心信息做了分类,以及接口信息返回做了分类,具体如下、对于异常状况做了相应的异常处理、否则可能会出现由于少量的网络波动和非理想状况(如:玩家登陆失败、网络波动导致程序终止、因此必须考虑所有可能的返回参数)

接口简称 接口参数需求 可能的返回状况
登录连接 student_idpassword 登陆成功、登录失败(含网络超时)
登录连接 student_idpassword 登陆成功、登录失败(含网络超时)
加入对局 tokenuuid 加入成功、失败(对局不存在、无法加入(人满)、网络超时)
创建对局 token 创建成功、创建失败
获取上步信息 tokenuuid 获取成功、网络超时
执行玩家操作 tokenuuid 执行成功、失败
获取上步操作 tokenuuid 获取成功、失败
  • 为了确保对于所有状况的应对便于处理、我们对接口函数要求其返回整个返回信息字典、而非几个参数、举例来说、以获取上部操作为例、我们初步的做法是:
import requests
import json
def get_last(token, uuid):
    url = 'http://172.17.173.97:9000/api/game/' + uuid + '/last'
    header = {'Authorization': token, 'Content-Type': 'application/json'}
    r = requests.get(url, headers=header,timeout=5)
    user_dict = json.loads(r.text)
    # print(user_dict)
    return user_dict
  • 这样做的好处是显而易见的:get_last接口需要应对的返回结果很多、如果只使用 user_dict['data']['last_code'] 某次偶发性的网络波动导致user_dict['data']根本不存在、没能正确处理而导致了程序的异常终止是非常糟糕的。而坏处也很明显将庞大的返回信息的处理交给了后续的程序、也加重了工作量。

(2)代码组织与内部实现设计(类图)

(3)算法的关键与关键实现部分流程图

(4)重要的/有价值的代码片段

(5)性能分析与改进

(6)具体的改进的思路、

(7)性能分析图和程序中消耗最大的函数

(8)部分单元测试代码,说明测试的函数,构造测试数据的思路

  • 为了编写单元测试,需要引入了Python自带的unittest模块,这里以网络接口部分的单元测试为例。测试接口的具体步骤:
  1. 获得接口的 URL。
  2. 向接口发送请求。
  3. 检查响应的 HTTP 状态码、返回的数据等是否符合预期。
# filename="./tests/test_api.py
import unittest
from datetime import datetime
from django.core.cache import cache
from ..utils import Highlighter, UpdatedAtKeyBit
class PostViewSetTestCase(APITestCase):
    def test_list_post_create_game(self):
    def test_list_post_join_game(self):
    def test_list_post_getlast_game(self,token):
            '''
            :param token:
            :param uuid:
            :return:
            '''
            #这里以获取上步操作为例:本以为这个接口不会有太大的问题,因为很偶然的错误没能加入了一场已经人满的对局
            #在测试过程中才发现,没有考虑到人没齐的时候,返回的报文不存在last_code字段,看了错误堆栈才明白问题所在。
            url = 'http://172.17.173.97:9000/api/game/' + uuid + '/last'
            header = {'Authorization': token, 'Content-Type': 'application/json'}
            r = requests.get(url, headers=header)
            user_dict = json.loads(r.text)
            response = self.client.get(url, {"token": token, "uuid":uuid})
            self.assertEqual(response.status_code, status.HTTP_200_OK)
            #可能返回的有状态码"200"、"403"、"404"
            serializer = PostListSerializer(instance=[self.post2, self.post1], many=True)
            self.assertEqual(response.data["results"], serializer.data)
            result = field.to_representation(document)
            self.assertEqual(user_dict_result, expected)
            return user_dict_result
    def test_list_put_Do_card(self):
    def test_list_get_result(self):
    def test_list_get_list(self):

2、Github的代码签入记录

  • 这里向大家推荐一个蛮有意思的项目gitmoji,这看起来是一个很无厘头的项目,将表情包用于Github commmit 信息的签入。但而事实上,像在GitHub上优秀的许多项目一样、Github社区不但对于commit 提交信息有严格规范,对于commit信息中的表情包也有一样严格的要求。我们使用了社区比较常见的Angular:
  • 签入记录如下

3、遇到的代码模块异常或结对困难及解决方法。

  • 这里写在最前面、向我的队友致歉、由于自己命名的的过程中

4、队友评价

翁敏to伟煌
伟煌是队里的主力,我主要是给他端茶倒水,擦汗扇风,找找bug,写写边角料的代码和文字工作。队长虽然能力强,但是作风武断,不顾及我的感受把我原本用js写的web端猪尾巴程序给否定掉了(毕竟正经人谁用pygame写这种程序啊)。但是最后作业也绝大部分都做出来了,我也只能心怀感恩了。

5、此次结对作业的PSP和学习进度条(周更)

第N周 新增代码(行) 累计代码(行) 周学习耗时(小时) 累计学习耗时(小时) 重要成长与任务进展
1 506 506 15 15 学习了JS的初步知识、尝试修改自己的博客样式、测试了接口的通用性、学会了gitmoji、gitcommit规范
2 1006 1512 12 27 使用JS完成了基本的登陆界面、寻找了相关素材、对柯老师的感恩之情深入心府
3 200 1712 19 46 JS解决跨域问题纯前端方法太困难了、很痛苦地换了方案、开始学习python的pygame
4 1700 3412 10 66 pygame写完了最基本的人人对战,人机对战,基本的登陆逻辑、对柯老师课堂上的淳淳教导更加深有体会、后悔没有早点遇到这样的好老师
5 1000 4412 20 86 完成了通过手动输入uuid进行在线人人对战的代码、进行了部分网络测试

三、心得

1、戒骄戒躁

  • 很多事情应该有大局观、过渡的焦虑和紧张并不能促进

2、规划不够明确

  • 初期规划的时候选择了随大流的web端实现、因为
上一篇:资源管理注意事项 --- meta 文件


下一篇:分布式id