【桌游】命令行版的达芬奇密码

闲来无事逛其乐技术区,看有人请教如何用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)

 

然后是数据结构的问题,每张(发出去的)牌所携带的信息如下:

  1. 所处位置(在哪个玩家手中)
  2. 颜色(黑白)
  3. 数字
  4. 是否已经被摊开

我将2/3/4项编码为一个四位数字

  • 第一、二位数:数字
  • 第三位数:颜色 1白2黑
  • 第四位数:是否隐藏 0藏1不

这样直接可以进入排序函数,按数字大小与颜色进行手牌的排列

 

把这两点弄完之后,就没什么难点了,写几个服务器对牌堆进行操作的函数就可以了

完整代码在这里

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注