一、原型设计
说明你所采用的原型开发工具(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_id 、password
|
登陆成功、登录失败(含网络超时) |
登录连接 |
student_id 、password
|
登陆成功、登录失败(含网络超时) |
加入对局 |
token 、uuid
|
加入成功、失败(对局不存在、无法加入(人满)、网络超时) |
创建对局 | token |
创建成功、创建失败 |
获取上步信息 |
token 、uuid
|
获取成功、网络超时 |
执行玩家操作 |
token 、uuid
|
执行成功、失败 |
获取上步操作 |
token 、uuid
|
获取成功、失败 |
- 为了确保对于所有状况的应对便于处理、我们对接口函数要求其返回整个返回信息字典、而非几个参数、举例来说、以获取上部操作为例、我们初步的做法是:
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模块,这里以网络接口部分的单元测试为例。测试接口的具体步骤:
- 获得接口的 URL。
- 向接口发送请求。
- 检查响应的 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端实现、因为