黄金点游戏

黄金点游戏是一个数字小游戏,其游戏规则是:

      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时,对方也能及时指正,并对我的算法提出一些优化的建议。这几天在我们共同努力之下,终于见到了一些成果,虽然最后的方案二还没有完成,但是我们会继续完善,尽早把它做出来。对于队员的评价我只想说思维清晰,非常有耐心对于我的错误也能及时指正。所以我觉得这次结对编程获益匪浅。

posted on 2016-10-17 16:47  神一样的_男人  阅读(768)  评论(0编辑  收藏  举报

导航