# ========================================================= # Node: CardGame Random Deal # Description: Dealing any kind of cardgames max for 6 person poker , black jack , sentence # Author: OmiX.IR # Category: Tools # ========================================================= import os import torch import random import winsound import numpy as np from PIL import Image, ImageDraw, ImageFont class Card: suits = ["♠", "♥", "♦", "♣"] ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"] def __init__(self, suit, rank): self.suit = suit self.rank = rank def __str__(self): return self.rank + self.suit class Player: def __init__(self, name, position,stack): self.name = name self.position = position self.stack = stack self.hand = [] def add_card(self, card): self.hand.append(card) def show_hand(self): print(f"Hand {self.name}: { [str(card) for card in self.hand]}") # تغییر این خط class DealGame: def __init__(self): #self.deck=[] self.deck = self.create_deck(0) # 0 : joker in preset self.players = [] self.table_hand = [] self.bet_flop = 0 self.bet_turn = 0 self.bet_river = 0 self.table_balance = 0 def create_deck(self,joker_num): deck = [] for suit in Card.suits: for rank in Card.ranks: deck.append(Card(suit, rank)) print(">>> Total card before joker:",len(deck)) if joker_num>0: print("!!!! PRESET Adding Jokers",joker_num) for i in range(joker_num): deck.append(Card(str(i+1),"Joker")) print("JOKER ",i) random.shuffle(deck) print("Total card after jokers:", len(deck)) return deck def add_player(self, player): self.players.append(player) def deal(self, n): for _ in range(n): for player in self.players: if len(self.deck)>0: card = self.deck.pop() player.add_card(card) else: print("Deck is Empty") return def deal_table_hand(self, n): for _ in range(n): if self.deck: card = self.deck.pop() self.table_hand.append(card) else: print("Deck Is Empty") return print("Table Hand : ", [str(card) for card in self.table_hand]) class DealRandom: """" 👾 OmiX Deal random cards in ComfyUI Manages Cardgame Deck logic abd renders cards """ def __init__(self): self.jk = 0 pass @classmethod def INPUT_TYPES(cls): return { "required": { "SEED": ("INT", {"default": 2005520646546}), "Game_Name": ("STRING", {"default": "Holdem Poker"}), "Deal_Num": ("INT", {"default":2}), "Deal_table_Num": ("INT", {"default": 5}), "Deal_Jokers_Num": ("INT", {"default": 0}), "Suit_colors": ( [ "2", "4", ], {"default": "4"} ), "Sort_Hand_method": ( [ "rank", "suit", ], {"default": "suit"} ), "Player_1_name": ("STRING", {"default": "OmiX"}), "Player_1_Sited": ("BOOLEAN", {"default": True}), "Player_2_name": ("STRING", {"default": "MahPsy"}), "Player_2_Sited": ("BOOLEAN", {"default": True}), "Player_3_name": ("STRING", {"default": "PC 1"}), "Player_3_Sited": ("BOOLEAN", {"default": True}), "Player_4_name": ("STRING", {"default": "PC 2"}), "Player_4_Sited": ("BOOLEAN", {"default": False}), "Player_5_name": ("STRING", {"default": "PC 3"}), "Player_5_Sited": ("BOOLEAN", {"default": False}), "Player_6_name": ("STRING", {"default": "PC 4"}), "Player_6_Sited": ("BOOLEAN", {"default": False}), } } RETURN_TYPES = ("IMAGE", "STRING", "STRING", "STRING", "STRING", "STRING", "STRING", "STRING", "STRING") RETURN_NAMES = ("image", "Player hand 1", "Player hand 2", "Player hand 3", "Player hand 4", "Player hand 5", "Player hand 6", "Table hand","Remain Deck") FUNCTION = "Deal" CATEGORY = "👾 OmiXDev/Games" def Deal(self,SEED,Game_Name,Suit_colors,Sort_Hand_method,Deal_Num,Deal_table_Num,Deal_Jokers_Num,Player_1_name,Player_2_name,Player_3_name,Player_4_name,Player_5_name,Player_6_name,Player_1_Sited,Player_2_Sited,Player_3_Sited,Player_4_Sited,Player_5_Sited,Player_6_Sited): random.seed = SEED game = DealGame() # Define Players player1 = Player(Player_1_name, 1, 300) player2 = Player(Player_2_name, 2, 200) player3 = Player(Player_3_name, 3, 332) player4 = Player(Player_4_name, 4, 300) player5 = Player(Player_5_name, 5, 200) player6 = Player(Player_6_name, 6, 332) #player_fold_cards = Player("fold card", 0, 0) # Add Players to Game if Player_1_Sited : game.add_player(player1) if Player_2_Sited : game.add_player(player2) if Player_3_Sited : game.add_player(player3) if Player_4_Sited : game.add_player(player4) if Player_5_Sited : game.add_player(player5) if Player_6_Sited : game.add_player(player6) player_names = [Player_1_name, Player_2_name, Player_3_name, Player_4_name, Player_5_name, Player_6_name] player_hands = [player1.hand,player2.hand,player3.hand,player4.hand,player5.hand,player6.hand] table_hand = [] #tested for card in game.table_hand: table_hand.append(str(card)) def render(player_names,suit_n,player_hands,table_hand,Game_Name): green_background = Image.new("RGB", (800, 600), (0, 64, 0)) draw = ImageDraw.Draw(green_background) try: card_image = Image.open("card_logo.png") except FileNotFoundError: print("Error: card_logo.png not found.") card_image = None # Assign None to card_image in case of error except Exception as e: print(f"An error occurred: {e}") card_image = None # Assign None to card_image in case of error try: font = ImageFont.truetype("arial.ttf", 30) # فونت مناسب را انتخاب کنید except IOError: font = ImageFont.load_default() try: font1 = ImageFont.truetype("arial.ttf", 15) # فونت مناسب را انتخاب کنید except IOError: font1 = ImageFont.load_default() try: font2 = ImageFont.truetype("Webdings.ttf", 10) # فونت مناسب را انتخاب کنید except IOError: font2 = ImageFont.load_default() draw.rectangle([(0,230),(800,350)],fill="#1c3f35") draw.text((10, 240), f"{Game_Name}", fill="white",font=font) card_width, card_height = 75, 75 x0, y0 = 250, 240 y_ofset = 5 x_ofset = 35 radius = 8 jj=0 for cards in ex_table_hand: jj+=1 draw.rounded_rectangle([(x0, y0), (x0 + card_width, y0 + card_height)], fill="white", outline="black", width=1, radius=radius) draw.text((x0 + 25, y0 + 30), f"OmiX.IR", fill="black", font=font1) if "♠" in cards: draw.text((x0+5,y0+5),f"{cards}",fill="black",font=font1) elif "♥" in cards: draw.text((x0+5,y0+5),f"{cards}",fill="red",font=font1) elif "♣" in cards and suit_n=="2" : draw.text((x0+5,y0+5),f"{cards}",fill="black",font=font1) elif "♣" in cards and suit_n == "4": draw.text((x0 + 5, y0 + 5), f"{cards}", fill="green", font=font1) elif "Jo" in str(cards): draw.text((x0 + 5, y0 + 5), f"{cards}", fill="black", font=font1) elif "♦" in cards and suit_n=="2": draw.text((x0+5,y0+5),f"{cards}",fill="red",font=font1) elif "♦" in cards and suit_n=="4": draw.text((x0+5,y0+5),f"{cards}",fill="blue",font=font1) #green_background.paste(card_image,[(x0+15,y0+15),(x0+65,y0+65)]) if jj % 3 == 0 : x0, y0 = x0 + x_ofset + 20, 240 else: x0, y0 = x0 + x_ofset, y0 + y_ofset card_width,card_height=75,100 x0,y0=10,30 y_ofset = 20 x_ofset = 15 for i in range(len(player_hands)): j=0 if i==1 : x0,y0=300,30 if i==2 : x0,y0=550,30 if i==3 : x0,y0=10,380 if i==4 : x0,y0=300,380 if i==5 : x0, y0 = 550, 380 draw.text((x0, y0-20), f"{player_names[i]} Hand", fill="white", font=font1) for cards in player_hands[i]: j+=1 draw.rounded_rectangle([(x0, y0), (x0 + card_width, y0 + card_height)], fill="white", outline="black", width=1, radius=radius) draw.text((x0 + 25, y0 + 30), f"OmiX.IR", fill="black", font=font2) if "♥" in str(cards) : draw.text((x0+5,y0+5),f"{cards}",fill="red",font=font1) elif "♣" in str(cards) and suit_n=="2":draw.text((x0+5,y0+5),f"{cards}",fill="black",font=font1) elif "♣" in str(cards) and suit_n=="4":draw.text((x0+5,y0+5),f"{cards}",fill="green",font=font1) elif "♠" in str(cards): draw.text((x0 + 5, y0 + 5), f"{cards}", fill="black", font=font1) elif "Jo" in str(cards): draw.text((x0 + 5, y0 + 5), f"{cards}", fill="black", font=font1) elif "♦" in str(cards) and suit_n=="2":draw.text((x0+5,y0+5),f"{cards}",fill="red",font=font1) elif "♦" in str(cards) and suit_n=="4": draw.text((x0+5,y0+5),f"{cards}",fill="blue",font=font1) #green_background.paste(card_image, (x0 + 35, y0 + 35)) if j%5==0 and i<3 :x0,y0=x0+x_ofset+20,35 elif j%5==0 and i>=3 : x0,y0=x0+x_ofset+10,385 else:x0,y0 = x0+x_ofset , y0+y_ofset np_image = np.array(green_background).astype(np.float32) / 255.0 tensor_image = torch.from_numpy(np_image).unsqueeze(0) return tensor_image """ player_sited_flags = [Player_1_Sited, Player_2_Sited, Player_3_Sited, Player_4_Sited, Player_5_Sited,Player_6_Sited] for i in range(len(player_names)): if player_sited_flags[i]: player = Player(player_names[i], i + 1, 300) # Assuming player number is i + 1 game.add_player(player) """ # Deal to on sited players game.create_deck(Deal_Jokers_Num) print("jokers in desk :",Deal_Jokers_Num) if Deal_Jokers_Num>0: print("!!!! Adding Jokers",Deal_Jokers_Num) for i in range(Deal_Jokers_Num): game.deck.append(Card(str(i+1),"Joker")) print("JOKER ",i+1) random.shuffle(game.deck) print("Total Cards in deck :",len(game.deck)) game.deal(Deal_Num) print("Deal Card Numbers to players :", Deal_Num) # Deal to table if Deal_table_Num>0 : game.deal_table_hand(Deal_table_Num) # Show Players Hands in consul player1.show_hand() player2.show_hand() player3.show_hand() player4.show_hand() player5.show_hand() player6.show_hand() print(table_hand) def replace_unicode_suit(card_string): """replace char code to show in ComfyUI.""" card_string = card_string.replace("♠", " Spade") card_string = card_string.replace("♥", " Heart") card_string = card_string.replace("♦", " Dimond") card_string = card_string.replace("♣", " Club") return card_string def sort_hand(hand, Sort_Hand_method): """مرتب سازی دست کارت ها بر اساس خال یا رتبه.""" if Sort_Hand_method == "suit": hand.sort(key=lambda card: card.suit) # مرتب سازی بر اساس خال elif Sort_Hand_method == "rank": hand.sort(key=lambda card: card.rank) # مرتب سازی بر اساس رتبه else: print("Invalid sorting state. Use 'suit' or 'rank'.") return hand player1.hand=sort_hand(player1.hand, Sort_Hand_method) player2.hand=sort_hand(player2.hand, Sort_Hand_method) player3.hand=sort_hand(player3.hand, Sort_Hand_method) player4.hand=sort_hand(player4.hand, Sort_Hand_method) player5.hand=sort_hand(player5.hand, Sort_Hand_method) player6.hand=sort_hand(player6.hand, Sort_Hand_method) game.table_hand=sort_hand(game.table_hand,Sort_Hand_method) #ex_pl1_hand = str(player1.name) + " hands : " + [f"{card}" for card in player1.hand] ex_pl1_hand = str(player1.name) + " hands : "+str([replace_unicode_suit(str(card)) for card in player1.hand]) ex_pl2_hand = str(player2.name) + " hands : "+str([replace_unicode_suit(str(card)) for card in player2.hand]) ex_pl3_hand = str(player3.name) + " hands : "+str([replace_unicode_suit(str(card)) for card in player3.hand]) ex_pl4_hand = str(player4.name) + " hands : "+str([replace_unicode_suit(str(card)) for card in player4.hand]) ex_pl5_hand = str(player5.name) + " hands : "+str([replace_unicode_suit(str(card)) for card in player5.hand]) ex_pl6_hand = str(player6.name) + " hands : "+str([replace_unicode_suit(str(card)) for card in player6.hand]) ex_table_hand1 =str([replace_unicode_suit(str(card)) for card in game.table_hand]) ex_table_hand =[str(card) for card in game.table_hand] ex_image = render(player_names,Suit_colors, player_hands, table_hand,Game_Name) ex_deck = [replace_unicode_suit(str(card)) for card in game.deck] winsound.Beep(1000, 500) return (ex_image,ex_pl1_hand,ex_pl2_hand,ex_pl3_hand,ex_pl4_hand,ex_pl5_hand,ex_pl6_hand,ex_table_hand1,ex_deck) NODE_CLASS_MAPPINGS = {"DealRandom": DealRandom} NODE_DISPLAY_NAME_MAPPINGS = {"DealRandom": "👾 Deal Random Cards 🃏🃏"}