pygame实现成语填空游戏
最近看到很多人玩成语填字游戏,那么先用pygame来做一个吧,花了大半天终于完成了,附下效果图。
偷了下懒程序没有拆分,所有程序写在一个文件里,主要代码如下:
#-*-coding=utf-8-*- importsys importrandom importpygame frompygame.localsimport* reload(sys) sys.setdefaultencoding('utf-8') f=open('words.txt') all_idiom=f.readlines() f.close() word_dic={} foridiominall_idiom: idiom=idiom.strip().decode('utf-8') forwordinidiom: ifwordnotinword_dic: word_dic[word]=[idiom] else: word_dic[word].append(idiom) word_arr=list(word_dic.keys()) header_height=30 main_space=20 block_size=36 block_num=12 bspace=2 space=20 width=block_size*block_num+main_space*2 height=header_height+block_size*block_num+main_space*2+(block_size+space)*3 pygame.init() screen=pygame.display.set_mode((width,height)) screencaption=pygame.display.set_caption(u'成语填空') font=pygame.font.Font(u'syht.otf',int(block_size*0.8)) dray_gray=50,50,50 white=255,255,255 #textImage=font.render(u'你好',True,white) classIdiomInfo(object): def__init__(self,idiom): self.idiom=idiom self.dire=0 self.word_arr=[] classWordInfo(object): def__init__(self,word,i,j): self.i=i self.j=j self.word=word self.is_lock=True self.state=-1 self.hide_index=-1 self.op_hide_index=-1 classMatrix(object): rows=0 cols=0 data=[] def__init__(self,rows,cols,data=None): self.rows=rows self.cols=cols ifdataisNone:data=[Noneforiinrange(rows*cols)] self.data=data defset_val(self,x,y,val): self.data[y*self.cols+x]=val defget_val(self,x,y): returnself.data[y*self.cols+x] defexist_val_four_around(self,x,y,ignore_set): move_arr=[(-1,0),(1,0),(0,-1),(0,1)] fordx,dyinmove_arr: tx=x+dx ty=y+dy if(tx,ty)inignore_set:continue iftx<0ortx>=self.colsorty<0orty>=self.rows:continue ifself.data[ty*self.cols+tx]:returnTrue returnFalse defcheck_new_idiom(matrix,new_idiom,new_dire,word_info): windex=new_idiom.index(word_info.word) cx,cy=word_info.i,word_info.j ignore_set=set([(cx,cy)]) new_idiom_word_arr=[] foriinrange(-windex,-windex+len(new_idiom)): ifi==0: new_idiom_word_arr.append(word_info) else: tx=cx+iifnew_dire==0elsecx iftx<0ortx>=block_num:returnNone,None ty=cyifnew_dire==0elsecy+i ifty<0orty>=block_num:returnNone,None ifmatrix.exist_val_four_around(tx,ty,ignore_set):returnNone,None old_word_info=matrix.get_val(tx,ty) ifold_word_info: returnNone,None new_word_info=WordInfo(new_idiom[i+windex],tx,ty) new_idiom_word_arr.append(new_word_info) returnnew_idiom_word_arr,windex defadd_idiom_to_matrix(matrix,word_dic,idiom_dic,idiom_num): ifidiom_num==0:return0 foridiom,idiom_infoinidiom_dic.items(): dire=idiom_info.dire new_dire=1-dire forword_infoinidiom_info.word_arr: word=word_info.word idiom_list=word_dic[word] fornew_idiominidiom_list: ifnew_idiominidiom_dic:continue new_idiom_word_arr,windex=check_new_idiom(matrix,new_idiom,new_dire,word_info) ifnew_idiom_word_arr: new_idiom_info=IdiomInfo(new_idiom) new_idiom_info.dire=new_dire fornew_indexinrange(len(new_idiom_word_arr)): new_word_info=new_idiom_word_arr[new_index] ifnew_index==windex: new_idiom_info.word_arr.append(word_info) else: matrix.set_val(new_word_info.i,new_word_info.j,new_word_info) new_idiom_info.word_arr.append(new_word_info) idiom_dic[new_idiom]=new_idiom_info returnlen(new_idiom)-1+add_idiom_to_matrix(matrix,word_dic,idiom_dic,idiom_num-1) return0 defget_idiom_matrix(word_arr,word_dic,idiom_num): cx=4 cy=4 matrix=Matrix(block_num,block_num) n=random.randint(0,len(word_arr)-1) word=word_arr[n] idiom=word_dic[word][0] idiom_dic={} idiom_dic[idiom]=IdiomInfo(idiom) wn=len(idiom) last_i=-100 foriinrange(len(idiom)): word_info=WordInfo(idiom[i],cx-1+i,cy) matrix.set_val(cx-1+i,cy,word_info) idiom_dic[idiom].word_arr.append(word_info) wn+=add_idiom_to_matrix(matrix,word_dic,idiom_dic,idiom_num-1) returnmatrix,idiom_dic,wn bg_image=pygame.image.load('bg.jpeg') bg_image=pygame.transform.scale(bg_image,(width,height)) bg2_image=pygame.image.load('bg2.jpeg') bg2_image=pygame.transform.scale(bg2_image,(block_size*block_num,block_size*block_num)) block_bg_image=pygame.image.load('tzg.jpg') block_bg_image=pygame.transform.scale(block_bg_image,(block_size-bspace*2,block_size-bspace*2)) defget_hide_arr(matrix,idiom_dic,all_word_num,percent): hide_arr=[] fork,vinidiom_dic.items(): n=random.randint(0,len(v.word_arr)-1) word_info=v.word_arr[n] ifword_info.hide_index!=-1:continue word=word_info.word info=matrix.get_val(word_info.i,word_info.j) info.word='' info.hide_index=len(hide_arr) info.is_lock=False hide_arr.append([word_info.i,word_info.j,word,None]) tmp_arr=[] foriinrange(block_num): forjinrange(block_num): info=matrix.get_val(i,j) ifinfoandinfo.word: tmp_arr.append((i,j,info.word)) whilelen(hide_arr)0: tmp_idiom_str+=word iflen(tmp_idiom_str)==len(idiom): state=1iftmp_idiom_str==idiomelse2 else: state=0 forword_infoinword_arr: ifword_info.state!=1:word_info.state=state foridiom,idiom_infoinidiom_dic.items(): word_arr=idiom_info.word_arr forword_infoinword_arr: ifword_info.state!=1: returnFalse returnTrue stage=1 definit(new_stage): idiom_num=(new_stage/5)+3 ifnew_stage>100: percent=0.7 else: percent=0.2+(new_stage*1.0/100)*(0.7-0.2) matrix,idiom_dic,all_word_num=get_idiom_matrix(word_arr,word_dic,idiom_num) hide_arr=get_hide_arr(matrix,idiom_dic,all_word_num,percent) select_rect=hide_arr[0][0],hide_arr[0][1] stage_textImage=pygame.font.Font(u'syht.otf',30).render(u'第%s关'%new_stage,True,dray_gray) returnmatrix,idiom_dic,all_word_num,hide_arr,select_rect,stage_textImage matrix,idiom_dic,all_word_num,hide_arr,select_rect,stage_textImage=init(stage) stage_font_width,stage_font_height=stage_textImage.get_size() stage_x=(width-stage_font_width)/2 stage_y=(header_height-stage_font_height)/2+main_space/2 whileTrue: foreventinpygame.event.get(): ifevent.type==pygame.QUIT: pygame.quit() exit() ifevent.type==MOUSEBUTTONDOWN: pressed_array=pygame.mouse.get_pressed() ifpressed_array[0]: x,y=pygame.mouse.get_pos() foriinrange(block_num): forjinrange(block_num): bx=main_space+block_size*i+bspace by=header_height+main_space+block_size*j+bspace ifx>=bxandx<=bx+block_size-bspace*2andy>=byandy<=by+block_size-bspace*2: info=matrix.get_val(i,j) ifinfoandinfo.state!=1andinfo.hide_index>=0: ifinfo.op_hide_index>=0: hide_arr[info.op_hide_index][-1]=None info.word='' info.op_hide_index=-1 check_idiom() select_rect=i,j break sx=main_space sy=header_height+main_space+block_size*block_num+space n=0 forhiinrange(len(hide_arr)): tmp_x=sx+(n%block_num)*block_size tmp_y=sy+(n/block_num)*block_size ifhide_arr[hi][-1]isNoneandx>=tmp_xandx<=tmp_x+block_size-bspace*2andy>=tmp_yandy<=tmp_y+block_size-bspace*2: info=matrix.get_val(select_rect[0],select_rect[1]) info.word=hide_arr[hi][2] info.op_hide_index=hi info.state=0 hide_arr[hi][-1]=select_rect new_select_rect=get_next_select(matrix,select_rect[0],select_rect[1]) select_rect=new_select_rect flag=check_idiom() ifflag: stage+=1 matrix,idiom_dic,all_word_num,hide_arr,select_rect,stage_textImage=init(stage) break n+=1 screen.blit(bg_image,(0,0)) screen.blit(stage_textImage,(stage_x,stage_y)) panel=screen.subsurface((main_space,header_height+main_space,block_size*block_num,block_size*block_num)) panel.blit(bg2_image,(0,0)) foriinrange(block_num): forjinrange(block_num): info=matrix.get_val(i,j) ifinfoisnotNone: bx=block_size*i+bspace by=block_size*j+bspace panel.blit(block_bg_image,(bx,by)) ifinfo.state==1: textImage=font.render(info.word,True,(30,144,30)) elifinfo.state==2: textImage=font.render(info.word,True,(255,0,0)) elifinfo.is_lock==1: textImage=font.render(info.word,True,(150,150,150)) else: textImage=font.render(info.word,True,dray_gray) tw,th=textImage.get_size() dx=(block_size-bspace*2-tw)/2 dy=(block_size-bspace*2-th)/2 panel.blit(textImage,(bx+dx,by+dy)) if(i,j)==select_rect: pygame.draw.rect(panel,(255,0,0),(bx,by,block_size-bspace*2,block_size-bspace*2),2) sx=main_space sy=header_height+main_space+block_size*block_num+space n=0 fori,j,word,opinhide_arr: screen.blit(block_bg_image,(sx+(n%block_num)*block_size,sy+(n/block_num)*block_size)) ifopisNone: textImage=font.render(word,True,dray_gray) tw,th=textImage.get_size() dx=(block_size-bspace*2-tw)/2 dy=(block_size-bspace*2-th)/2 screen.blit(textImage,(dx+sx+(n%block_num)*block_size,dy+sy+(n/block_num)*block_size)) n+=1 pygame.display.update()
代码就这么多了,不过这边用到几个额外的依赖:
bg.jpeg用于做整个界面的背景
bg2.jpeg用于做上半部分的背景
tzg.jpg每个文字的格子的背景
words.txt一个成语的列表文件(每行一条成语),如果换成诗词或者歇后语什么的也是没有问题的
syht.otf一个字体库,用于正常显示中文
如果闲格子太多或者太小,可以调一下这两个参数
block_size=32 block_num=12
block_size表示格子的大小
block_num上半部分的区域横竖最多显示多少个格子
block_size=26,block_num=18的效果图:
block_size=40,block_num=10的效果图:
完整的资源已经上传:guess_idiom
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。