怎么使用Python+Pygame实现简单的单词小游戏

免费教程   2024年04月03日 23:25  

本篇内容主要讲解“怎么使用Python+Pygame实现简单的单词小游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python+Pygame实现简单的单词小游戏”吧!

一、环境准备

1)运行环境

环境安装: 3.8: 解释器、pycharm: 代码编辑器、、numpy、部分自带的模块直接安装Python就可以使用了。

2)模块安装

第三方库的安装方式如下:

一般安装:pip install +模块名 镜像源安装:pip install -i

pypi.douban.com/simple/+模块名 (还有很多国内镜像源,这里是豆瓣的用习惯了)

3)图片文字素材等

二、代码展示

主程序——

importpygameimportsysimporttracebackimportosfrompygame.localsimport*fromrandomimport*importnumpyasnpimportlinecachepygame.init()#游戏初始化pygame.mixer.init()#音效初始化bg_size=width,height=480,700#屏幕大小screen=pygame.display.set_mode(bg_size)pygame.display.set_caption("英语单词挑战")##背景图片background=pygame.image.load("source/背景.png")#.convert()BLACK=(0,0,0)WHITE=(255,255,255)GREEN=(0,255,0)RED=(255,0,0)#游戏音乐pygame.mixer.music.load("source/背景音乐.mp3")pygame.mixer.music.set_volume(0.2)success_sound=pygame.mixer.Sound("source/正确.wav")success_sound.set_volume(0.2)lost_sound=pygame.mixer.Sound("source/失败.wav")lost_sound.set_volume(0.2)win_sound=pygame.mixer.Sound("source/胜利.wav")win_sound.set_volume(0.2)classWord(pygame.sprite.Sprite):def__init__(self,bg_size,showword):pygame.sprite.Sprite.__init__(self)self.word=showword#获取单词self.length=len(self.word)#单词长度self.wordfont=pygame.font.SysFont("arial",36)#使用系统字体self.wordtext=self.wordfont.render(self.word,True,WHITE,BLACK)#单词self.promptword="*"*self.lengthself.showtext=self.wordfont.render(self.promptword,True,WHITE,BLACK)#隐藏单词self.succtext=self.wordfont.render("",True,WHITE)self.rect=self.wordtext.get_rect()#单词坐标self.width,self.height=bg_size[0],bg_size[1]self.rect.left,self.rect.top=(self.width-self.rect.width)//2,20#定义坐标self.speed=1#下移速度#self.destroy_images=[]#self.destroy_images.extend([pygame.image.load("爆炸小.png").convert_alpha()])self.active=True#活动标志self.success=False#正确标志#判断输入字母是否正确,并显示defshow(self,a):foriinrange(self.length):ifself.promptword[i]=="*":ifself.word[i]==a:self.promptword=self.promptword[:i]+a+self.promptword[i+1:]self.showtext=self.wordfont.render(self.promptword,True,WHITE,BLACK)#隐藏单词ifself.promptword==self.word:self.success=Truebreakelse:continue#单词移动defmove(self):ifself.rect.top<self.height-50:self.rect.top+=self.speedelse:self.reset()#单词重置defreset(self):self.active=Trueself.success=Falseself.rect.left,self.rect.top=(self.width-self.rect.width)//2,20#中文提示defdescribe(self,prop):myprop=propself.propfont=pygame.font.Font("source/楷体_GB2312.ttf",20)#使用楷体字体#print(myprop)self.describetext=self.propfont.render(myprop,True,BLACK)#中文提示self.proprect=self.describetext.get_rect()#提示坐标self.proprect.left,self.proprect.top=(self.width-self.proprect.width)//2,(self.height-30-self.proprect.height/2)screen.blit(self.describetext,self.proprect)#获取单词,读取字典文件defGetletters(filename):words=[]#保存单词prompts=[]#保存中文提示worddict={}#单词字典f=open(filename,encoding='utf-8')#打开文本,定义格式,能够读取中文forlineinf.readlines():#读取行line=line.strip()#去掉/nword=line.split(":")[0]#截取单词prompt=line.split(":")[1]#.split(";")[0]#截取中文提示words.append(word)prompts.append(prompt)worddict.update({word:prompt})#字典添加元素f.close()returnworddict#保存字典文件defSaveDict(dict1,filename):#打开字典文件withopen(filename,mode='w',encoding='utf-8')asf:fork,vindict1.items():str=f"{k}:{v}\n"f.write(str)f.close()#随机抽取字典的数据defChoseWord(dict1):n=len(dict1)random.choice(list(dict1.keys()))words=dict1.keys()prompts=dict1.values()i=randint(0,n)key=words[i]value=prompts[i]returnkey,value#主函数defmain():pygame.mixer.music.play(-1)#播放背景音乐running=True#判断运行状态clock=pygame.time.Clock()#时钟delay=100olingefile="source/words.txt"#原始单词文件myfile="source/newword.txt"#使用单词文件historyfile="source/record.txt"#最高记录文件olindict=Getletters(olingefile)#获取原始单词num=len(olindict)#总单词数量#getnum=0#record_score=0#最高得分记录#record_rate=0.00#最高进度myfont_big=pygame.font.SysFont("arial",36)#使用系统大字体myfont_small=pygame.font.SysFont("arial",24)#使用系统小字体#标志是否暂停游戏paused=Falsepaused_image=pygame.image.load("source/暂停.png").convert_alpha()resume_image=pygame.image.load("source/播放.png").convert_alpha()paused_rect=paused_image.get_rect()paused_rect.left,paused_rect.top=width-paused_rect.width-10,10paused_show_image=paused_image#主页mained=False#主页标志main_image=pygame.image.load("source/主页.png").convert_alpha()main_rect=main_image.get_rect()main_rect.left,main_rect.top=width-paused_rect.width-70,10#成功页面success_image=pygame.image.load("source/成功.png").convert_alpha()#底部页面bottom_image=pygame.image.load("source/底部.png").convert_alpha()#统计得分#score=0#当前得分#rate=0.00#当前进度#主页面goon_image=pygame.image.load("source/继续游戏.png").convert_alpha()goon_rect=goon_image.get_rect()restart_image=pygame.image.load("source/重新开始.png").convert_alpha()restart_rect=restart_image.get_rect()gameover_image=pygame.image.load("source/结束游戏.png").convert_alpha()gameover_rect=gameover_image.get_rect()flag=False#新单词标记promptflag=False#空格提示单词标记nextflag=False#回车下一个单词标记winflag=False#胜利标志keyvalue=""#获取按键ifos.path.exists(myfile)andos.path.exists(historyfile):#如果有记录mydict=Getletters(myfile)getnum=num-len(mydict)#完成数量mained=Truewithopen(historyfile,mode='r',encoding='utf-8')asf:record_score=int(linecache.getline(historyfile,1))#读取最高记录record_rate=float(linecache.getline(historyfile,2))#读取最高进度score=int(linecache.getline(historyfile,3))#读取上一次记录f.close()#print(record_score,record_rate)else:mydict=Getletters(olingefile)getnum=0score=0rate=0.00record_score=scorerecord_rate=ratemained=Falsewhilerunning:foreventinpygame.event.get():ifevent.type==QUIT:#退出#写入记录文件withopen(historyfile,mode='w',encoding='utf-8')asf:f.write(str(record_score))f.write("\n")f.write(str(record_rate))f.write("\n")f.write(str(score))f.close()#保存剩余单词SaveDict(mydict,myfile)pygame.quit()sys.exit()elifevent.type==MOUSEBUTTONDOWN:#鼠标按下#按下暂停键ifevent.button==1andpaused_rect.collidepoint(event.pos):#检测鼠标是否在范围内paused=notpausedifpaused:pygame.mixer.music.pause()#背景音乐暂停pygame.mixer.pause()#音效暂停paused_show_image=resume_imageelse:pygame.mixer.music.unpause()#背景音乐暂停pygame.mixer.unpause()#音效暂停paused_show_image=paused_image#按下主页键ifevent.button==1andmain_rect.collidepoint(event.pos):#检测鼠标是否在范围内mained=Trueifmained:pygame.mixer.music.pause()#背景音乐暂停pygame.mixer.pause()#音效暂停elifevent.type==KEYDOWN:#按键ifevent.key==K_TAB:#tab键promptflag=Trueelifevent.key==K_RETURN:#回车键nextflag=Trueelse:keyvalue=chr(event.key)#获取ASCII码转字符串screen.blit(background,(0,0))#载入背景图片screen.blit(bottom_image,(0,height-60))#载入底部图片#绘制得分score_text=myfont_big.render(f"score:{str(score)}",True,WHITE)screen.blit(score_text,(10,5))#暂停/播放screen.blit(paused_show_image,paused_rect)#暂停图片#绘制主页screen.blit(main_image,main_rect)#主页图片#绘制进度pygame.draw.rect(screen,WHITE,((10,60),(200,20)),2)#画矩形,坐标(10,60),长宽(200,20),线宽2#当进度大于80%显示绿色,否则显示红色rate=getnum/numifrate>0.8:rate_color=GREENelse:rate_color=REDpygame.draw.rect(screen,rate_color,((10,60),(200*rate,20)),0)#填充remaintext=myfont_small.render(f"{rate*100:.2f}%",True,WHITE)screen.blit(remaintext,(220,55))ifnotpausedandnotmained:ifnotflag:#生成单词showword=np.random.choice(list(mydict.keys()))#随机选择单词showprompt=mydict[showword]#单词中文提示#print(showword,showprompt)myword=Word(bg_size,showword)#生成单词flag=True#新单词else:myword.move()#单词向下移动myword.describe(showprompt)myword.show(keyvalue)#获取键盘按键ifpromptflag:screen.blit(myword.wordtext,myword.rect)else:screen.blit(myword.showtext,myword.rect)#成功ifmyword.success:screen.blit(myword.succtext,myword.rect)#清空screen.blit(success_image,myword.rect)#成功图片success_sound.play()ifnot(delay%10):#延时myword.reset()flag=Falsescore+=5getnum+=1delmydict[showword]ifgetnum==num:winflag=Truemained=Trueifnextflag:myword.reset()flag=Falsenextflag=Falseifmyword.rect.top>height-118:lost_sound.play()flag=Falsescore-=2#暂停时elifpausedandnotmained:myword.active=Falsescreen.blit(myword.showtext,myword.rect)myword.describe(showprompt)#显示主页elifmainedandnotwinflag:#myword.active=Falsescreen.blit(background,(0,0))#载入背景图片#绘制结束界面#更新最高分ifscore>record_score:record_score=score#更新进度ifrate>record_rate:record_rate=rate#最高分record_score_text=myfont_big.render(f"HighestScore:{record_score}",True,WHITE)screen.blit(record_score_text,(50,50))#最高进度record_rate_text=myfont_big.render(f"HighestRate:{record_rate*100:.2f}%",True,WHITE)screen.blit(record_rate_text,(50,100))#当前得分nowscore_text1=myfont_big.render("YourScore:",True,WHITE)nowscore_text1_rect=nowscore_text1.get_rect()nowscore_text1_rect.left,nowscore_text1_rect.top=50,150screen.blit(nowscore_text1,nowscore_text1_rect)nowscore_text2=myfont_big.render(str(score),True,RED)nowscore_text2_rect=nowscore_text2.get_rect()nowscore_text2_rect.left,nowscore_text2_rect.top=50+nowscore_text1_rect.width,nowscore_text1_rect.topscreen.blit(nowscore_text2,nowscore_text2_rect)#当前进度nowrate_text1=myfont_big.render("YourRate:",True,WHITE)nowrate_text1_rect=nowrate_text1.get_rect()nowrate_text1_rect.left,nowrate_text1_rect.top=50,200screen.blit(nowrate_text1,nowrate_text1_rect)nowrate_text2=myfont_big.render(f"{rate*100:.2f}%",True,RED)nowrate_text2_rect=nowrate_text2.get_rect()nowrate_text2_rect.left,nowrate_text2_rect.top=50+nowrate_text1_rect.width,nowrate_text1_rect.topscreen.blit(nowrate_text2,nowrate_text2_rect)#继续游戏goon_rect.left,goon_rect.top=(width-goon_rect.width)//2,300screen.blit(goon_image,goon_rect)#重新开始restart_rect.left,restart_rect.top=(width-restart_rect.width)//2,goon_rect.bottom+20screen.blit(restart_image,restart_rect)#结束游戏gameover_rect.left,gameover_rect.top=(width-gameover_rect.width)//2,restart_rect.bottom+20screen.blit(gameover_image,gameover_rect)#检测用户鼠标操作#如果用户按下鼠标左键ifpygame.mouse.get_pressed()[0]:#获取鼠标位置pos=pygame.mouse.get_pos()#如果用户点击继续游戏ifgoon_rect.left<pos[0]<goon_rect.rightandgoon_rect.top<pos[1]<goon_rect.bottom:#跳出主页面mained=False#重新开始elifrestart_rect.left<pos[0]<restart_rect.rightandrestart_rect.top<pos[1]<restart_rect.bottom:#判断最高记录是否更新,保存记录ifscore>record_score:record_score=score#写入记录文件withopen(historyfile,mode='w',encoding='utf-8')asf:f.write(str(record_score))f.write("\n")f.write(str(record_rate))f.close()#保存剩余单词SaveDict(mydict,myfile)#退出主页mained=Falsescore=0mydict=Getletters(olingefile)#获取原始单词getnum=0#如果用户点击结束游戏elifgameover_rect.left<pos[0]<gameover_rect.rightandgameover_rect.top<pos[1]<gameover_rect.bottom:#写入记录文件withopen(historyfile,mode='w',encoding='utf-8')asf:f.write(str(record_score))f.write("\n")f.write(str(record_rate))f.write("\n")f.write(str(score))f.close()#保存剩余单词SaveDict(mydict,myfile)#退出游戏pygame.quit()sys.exit()else:#screen.blit(background,(0,0))#载入背景图片pygame.mixer.music.pause()#背景音乐暂停win_sound.play()win_text=myfont_big.render("Congratulations!YouWIN!!!",True,WHITE)screen.blit(win_text,(50,300))#时间间隔delay-=1ifnotdelay:delay=50promptflag=Falsepygame.display.flip()#页面刷新clock.tick(60)if__name__=="__main__":try:main()exceptSystemExit:passexcept:traceback.print_exc()pygame.quit()input()

到此,相信大家对“怎么使用Python+Pygame实现简单的单词小游戏”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部