ESP32 网络时钟进阶:LinkBoy 5.0 对接 NTP 实现自动校时(4步配置)
2026/7/11 7:43:57
@WangY_ZQ
importtkinterastkfromtkinterimportttkimportrandom SUITS={'方片':'\u2666','黑桃':'\u2660','梅花':'\u2663','红桃':'\u2665'}SUIT_COLORS={'方片':'red','黑桃':'black','梅花':'black','红桃':'red'}RANKS=list(range(1,11))BG_COLOR='#81c784'classCard:def__init__(self,suit,rank):self.suit=suit self.rank=rankdef__repr__(self):returnf"{SUITS[self.suit]}{self.rank}"defgenerate_deck():deck=[]forsuitinSUITS:forrankinRANKS:deck.append(Card(suit,rank))returndeckdefsolve_24(numbers):iflen(numbers)==1:ifabs(numbers[0][0]-24)<1e-6:returnnumbers[0][1]returnNoneforiinrange(len(numbers)):forjinrange(len(numbers)):ifi==j:continuen1,expr1=numbers[i]n2,expr2=numbers[j]remaining=[numbers[k]forkinrange(len(numbers))ifk!=iandk!=j]result=solve_24([(n1+n2,f"({expr1}+{expr2})")]+remaining)ifresult:returnresult result=solve_24([(n1-n2,f"({expr1}-{expr2})")]+remaining)ifresult:returnresult result=solve_24([(n1*n2,f"({expr1}*{expr2})")]+remaining)ifresult:returnresultifn2!=0:result=solve_24([(n1/n2,f"({expr1}/{expr2})")]+remaining)ifresult:returnresultreturnNoneclassGame24App:def__init__(self,root):self.root=root self.root.title("乐算24")self.root.geometry("800x500")self.root.resizable(False,False)self.deck=generate_deck()self.current_cards=[]self.solution=Noneself.game_frame=ttk.Frame(root,width=800,height=450)self.game_frame.pack(fill='both',expand=True)self.game_frame.pack_propagate(False)self.canvas=tk.Canvas(self.game_frame,width=800,height=450,bg=BG_COLOR)self.canvas.pack(fill='both',expand=True)self.btn_frame=ttk.Frame(root,width=800,height=50)self.btn_frame.pack(fill='x')self.btn_frame.pack_propagate(False)self.answer_var=tk.StringVar()self.answer_label=ttk.Label(self.game_frame,textvariable=self.answer_var,font=('Arial',14),foreground='red',background=BG_COLOR)self.answer_label.place(x=400,y=420,anchor='center')self.btn_new=ttk.Button(self.btn_frame,text="新游戏",command=self.new_game,width=15)self.btn_new.pack(side='left',padx=85,pady=10)self.btn_answer=ttk.Button(self.btn_frame,text="答案",command=self.show_answer,width=15)self.btn_answer.pack(side='left',padx=85,pady=10)self.btn_exit=ttk.Button(self.btn_frame,text="退出",command=root.quit,width=15)self.btn_exit.pack(side='left',padx=85,pady=10)self.new_game()defdraw_card(self,x,y,card):card_width=120card_height=170self.canvas.create_rectangle(x,y,x+card_width,y+card_height,fill='white',outline='black',width=2)self.canvas.create_rectangle(x+5,y+5,x+card_width-5,y+card_height-5,fill='white',outline='gray',width=1)suit_symbol=SUITS[card.suit]color=SUIT_COLORS[card.suit]self.canvas.create_text(x+20,y+30,text=str(card.rank),font=('Arial',24,'bold'),fill=color)self.canvas.create_text(x+20,y+60,text=suit_symbol,font=('Arial',32),fill=color)self.canvas.create_text(x+card_width-20,y+card_height-30,text=str(card.rank),font=('Arial',24,'bold'),fill=color,angle=180)self.canvas.create_text(x+card_width-20,y+card_height-60,text=suit_symbol,font=('Arial',32),fill=color,angle=180)center_x=x+card_width//2center_y=y+card_height//2self.canvas.create_text(center_x,center_y-10,text=suit_symbol,font=('Arial',56),fill=color)defnew_game(self):self.canvas.delete('all')self.canvas.create_rectangle(0,0,800,450,fill=BG_COLOR)self.current_cards=random.sample(self.deck,4)card_numbers=[card.rankforcardinself.current_cards]self.solution=solve_24([(n,str(n))fornincard_numbers])card_positions=[(100,140),(290,140),(470,140),(650,140)]fori,cardinenumerate(self.current_cards):self.draw_card(card_positions[i][0],card_positions[i][1],card)self.answer_var.set("")defshow_answer(self):ifself.solution:self.answer_var.set(f"答案:{self.solution}= 24")else:self.answer_var.set("当前牌面无解!")if__name__=="__main__":root=tk.Tk()app=Game24App(root)root.mainloop()