实验内容 :
猜数字游戏(修改版):
服务器上存储了一个0到1,000,000之间的整数,接收来自客户端猜测的数字,如果数字与服务器数字相等则发送成功,否则如果猜测的数字大于服务器上数字则发送“big”,小于则发送“small”。服务器统计每个客户端猜测正确所需次数,选出猜测次数最小的成为获胜者,并公布所有客户端的成绩。
但这个游戏规则只能等一个客户端猜完下一个客户端再猜(很无聊)
所以我为了能让多客户端一起竞争猜数(此时猜测次数最小不一定是获胜者),并只要其中一个用户猜中后就重新开始游戏,这里修改游戏规则:谁先猜中谁成为获胜者。
思路:
利用UDP编程,服务器存储一个字典记录各个端口号的猜测次数,如果字典是空的,则说明游戏重新开始,定义新的随机数;如果字典不为空,则游戏正在进行,并发送给客户端游戏状况的提示。
然后判断接收的数字与随机数的关系,发送small或者big,或者equal,you win,当其中有一个客户端猜中时,公布获胜者,字典清空,下一次接收数字时游戏将重新开始
服务端获取用户输入数据,接收服务端发来的游戏状况的提示和猜数情况。
流程图
程序源代码
#接收端代码
import socket
from random import randint
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('127.0.0.1',5000))
client={} #实际猜测次数
while True:
msg,addr=s.recvfrom(1024)
msg=int(msg.decode())
PORT=addr[1]
if not client:
num=randint(0,1000001)
print('随机生成的数字是:',num) #重新发数
if PORT not in client:
client[PORT]=0
tip='游戏重新开始'
s.sendto(tip.encode(),addr)
elif PORT in client:
tip='游戏正在进行'
s.sendto(tip.encode(),addr)
print('receive messege:from PORT {0[1]} on {0[0]},he guess the number is {1}'.format(addr,msg))
if msg<num:
text='small'
client[PORT]+=1
elif msg>num:
text='big'
client[PORT]+=1
elif msg==num:
text='equal,you win.'
client[PORT]+=1
print(client)
print('the winnner is:',PORT)
client.clear()
s.sendto(text.encode(),addr)
#发送端代码
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
num=input('猜测一个整数(0-1000000):')
s.sendto(num.encode(),("127.0.0.1",5000))
tip,addr=s.recvfrom(1024)
tip=str(tip.decode())
print(tip)
msg,addr=s.recvfrom(1024)
msg=str(msg.decode())
print('Your number is {}\n'.format(msg))
s.close()
运行截图
服务端5000
客户端61431
客户端65221
总结:
这个程序应该很容易看懂,就是利用字典的清空来控制游戏结束or进行,从而不断地发数字。
字典可以记录不同用户(端口号)到底猜了多少次。