Spaces:
Running
Running
| 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 | |
| """ |