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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。