
WangY_ZQPython实现小时候玩“24”的游戏游戏界面规格窗口尺寸800 × 500游戏区域800 × 450显示扑克牌按钮区域800 × 50位于最下方游戏功能 4种花色 方片(♦)、黑桃(♠)、梅花(♣)、红桃(♥)数字1-10共40张牌 随机发牌 每次从40张牌中随机抽取4张 图形化展示 Canvas绘制精美的扑克牌包含花色符号、数字和边框 答案按钮 点击后显示一个正确解法若无解则提示当前牌面无解 新游戏 重新发牌 退出 关闭游戏界面优化背景色护眼绿色 #c8e6c9答案标签深绿色文字与背景形成良好对比度按钮布局三个按钮均匀分布在底部区域importtkinterastkfromtkinterimportttkimportrandom SUITS{方片:\u2666,黑桃:\u2660,梅花:\u2663,红桃:\u2665}SUIT_COLORS{方片:red,黑桃:black,梅花:black,红桃:red}RANKSlist(range(1,11))BG_COLOR#81c784classCard:def__init__(self,suit,rank):self.suitsuit self.rankrankdef__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)):ifij:continuen1,expr1numbers[i]n2,expr2numbers[j]remaining[numbers[k]forkinrange(len(numbers))ifk!iandk!j]resultsolve_24([(n1n2,f({expr1}{expr2}))]remaining)ifresult:returnresult resultsolve_24([(n1-n2,f({expr1}-{expr2}))]remaining)ifresult:returnresult resultsolve_24([(n1*n2,f({expr1}*{expr2}))]remaining)ifresult:returnresultifn2!0:resultsolve_24([(n1/n2,f({expr1}/{expr2}))]remaining)ifresult:returnresultreturnNoneclassGame24App:def__init__(self,root):self.rootroot self.root.title(乐算24)self.root.geometry(800x500)self.root.resizable(False,False)self.deckgenerate_deck()self.current_cards[]self.solutionNoneself.game_framettk.Frame(root,width800,height450)self.game_frame.pack(fillboth,expandTrue)self.game_frame.pack_propagate(False)self.canvastk.Canvas(self.game_frame,width800,height450,bgBG_COLOR)self.canvas.pack(fillboth,expandTrue)self.btn_framettk.Frame(root,width800,height50)self.btn_frame.pack(fillx)self.btn_frame.pack_propagate(False)self.answer_vartk.StringVar()self.answer_labelttk.Label(self.game_frame,textvariableself.answer_var,font(Arial,14),foregroundred,backgroundBG_COLOR)self.answer_label.place(x400,y420,anchorcenter)self.btn_newttk.Button(self.btn_frame,text新游戏,commandself.new_game,width15)self.btn_new.pack(sideleft,padx85,pady10)self.btn_answerttk.Button(self.btn_frame,text答案,commandself.show_answer,width15)self.btn_answer.pack(sideleft,padx85,pady10)self.btn_exitttk.Button(self.btn_frame,text退出,commandroot.quit,width15)self.btn_exit.pack(sideleft,padx85,pady10)self.new_game()defdraw_card(self,x,y,card):card_width120card_height170self.canvas.create_rectangle(x,y,xcard_width,ycard_height,fillwhite,outlineblack,width2)self.canvas.create_rectangle(x5,y5,xcard_width-5,ycard_height-5,fillwhite,outlinegray,width1)suit_symbolSUITS[card.suit]colorSUIT_COLORS[card.suit]self.canvas.create_text(x20,y30,textstr(card.rank),font(Arial,24,bold),fillcolor)self.canvas.create_text(x20,y60,textsuit_symbol,font(Arial,32),fillcolor)self.canvas.create_text(xcard_width-20,ycard_height-30,textstr(card.rank),font(Arial,24,bold),fillcolor,angle180)self.canvas.create_text(xcard_width-20,ycard_height-60,textsuit_symbol,font(Arial,32),fillcolor,angle180)center_xxcard_width//2center_yycard_height//2self.canvas.create_text(center_x,center_y-10,textsuit_symbol,font(Arial,56),fillcolor)defnew_game(self):self.canvas.delete(all)self.canvas.create_rectangle(0,0,800,450,fillBG_COLOR)self.current_cardsrandom.sample(self.deck,4)card_numbers[card.rankforcardinself.current_cards]self.solutionsolve_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__:roottk.Tk()appGame24App(root)root.mainloop()