Python+Pygame怎么实现24点游戏
这篇文章主要介绍了Python+Pygame怎么实现24点游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python+Pygame怎么实现24点游戏文章都会有所收获,下面我们一起来看看吧。
游戏介绍
(1)什么是24点游戏
棋牌类益智游戏,要求结果等于二十四
(2)游戏规则
任意抽取4个数字(1——10),用加、减、乘、除(可加括号)把出现的数算成24。每个数字必须用一次且只能用一次。“算24点”作为一种锻炼思维的智力游戏,还应注意计算中的技巧问题。计算时,我们不可能把牌面上的4个数的不同组合形式——去试,更不能瞎碰乱凑。
例:3、8、8、9
答案:3×8÷(9-8)=24
实现代码
1.定义游戏这部分代码小写game.py文件
'''定义游戏'''importcopyimportrandomimportpygame'''Function:卡片类InitialArgs:--x,y:左上角坐标--width:宽--height:高--text:文本--font:[字体路径,字体大小]--font_colors(list):字体颜色--bg_colors(list):背景色'''classCard(pygame.sprite.Sprite):def__init__(self,x,y,width,height,text,font,font_colors,bg_colors,attribute,**kwargs):pygame.sprite.Sprite.__init__(self)self.rect=pygame.Rect(x,y,width,height)self.text=textself.attribute=attributeself.font_info=fontself.font=pygame.font.Font(font[0],font[1])self.font_colors=font_colorsself.is_selected=Falseself.select_order=Noneself.bg_colors=bg_colors'''画到屏幕上'''defdraw(self,screen,mouse_pos):pygame.draw.rect(screen,self.bg_colors[1],self.rect,0)ifself.rect.collidepoint(mouse_pos):pygame.draw.rect(screen,self.bg_colors[0],self.rect,0)font_color=self.font_colors[self.is_selected]text_render=self.font.render(self.text,True,font_color)font_size=self.font.size(self.text)screen.blit(text_render,(self.rect.x+(self.rect.width-font_size[0])/2,self.rect.y+(self.rect.height-font_size[1])/2))'''按钮类'''classButton(Card):def__init__(self,x,y,width,height,text,font,font_colors,bg_colors,attribute,**kwargs):Card.__init__(self,x,y,width,height,text,font,font_colors,bg_colors,attribute)'''根据buttonfunction执行响应操作'''defdo(self,game24_gen,func,sprites_group,objs):ifself.attribute=='NEXT':forobjinobjs:obj.font=pygame.font.Font(obj.font_info[0],obj.font_info[1])obj.text=obj.attributeself.font=pygame.font.Font(self.font_info[0],self.font_info[1])self.text=self.attributegame24_gen.generate()sprites_group=func(game24_gen.numbers_now)elifself.attribute=='RESET':forobjinobjs:obj.font=pygame.font.Font(obj.font_info[0],obj.font_info[1])obj.text=obj.attributegame24_gen.numbers_now=game24_gen.numbers_origame24_gen.answers_idx=0sprites_group=func(game24_gen.numbers_now)elifself.attribute=='ANSWERS':self.font=pygame.font.Font(self.font_info[0],20)self.text='[%d/%d]:'%(game24_gen.answers_idx+1,len(game24_gen.answers))+game24_gen.answers[game24_gen.answers_idx]game24_gen.answers_idx=(game24_gen.answers_idx+1)%len(game24_gen.answers)else:raiseValueError('Button.attributeunsupport%s,expect%s,%sor%s...'%(self.attribute,'NEXT','RESET','ANSWERS'))returnsprites_group'''24点游戏生成器'''classgame24Generator():def__init__(self):self.info='game24Generator''''生成器'''defgenerate(self):self.__reset()whileTrue:self.numbers_ori=[random.randint(1,10)foriinrange(4)]self.numbers_now=copy.deepcopy(self.numbers_ori)self.answers=self.__verify()ifself.answers:break'''只剩下一个数字时检查是否为24'''defcheck(self):iflen(self.numbers_now)==1andfloat(self.numbers_now[0])==self.target:returnTruereturnFalse'''重置'''def__reset(self):self.answers=[]self.numbers_ori=[]self.numbers_now=[]self.target=24.self.answers_idx=0'''验证生成的数字是否有答案'''def__verify(self):answers=[]foriteminself.__iter(self.numbers_ori,len(self.numbers_ori)):item_dict=[]list(map(lambdai:item_dict.append({str(i):i}),item))solution1=self.__func(self.__func(self.__func(item_dict[0],item_dict[1]),item_dict[2]),item_dict[3])solution2=self.__func(self.__func(item_dict[0],item_dict[1]),self.__func(item_dict[2],item_dict[3]))solution=dict()solution.update(solution1)solution.update(solution2)forkey,valueinsolution.items():iffloat(value)==self.target:answers.append(key)#避免有数字重复时表达式重复(T_T懒得优化了)answers=list(set(answers))returnanswers'''递归枚举'''def__iter(self,items,n):foridx,iteminenumerate(items):ifn==1:yield[item]else:foreachinself.__iter(items[:idx]+items[idx+1:],n-1):yield[item]+each'''计算函数'''def__func(self,a,b):res=dict()forkey1,value1ina.items():forkey2,value2inb.items():res.update({'('+key1+'+'+key2+')':value1+value2})res.update({'('+key1+'-'+key2+')':value1-value2})res.update({'('+key2+'-'+key1+')':value2-value1})res.update({'('+key1+'×'+key2+')':value1*value2})value2>0andres.update({'('+key1+'÷'+key2+')':value1/value2})value1>0andres.update({'('+key2+'÷'+key1+')':value2/value1})returnres
2.游戏主函数
defmain():#初始化,导入必要的游戏素材pygame.init()pygame.mixer.init()screen=pygame.display.set_mode(SCREENSIZE)pygame.display.set_caption('24点小游戏')win_sound=pygame.mixer.Sound(AUDIOWINPATH)lose_sound=pygame.mixer.Sound(AUDIOLOSEPATH)warn_sound=pygame.mixer.Sound(AUDIOWARNPATH)pygame.mixer.music.load(BGMPATH)pygame.mixer.music.play(-1,0.0)#24点游戏生成器game24_gen=game24Generator()game24_gen.generate()#精灵组#--数字number_sprites_group=getNumberSpritesGroup(game24_gen.numbers_now)#--运算符operator_sprites_group=getOperatorSpritesGroup(OPREATORS)#--按钮button_sprites_group=getButtonSpritesGroup(BUTTONS)#游戏主循环clock=pygame.time.Clock()selected_numbers=[]selected_operators=[]selected_buttons=[]is_win=FalsewhileTrue:foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit()sys.exit(-1)elifevent.type==pygame.MOUSEBUTTONUP:mouse_pos=pygame.mouse.get_pos()selected_numbers=checkClicked(number_sprites_group,mouse_pos,'NUMBER')selected_operators=checkClicked(operator_sprites_group,mouse_pos,'OPREATOR')selected_buttons=checkClicked(button_sprites_group,mouse_pos,'BUTTON')screen.fill(AZURE)#更新数字iflen(selected_numbers)==2andlen(selected_operators)==1:noselected_numbers=[]foreachinnumber_sprites_group:ifeach.is_selected:ifeach.select_order=='1':selected_number1=each.attributeelifeach.select_order=='2':selected_number2=each.attributeelse:raiseValueError('Unknowselect_order%s,expect1or2...'%each.select_order)else:noselected_numbers.append(each.attribute)each.is_selected=Falseforeachinoperator_sprites_group:each.is_selected=Falseresult=calculate(selected_number1,selected_number2,*selected_operators)ifresultisnotNone:game24_gen.numbers_now=noselected_numbers+[result]is_win=game24_gen.check()ifis_win:win_sound.play()ifnotis_winandlen(game24_gen.numbers_now)==1:lose_sound.play()else:warn_sound.play()selected_numbers=[]selected_operators=[]number_sprites_group=getNumberSpritesGroup(game24_gen.numbers_now)#精灵都画到screen上foreachinnumber_sprites_group:each.draw(screen,pygame.mouse.get_pos())foreachinoperator_sprites_group:each.draw(screen,pygame.mouse.get_pos())foreachinbutton_sprites_group:ifselected_buttonsandselected_buttons[0]in['RESET','NEXT']:is_win=Falseifselected_buttonsandeach.attribute==selected_buttons[0]:each.is_selected=Falsenumber_sprites_group=each.do(game24_gen,getNumberSpritesGroup,number_sprites_group,button_sprites_group)selected_buttons=[]each.draw(screen,pygame.mouse.get_pos())#游戏胜利ifis_win:showInfo('Congratulations',screen)#游戏失败ifnotis_winandlen(game24_gen.numbers_now)==1:showInfo('GameOver',screen)pygame.display.flip()clock.tick(30)
游戏效果展示
关于“Python+Pygame怎么实现24点游戏”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Python+Pygame怎么实现24点游戏”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注主机评测网行业资讯频道。
webacc.exe是什么文件?webacc.exe是不是病毒
WINSYS.vbs是什么文件?WINSYS.vbs是不是病毒
winssh.exe是什么文件?winssh.exe是不是病毒
wt.exe是什么文件?wt.exe是不是病毒
winsysetm.exe是什么文件?winsysetm.exe是不是病毒
winstrve.exe是什么文件?winstrve.exe是不是病毒
winsysupd7.exe是什么文件?winsysupd7.exe是不是病毒
winsysupd.exe是什么文件?winsysupd.exe是不是病毒
winsysupd2.exe是什么文件?winsysupd2.exe是不是病毒
winsysupd8.exe是什么文件?winsysupd8.exe是不是病毒