黄金点游戏
黄金点游戏是一个数字小游戏,其游戏规则是:
N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动。
现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下:
1、本作业属于结对编程项目,必须由二人共同完成,并分别将本次作业过程发到博客,同时将本次作业源代码提交到coding系统;
2、如果可能的话尽量以C/S或B/S方式实现,即利用服务器接收和处理所有玩家提交的数字,并将结果反馈给各玩家,玩家可以通过客户端提交数字;
3、如果采用单机方式实现的话,需要为用户提供便利的输入界面;
4、该游戏每次至少可以运行10轮以上,并能够保留各轮比赛结果。
一.数据结构
(1)结构体数组
N个同学进行X轮游戏,对同学的编号、输入值和分数的储存首先想到了用结构体数组。结构体数组得有点是编写简单,在内存中储存是连续的,读取不易产生错误。缺点是查找,排序等操作非常慢。
(2)字典
Python中的字典非常强大,它和C中的结构体数组感觉非常像。查找,排序,最大值最小值等都有直接的函数,编写起来比较简单。字典的缺点是不能交换顺序,只能按照输入的顺序一次向下排。虽然应对黄金点游戏已经足够,但是如果功能改变,字典还是没有列表那么强大。
(3)列表
列表,Python中的苦力,能应对所有的排序,查找,插入,删除,最大最小值等等这些操作,所以这个苦力是名副其实的。
二.实现方案
(1) 利用Python自带IDLE编辑。最后在黑框中运行,黑框中加一些用户交互选项。优点是程序简单,便于修改,运算逻辑简介清晰。缺点是界面简易,而且只能在一台机器上运行,无法达到同时在线游戏这一要求。
(2) 利用Django编写后台程序,利用HTML5和CSS编写前端,并上传到服务器。优点是界面美观多样,可以多人同时在线游戏。缺点是工程量比较大,对于7天完成还是比较紧张。
三.编程记录
(1)今天是第一天,由于时间有限,我们讨论后决定先把方案(1)实现,这样我们可以专心用剩余的时间完成方案(2)。由于问题最后写道黄金点会逐渐下移,我们就想用多组实验用例来探究规律,所以最终我们决定利用random函数来代替输入以提高效率。当然,在逻辑框架编好后,我们还是手动输入了几组测试用例,确保程序没有BUG。之后我们利用random函数进行输入,并将输入结果进行人工计算,发现没有错误。在进行20次实验过后,发现黄金点的G值确实会向下移动。期间也遇到了一点问题,例如二维数组中越界的问题,后来在查阅相关博客后也解决了。算法是输入人数和游戏次数,并根据这两个数值建立二维数组。利用循环嵌套输入将数据存入二维数组中,并求出当前轮的平均值来算出G值,在利用一个循环,将数组中的数据与G做差值取绝对值依次存放进chalist数组中。chalist中找到最大值与最小值的位置,新建score数组,长度与人数相同,默认值全为0,将最大值最小值所对的位置分别改为人数N和-2,完成当前轮的分数统计。下面是Python编写的源代码
1 import random 2 b=int(input("请输入游戏人数:\n")) 3 a=int (input("请输入游戏次数:\n")) 4 mylist=[[0]*b]*a 5 print("\n"*5) 6 for i in range(0,a): 7 mylist_sum=[[]]*a 8 for j in range(0,b): 9 mylist[i][j]=random.randint(0,100) 10 mylist_sum[i].append (mylist[i][j]) 11 average=sum(mylist_sum[i])/b 12 G=average*0.68 13 chalist=[] 14 for j in range(0,b): 15 chalist.append(abs(mylist[i][j]-G)) 16 score=[0]*b 17 print("差值") 18 print(chalist) 19 M=chalist.index(max(list(chalist))) 20 m=chalist.index(min(list(chalist))) 21 score[m]=-2 22 score[M]=b 23 print("本局得分") 24 print(score) 25 print("\n"*5)
下面是coding链接地址:https://coding.net/u/Jesse_smi/p/Golden-Point-Game/git/blob/master/%E9%BB%84%E9%87%91%E6%B8%B8%E6%88%8F-python.py
下面是程序运行时的截图:
现在界面优化不是很好,过后会再改进。
(2)第二天,我尝试安装Django,下面是Django的下载地址:https://www.djangoproject.com/
安装Django前确保电脑里已经安装python,并成功设定好路径,关于Django的安装推荐看下面的博客:http://www.cnblogs.com/hongten/p/hongten_django_install.html
(3)第三天,我建立了一个Django框架,并设定好前端请求的处理方法
下面是Django框架在coding上的链接:https://coding.net/u/Jesse_smi/p/Golden-Point-Game/git/blob/master/python%E7%9A%84django%E6%A1%86%E6%9E%B6.pyproj
但在服务器连接上出现了一点问题,导致无法连接
之后这几天一直在修改这个问题,修改好后我会更新新的代码。
四.总结
通过这几天的结对编程发现两个人的工作效率确实比一个人高,在出现一些自己没有发现的小BUG时,对方也能及时指正,并对我的算法提出一些优化的建议。这几天在我们共同努力之下,终于见到了一些成果,虽然最后的方案二还没有完成,但是我们会继续完善,尽早把它做出来。对于队员的评价我只想说思维清晰,非常有耐心对于我的错误也能及时指正。所以我觉得这次结对编程获益匪浅。