PYTHON:基于UDP协议的猜数字游戏(支持多客户端竞争猜数)

实验内容 :

猜数字游戏(修改版):

        服务器上存储了一个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进行,从而不断地发数字。

字典可以记录不同用户(端口号)到底猜了多少次。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值