第五次作业对我个人来说是很难的,因为之前没怎么接触过这方面的内容,有幸能跟宗毅组成一队,我也仔细看了他的Python代码,因为对于Python也是第一次接触,所以我感觉在有限的时间里学会并且灵活运用还是很困难的,所以虽然付出了一些努力,还是一直处于学习的状态,没有得到想象中的结果,但是也理清了思路,实践了一些东西,还是很有收获,我相信通过我的努力一定会越来越好。下面附上代码和截图:

服务器程序:

# -*- coding: utf-8 -*-
import socket
import thread
import random
import hashlib
import urllib, urlparse
import time connLock = 0
def sendMsg(conn, msg):
global connLock
while connLock == 1:
continue
connLock = 1
conn.send(msg)
connLock = 0 class player():
username = ''
token = ''
point = 0
guess = 0
conn = None
timeoutCount = 0
def __init__(self, username, conn):
self.username = username
self.token = hashlib.md5(str(random.randint(1, 2**256))).hexdigest()
self.point = 0
self.timeoutCount = 0
self.conn = conn
def getToken(self):
return self.token
def win(self):
self.point = self.point + 10
def lose(self):
self.point = self.point - 5
def timeout(self):
self.point = self.point - 10
self.timeoutCount = self.timeoutCount + 1
def submit(self, guess):
self.guess = guess
def getGuess(self):
return self.guess
def getUsername(self):
return self.username
def getPoint(self):
return self.point
def newRound(self, timeout, count):
req = {
'cmd': 'newround',
'count': count,
'timeout': str(timeout),
'yourpoint': str(self.getPoint())
}
sendMsg(conn, urllib.urlencode(req)) class game():
roundTime = 30
lastWinner = ''
lastLosers = []
lastG = 0
players = []
waiting = 0
roundCount = 0
def __init__(self):
self.roundTime = 5
def newRound(self):
print 'users:'
for i in self.players:
print i.getUsername(), i.point
#compute G
self.waiting = 0
i = [i.getGuess() for i in self.players]
if len(i) != 0:
self.lastG = sum(i)*0.618/len(i)
if len(self.players) > 0:
minabs = abs(self.players[0].getGuess() - self.lastG)
maxabs = abs(self.players[0].getGuess() - self.lastG)
#calculate winner point
for i in self.players[1:]:
#calculate timeouts
if i.getGuess == 0:
i.timeout()
if i.timeoutCount >= 3:
players.remove(i)
continue
if abs(i.getGuess() - self.lastG) < minabs:
self.lastWinner = i.getUsername()
minabs = abs(i.getGuess() - self.lastG)
if abs(i.getGuess() - self.lastG) > maxabs:
maxabs = abs(i.getGuess() - self.lastG)
i.guess = 0
#calculate losers
self.lastLosers = [i.getUsername for i in self.players if abs(i.getGuess() - self.lastG) == maxabs]
#add or minus points
self.roundCount = self.roundCount + 1
for i in self.players:
if i.getUsername() == self.lastWinner:
i.win()
elif i.getUsername() in self.lastLosers:
i.lose()
i.newRound(self.roundTime, self.roundCount)
self.waiting = 1
def newPlayer(self, username, conn):
t = player(username, conn)
self.players.append(t)
return t def getPara(d, p):
if d.has_key(p):
return d[p][0]
return None
def dealWithClient(conn, g):
p = None
while True:
buf = conn.recv(1024)
d = urlparse.parse_qs(buf)
cmd = getPara(d, 'cmd')
if (cmd == 'newplayer'):
username = getPara(d, 'username')
p = g.newPlayer(username, conn)
req = {
'cmd': 'confirmplayer',
'username': username,
'token': p.getToken()
}
sendMsg(conn, urllib.urlencode(req))
elif (cmd == 'submit'):
point = int(getPara(d, 'point'))
print 'submit from ',p.getUsername(), 'point=',point
p.submit(point)
req = {
'cmd': 'confirmsubmit',
'point': point
}
sendMsg(conn, urllib.urlencode(req))
elif (cmd == 'query'):
yourpoint = str(p.getPoint())
lastg = str(g.lastG)
lastwinner = g.lastWinner
req = {
'cmd': 'confirmquery',
'yourpoint': yourpoint,
'lastg': lastg,
'lastwinner': lastwinner
}
sendMsg(conn, urllib.urlencode(req)) def timer(g):
while True:
timeout = g.roundTime
time.sleep(timeout)
g.newRound() if __name__ == '__main__':
g = game()
thread.start_new_thread(timer, (g, ))
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 9210))
sock.listen(5)
while True:
conn,address = sock.accept()
print 'New client connected.'
thread.start_new_thread(dealWithClient, (conn, g))

server

客户端程序:

# -*- coding: utf-8 -*-

import urllib, urlparse
import thread
import socket
import time class player:
username = ''
token = ''
point = 0
guess = 0
conn = None
timeout = 0
roundCount = 0
def __init__(self, conn):
self.username = ''
self.token = ''
self.point = 0
self.guess = 0
self.conn = conn
def submit(self, guess):
req = {
'cmd': 'submit',
'point': str(guess)
}
self.conn.send(urllib.urlencode(req))
def query(self):
req = {
'cmd': 'query'
}
self.conn.send(urllib.urlencode(req))
def newPlayer(self, username):
req = {
'cmd': 'newplayer',
'username': username
}
self.conn.send(urllib.urlencode(req)) def getPara(d, p):
if d.has_key(p):
return d[p][0]
return None def dealWithServer(conn, p):
while True:
buf = conn.recv(1024)
d = urlparse.parse_qs(buf)
cmd = getPara(d, 'cmd')
if cmd == 'newround':
timeout = getPara(d, 'timeout')
count = getPara(d, 'count')
yourpoint = getPara(d, 'yourpoint')
p.timeout = int(timeout)
p.roundCount = int(count)
p.point = int(yourpoint)
print 'newround, timeout:',timeout
elif cmd == 'confirmplayer':
username = getPara(d, 'username')
token = getPara(d, 'token')
p.username = username
p.token = token
print 'confirmplayer'
elif cmd == 'confirmsubmit':
point = getPara(d, 'point')
p.guess = point
print 'confirm submit'
elif cmd == 'confirmquery':
yourpoint = int(getPara(d, 'yourpoint'))
lastg = getPara(d, 'lastg')
lastwinner = getPara(d, 'lastwinner')
p.point = yourpoint
print 'Query result:\nyourpoint:', yourpoint, '\nlastG:', lastg, '\nlastWinner:', lastwinner, '\n' if __name__ == '__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 9210))
p = player(sock)
thread.start_new_thread(dealWithServer, (sock, p))
while True:
time.sleep(1)
print '1. newplayer\n2.submit\n3.query'
cmd = raw_input('choice:')
if cmd == '':
username = raw_input('username:')
p.newPlayer(username)
if cmd == '':
point = raw_input('point:')
p.submit(int(point))
if cmd == '':
p.query()

client

代码还在完善当中,包括用户界面,黄金点曲线等等,有了改动我会继续上传到Github和博客中。

work_5的更多相关文章

  1. Java常用工具类练习题

    1.请根据控制台输入的特定日期格式拆分日期 如:请输入一个日期(格式如:**月**日****年) 经过处理得到:****年**月**日 提示:使用String的方法indexOf.lastIndexO ...

  2. .NET下集中实现AOP编程的框架

    一.Castle 使用这个框架呢,首先是需要安装NuGet包. 先建立一个控制台项目,然后在NuGet中搜索Castle.Windsor,不出意外的话应该能找到如下的包 然后安装,会自动的安装包Cas ...

随机推荐

  1. 关于Linux的windows目录的挂载

    今天,linux主机下面要增加一点空间,不想再增加硬盘,所以就在实体机里面就设置了目录共享,添加自己系统的默认账号(为了增加自己主机的安全性,我都是设置的含有标点符号的密码---这也是这次挂载不成功的 ...

  2. Codeforces Round #243 (Div. 2) C. Sereja and Swaps(优先队列 暴力)

    题目 题意:求任意连续序列的最大值,这个连续序列可以和其他的 值交换k次,求最大值 思路:暴力枚举所有的连续序列.没做对是因为 首先没有认真读题,没看清交换,然后,以为是dp或者贪心 用了一下贪心,各 ...

  3. MVVM设计模式《网摘》

    MVVM模式能够帮你把你程序的业务与展现逻辑从用户界面干净地分离开.保持程序逻辑与界面分离能够帮助解决很多开发以及设计问题,能够使你的程序能更容易的测试,维护与升级.它也能很大程度的增加代码重用性,并 ...

  4. 【笨嘴拙舌WINDOWS】API

    如今,相对于大行其道的对象,服务,API概念的提出要早很多,却依然经久不衰:所谓万变不离其宗,如今很多服务(Web Services,云服务)的提供方式和API如出一辙. Windows API(Ap ...

  5. web交互方式

    轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 优点:后端程序编写比较容易. 缺点:请求中有大半是无用,浪费带宽和服务器资源. 实例:适于小型应用. 长轮询:客 ...

  6. sqlserver错误"试图扩大物理文件时,MODIFY FILE 遇到操作系统错误 112(磁盘空间不足。)。"处理

    正常还原的时候报错: Microsoft SQL-DMO (ODBC SQLState: 42000)---------------------------试图扩大物理文件时,MODIFY FILE  ...

  7. HDU 5296 Annoying problem (LCA,变形)

    题意: 给一棵n个节点的树,再给q个操作,初始集合S为空,每个操作要在一个集合S中删除或增加某些点,输出每次操作后:要使得集合中任意两点互可达所耗最小需要多少权值.(记住只能利用原来给的树边.给的树边 ...

  8. Java Socket(3): NIO

    NIO采取通道(Channel)和缓冲区(Buffer)来传输和保存数据,它是非阻塞式的I/O,即在等待连接.读写数据(这些都是在一线程以客户端的程序中会阻塞线程的操作)的时候,程序也可以做其他事情, ...

  9. RMAN 备份详解

    一.数据库备份与RMAN备份的概念 1.数据库完全备份:按归档模式分为归档和非归档 归档模式 打开状态,属于非一致性备份        关闭状态,可以分为一致性和非一致性 非归档模式 打开状态,非一致 ...

  10. 利用ioctl()获取无线速率

    其实对于自己装了网卡驱动的来说,应该从最根本的驱动中获取速率. 但是用ioctl()也可以,其实实现和iwconfig命令相同. 仅仅获取速率这部分: #include <stdio.h> ...