bridgehandscanner / dds_util.py
vincentlui's picture
update ui
743c074
import ctypes
from ctypes import POINTER, Structure, byref, c_char, c_int, c_uint
import os
import sys
"""
Adopted from Peter Ellington's PBNCreator https://github.com/Britwizard/PBNCreator
"""
DDS_HANDS = 4
DDS_SUITS = 5
DDS_STRAINS = 5
dcardSuit = ["S", "H", "D", "C", "NT"]
convert_table1={'a':'10','b':'11','c':'12','d':'13'}
convert_table2={'10':'a','11':'b','12':'c','13':'d'}
vulnerability= ["None","NS","EW","All","NS","EW","All","None","EW","All","None","NS","All","None","NS","EW"]
dealerlist=["N","E","S","W"]
dd_dealer_point = ["N","S","E","W"]
dd_suit=["NT","S","H","D","C"]
dd_suit_wide=["NT"," S"," H"," D"," C"]
class ddTableDeal(Structure):
_fields_ = [("cards", c_uint * DDS_HANDS * DDS_SUITS)]
class ddTableResults(Structure):
# _fields_ = [("resTable", c_int * DDS_STRAINS * DDS_HANDS)]
_fields_ = [("resTable", c_int * DDS_HANDS * DDS_STRAINS)]
class ddTableDealPBN(Structure):
_fields_ = [("cards", c_char * 80)]
class ddTableResults(Structure):
# _fields_ = [("resTable", c_int * DDS_STRAINS * DDS_HANDS)]
_fields_ = [("resTable", c_int * DDS_HANDS * DDS_STRAINS)]
tableDealPBN = ddTableDealPBN()
table = ddTableResults()
dll_name = DLL = None
if os.name == "posix":
dll_name = "libdds.so"
DLL = ctypes.CDLL
if dll_name:
#dll_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),dll_name)
dll_path = os.path.join(os.getcwd(),dll_name)
#dll_path='C:\\Users\\peter\\Python\\PBNGenerator\\dds-64.dll'
if dll_name and os.path.exists(dll_path):
dll = DLL(dll_path)
dll.CalcDDtable.argtypes = [ddTableDeal, POINTER(ddTableResults)]
dll.ErrorMessage.argtypes = [c_int, POINTER(c_char)]
if os.name == "posix":
dll.SetMaxThreads(0)
def _check_dll(name):
return
else:
def _check_dll(name):
raise Exception(f"Unable to load DDS; {name} is not available")
def errorMessage(res):
msg = ctypes.create_string_buffer(80)
dll.ErrorMessage(res, msg)
result_len = ctypes.c_size_t(len(msg))
return msg[:result_len.value]
def calcDDtablePBN(tableDealPBN):
myTable = ctypes.pointer(table)
res = dll.CalcDDtablePBN(tableDealPBN, myTable)
if res != 1:
line = errorMessage(res)
raise Exception("DDS error: {}".format(line.decode("utf-8")))
return myTable
def get_ddstable(pbn):
tableDealPBN.cards = pbn
table = calcDDtablePBN(tableDealPBN)
all = { "N" : {}, "S" : {}, "E" : {}, "W" : {} }
# below doesn't work, why?
#all = dict.fromkeys(["N","S","E","W"], {})
# print(all)
for suit in range(0, DDS_SUITS):
all["N"][dcardSuit[suit]] = table.contents.resTable[suit][0]
all["S"][dcardSuit[suit]] = table.contents.resTable[suit][2]
all["E"][dcardSuit[suit]] = table.contents.resTable[suit][1]
all["W"][dcardSuit[suit]] = table.contents.resTable[suit][3]
return all
def get_dd_tricks(deal):
byte_board=deal.encode('utf-8') # ddstable requires the board description to be in byte format
dd_array = get_ddstable(byte_board)
double_dummy_tricks=''
for point in dd_array:
for suit in dd_suit:
temp = dd_array[point][suit]
value=str(temp)
if temp > 9:
value=convert_table2[value]
double_dummy_tricks = double_dummy_tricks + value
return(double_dummy_tricks)
"""
End
"""