闲来无事逛其乐技术区,看有人请教如何用python做21点的判断规则。心血来潮也想去试试,但看了看正统的21点规则确实相当复杂,退而求其次写个达芬奇密码的吧
首先,要明确一下连接流程
用的是socket库,tcp长连接
服务器端:
HOST = '0.0.0.0' # 主机ip,0.0.0.0代表接受所有连接 PORT = * # 软件端口号 BUFSIZ = 1024 ADDR = (HOST, PORT) SIZE = 10 tcpS = socket(AF_INET, SOCK_STREAM) # 创建socket对象 tcpS.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #加入socket配置,重用ip和端口 tcpS.bind(ADDR) # 绑定ip端口号 tcpS.listen(SIZE) # 设置最大链接数 while True: print("服务器启动,监听客户端链接") conn, addr = tcpS.accept() #接受客户端连接 print("链接的客户端", addr) t = threading.Thread(target=threadfun, args=(conn, addr)) t.start() tcpS.close()
在服务器端,由于需要同时与两个客户端连接、通信,所以为每个连接建立一个新的线程,在线程函数中对数据进行处理。由于在本牌局中,两个客户端(玩家)不会同时操作手牌,所以对线程中修改的全局变量也并未加入线程锁
客户端:
HOST = 'duya12345.top' #服务端ip PORT = * #服务端端口号 BUFSIZ = 1024 ADDR = (HOST, PORT) connect_flag = 1 while connect_flag: try: tcpCliSock = socket(AF_INET, SOCK_STREAM) #创建socket对象 tcpCliSock.connect(ADDR) #连接服务器 my_id = tcpCliSock.recv(BUFSIZ).decode('utf-8') #获取当前身份 connect_flag = 0 except error: print('连接服务器失败!') sleep(1)
然后是数据结构的问题,每张(发出去的)牌所携带的信息如下:
- 所处位置(在哪个玩家手中)
- 颜色(黑白)
- 数字
- 是否已经被摊开
我将2/3/4项编码为一个四位数字
- 第一、二位数:数字
- 第三位数:颜色 1白2黑
- 第四位数:是否隐藏 0藏1不
这样直接可以进入排序函数,按数字大小与颜色进行手牌的排列
把这两点弄完之后,就没什么难点了,写几个服务器对牌堆进行操作的函数就可以了