结对同学博客链接
本作业博客链接
Github项目地址
UI视频演示
具体分工
- 王玥:前端(UI)和部分博客
- 马丽华:算法(AI)和部分博客
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 2770 | 3710 |
Development | 开发 | 180 | 180 |
· Analysis | · 需求分析 (包括学习新技术) | 600 | 840 |
· Design Spec | · 生成设计文档 | 30 | 0 |
· Design Review | · 设计复审 | 10 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 10 |
· Design | · 具体设计 | 60 | 60 |
· Coding | · 具体编码 | 1500 | 2100 |
· Code Review | · 代码复审 | 180 | 160 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 180 |
Reporting | 报告 | 0 | 0 |
· Test Repor | · 测试报告 | 0 | 0 |
· Size Measurement | · 计算工作量 | 30 | 0 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
· 合计 | 2770 | 3710 |
解题思路描述与设计实现说明
- 网络接口的使用
前端
后端
url = 'https://api.shisanshui.rtxux.xyz/auth/login'
data = {
"username": "031702504",
"password": "123"
}
r = requests.post(url,json=data)
print(r)
result1 = r.json()
print(result1)
token = result1['data']['token']
headers = {'x-auth-token': token}
url2='https://api.shisanshui.rtxux.xyz/game/open'
r2=requests.post(url2, headers=headers)
result2=r2.json()
print(result2)
id = str(result2["data"]["id"])
print(id)
data = {
"id": id,
"card": finalCardstr
}
print(data)
url3='https://api.shisanshui.rtxux.xyz/game/submit'
r3=requests.post(url3,json=data, headers=headers)
result3 = r3.json()
print(result3)
- 代码组织与内部实现设计(类图)
类名 | 函数名 | 功能 |
---|---|---|
Card | getValue_Qiandun(Cardlist=[]) | 获取前墩权值 |
- | getValue_Zhongdun(Cardlist=[]) | 获取中墩权值 |
- | getValue_houdun(Cardlist=[]) | 获取后墩权值 |
- | calculateSub(Cardlist1=[], Cardlist2=[]) | 差集运算 |
- | findBiggestCard(Cardslist=[]) | 找到最大牌值 |
- | getCardlist(json_data) | 获取牌 |
- | cardsCombination(Cardlist=[]) | 牌型的组合 |
- | judge(Cardlist=[]) | 判断牌型 |
- | compare(Cardlist1=[], Cardlist2=[]) | 比较大小 |
- 算法的关键与流程图
- 算法的关键在于怎样找出权值最大的牌型并放在合适的墩位
- 大致流程与总体框架
关键代码解释
- 部分代码
- 获取权值
def getValue_Houdun(Cardlist=[]):
value = 0 # 权值
flag = Judge(Cardlist)
if flag == 9:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Tonghuashun_Value_3[number]
elif flag == 8:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Zhadan_Value_3[number]
elif flag == 7:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Hulu_Value_3[number]
elif flag == 6:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Tonghua_Value_3[number]
elif flag == 5:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Shunzi_Value_3[number]
elif flag == 4:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Santiao_Value_3[number]
elif flag == 3:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Liandui_Value_3[number]
elif flag == 2:
Cardlist.sort()
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Erdui_Value_3[number]
elif flag == 1:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Duizi_Value_3[number]
else:
print("error")
return value
# 获取中墩牌的权值
def getValue_Zhongdun(Cardlist=[]):
value = 0 # 权值
flag = Judge(Cardlist)
if flag == 9:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Tonghuashun_Value_2[number]
elif flag == 8:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Zhadan_Value_2[number]
elif flag == 7:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Hulu_Value_2[number]
elif flag == 6:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Tonghua_Value_2[number]
elif flag == 5:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Shunzi_Value_2[number]
elif flag == 4:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Santiao_Value_2[number]
elif flag == 3:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Liandui_Value_2[number]
elif flag == 2:
Cardlist.sort()
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Erdui_Value_2[number]
elif flag == 1:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Duizi_Value_2[number]
elif flag == 0:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Sanpai_Value_2[number]
else:
print("error")
return value
def getValue_Qiandun(Cardlist=[]):
value = 0 # 权值
if len(Cardlist) == 1:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Sanpai_Value_1[number]
elif len(Cardlist) == 2:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Duizi_Value_1[number]
elif len(Cardlist) == 3:
temp_card = FindBiggestCard(Cardlist)
number = temp_card[0] - 2
value = Santiao_Value_1[number]
else:
print("error")
return value
- 注意"J"、"Q"、"K"、"A"的大小
性能分析与改进
改进思路
前端
- 一开始是各个页面都写一遍各个模块,后来发现有部分模块是重复的不需要写太多次,便把重复部分写入CSS文件,再将一些相关页面引入CSS文件从而起到模板的作用。
后端 - 如果后墩存在情况太多(如同花),就先找中墩的情况,然后回过来找剩余手牌中是否有比中墩大的后墩,可降低程序的循环消耗。
-判断牌型的时候把时间的因素也考虑进去,在追求正确结果的基础上,尽量简化代码,消除不必要的循环的部分,将代码向时间方向进行改进。
性能分析图与消耗最大的函数
- 消耗最大的函数是PostCards(data)
单元测试
部分单元测试代码
def cardsCombination(Cardlist=[]):
temp_Cardlist = list.copy(Cardlist)
AllCardsCombination = []
temp_list = Common.Tonghuashun(temp_Cardlist)
if temp_list != []:
for item in temp_list:
AllCardsCombination.append(item)
temp_list = Common.Zhadan(temp_Cardlist)
if temp_list != []:
for item in temp_list:
AllCardsCombination.append(item)
temp_list = Common.Hulu(temp_Cardlist)
if temp_list != []:
for item in temp_list:
AllCardsCombination.append(item)
temp_list = Common.Tonghua(temp_Cardlist)
if temp_list != []:
for item in temp_list:
AllCardsCombination.append(item)
temp_list = Common.Shunzi(temp_Cardlist)
if temp_list != []:
for item in temp_list:
AllCardsCombination.append(item)
temp_list = Common.Santiao(temp_Cardlist)
if temp_list != []:
for item in temp_list:
AllCardsCombination.append(item)
temp_list = Common.Liandui(temp_Cardlist)
if temp_list != []:
for item in temp_list:
AllCardsCombination.append(item)
temp_list = Common.Erdui(temp_Cardlist)
if temp_list != []:
for item in temp_list:
AllCardsCombination.append(item)
temp_list = Common.Duizi(temp_Cardlist)
if temp_list != []:
for item in temp_list:
AllCardsCombination.append(item)
return AllCardsCombination
- 对牌进行组合
def CalculateSub(Cardlist1=[], Cardlist2=[]):
chaji = list.copy(Cardlist1) # 最后要返回的差集
for item in Cardlist2:
if item in Cardlist1:
chaji.remove(item)
else:
print(item)
print("error in fun CalculateSub")
return chaji
- 排除重复出现的牌
Github的代码签入记录
前端
后端
遇到的代码模块异常或结对困难及解决方法
问题描述
- 前端
- 没有接触过前端
- 对html等方面了解不多
- 不懂如何才能使图片在点击时降低透明度
- 后端
- 对Python语言的不熟悉
- 不知道怎样去写一副牌
- 很多牌型不懂怎样把它表示出来
- 怎样排列才能使牌的权值最大
做过哪些尝试
- 前端:从网课开始学,遇到难题后通过百度了解具体细节代码如何实现
- 后端:在网上找了一些代码作为参考,结合我们这次的作业做一些改动。
是否解决
- 前端:解决了前端开发中遇到的一些问题,如怎样让图片在点击时降低透明度等。
- 后端:有些解决了有些没解决,能写出来一写牌型但是组合和排列还是不知道怎么写。
有何收获
- 前端:通过一系列的学习,基本掌握了html、css和js的用法,并且懂得如何制作出页面,以及学会了对页面进行排列布局。
- 后端:相比以前写过的一些程序,写一种牌还是第一次,算是一个新鲜的体验,虽然这次体验让人心力交瘁,但是相比以前,我对于python的理解有所提高,更加深刻的认识到了学好一门编程语言刻不容缓。
评价你的队友
- 值得学习的地方:学习速度很快,一旦开始就能够心无旁骛的学习下去,一边学习一边实践。
- 需要改进的地方:可以早点开始。
学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 20 | 20 | 学会使用Axure制作原型 |
2 | 0 | 0 | 15 | 15 | 学习Python的基本用法 |
3 | 94 | 94 | 23 | 23 | 试着用Python写程序 |
4 | 354 | 354 | 35 | 35 | 进一步完善代码 |