homework-05
经过这几天的深思熟虑我和小明同学将这次作业基本的完整了,可能界面略丑陋,但是基本功能均已实现。我们的服务器端采用python编写,因为服务器端是这次作业的难点,而python中有一个叫做web.py的轻量级框架使用效果极好,并且不用编写配置文件,其对URL的处理很简练。对于客户端我采用了python编写小明选择了ruby,但是由于我的客户端有一些bug需要再交互模式下使用,所以我们将它抛弃而选择使用小明的客户端。由于代码编写的我身心疲惫,我就简略说一下我们本次编写过程中遇到的困难点:
1.第一次使用web.py 花费不少时间来学习
2.客户端并发较多,导致部分客户端崩溃,由于这个不是这次的重点,并没有对其进行处理。
3.不熟悉写网页,图表部分使用canvas写的,调试很麻烦
4.咱能换个博客吗 ,这个博客没有自动保存啊 我之前写的都没了。。。。写短点算了
这是运行结果的截图部分
![](http://images0.cnblogs.com/blog/568548/201311/03234812-8df8a1cf24314dbc8b0d718e9c6dcb8f.png)
![](http://images0.cnblogs.com/blog/568548/201311/03234748-966541029ca74b78acede4a34dd9e258.png)
然后是我们的代码部分
import web import thread import time import data import string from web import form render=web.template.render('templates/') urls=( '/','index', '/attend','attend', '/register','register' ) registerform=form.Form( form.Textbox("id",form.notnull) ) attendform=form.Form( form.Textbox("id",form.notnull), form.Textbox("num",form.notnull) ) def index_page(): for i in list(data.db.select('users')): print i['id'] time.sleep(10) for i in list(data.db.select('users')): data.users[i['id']]=0.0 while True: start=time.time() data.thisturn={} data.num=0 data.total=0 time.sleep(0.9) if data.num!=0: average=data.total/data.num*0.618 print average data.thisturn['winner']=score(data.thisturn,data.users,average) data.winner=data.thisturn['winner'] data.winnernumber=data.thisturn[data.winner] data.thisturn['result']=average data.goldpoint.append(average) t=1-(time.time()-start) time.sleep(t) print data.num data.turn+=1 def score(thisturn,users,average): value_max=0 value_min=100 for i in thisturn: a=abs(thisturn[i]-average) if a>value_max: value_max=a max_num=i if a<value_min: value_min=a winner=i for i in list(data.db.select('users')): if i['id'] not in thisturn and i['id']!=winner: users[i['id']]-=5 elif i['id']==winner: users[i['id']]+=10 elif i['id']==max_num: users[i['id']]-=1 return winner class index: def GET(self): return render.index(data.turn,data.winnernumber,data.users,data.goldpoint) class attend: def GET(self): form=attendform() return render.attend(form) def POST(self): form=attendform() if not form.validates(): return render.attend(form) else: i=web.input() i.num=string.atof(i.num) data.num+=1 data.total+=i.num data.thisturn[i.id]=i.num return 0 class register: def GET(self): form=registerform() return render.register(form) def POST(self): form=registerform() if not form.validates(): return render.register(form) else: i=web.input() data.db.insert('users',id=i.id,pd=0) data.users[i.id]=0.0 return 0 if __name__=="__main__": thread.start_new_thread(index_page,()) app=web.application(urls,globals()) app.run()
$def with(turn,number,users,goldpoint) <html> <head> <meta http-equiv="refresh" content="1"> <script type="text/javascript"> function draw(){ var canvas=document.getElementById("cv"); var a=$goldpoint if(canvas.getContext){ var ctx=canvas.getContext("2d"); ctx.beginPath(); ctx.moveTo(0,a[0]); for(i=1;i<=$turn-1;i++){ ctx.lineTo(10*i,a[i]); } ctx.stroke(); ctx.endPath(); } } </script> </head> <body onload="draw();"> <p>现在是第$turn轮</p> <p>上一轮获胜数字$number</p> <p>选手得分</p> <table border="1"> <tr> $for i in users: <td><b> $i </b></td> </tr> <tr> $for i in users: <td><b> $users[i] </b></td> </tr> </table> <canvas id="cv" width="1500" height="150"> </canvas> </body> </html>