侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

使用pygame写一个古诗词填空通关游戏

Python  /  管理员 发布于 5年前   310

之前写的诗词填空的游戏支持python2,现在对程序进行了修改,兼容支持python2和python3,附下效果图。

下面是两个主程序

idiom_lib.py代码:

# -*- coding=utf-8 -*-import sysimport randomif sys.version_info < (3,0):  reload(sys)  sys.setdefaultencoding('utf-8')elif sys.version_info <= (3,3):  import imp  imp.reload(sys)else:  import importlib  importlib.reload(sys)class IdiomInfo(object):  def __init__(self,idiom):    self.idiom = idiom    self.dire = 0    self.word_arr = []  def to_str(self):    arr = []    for word_info in self.word_arr:      arr.append('%s %s %s'%(word_info.i,word_info.j,word_info.word))    return '%s,%s,%s'%(self.idiom, self.dire, '|'.join(arr))class WordInfo(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 = -1class Matrix(object):  rows = 0  cols = 0  data = []  def __init__(self, rows, cols, data=None):    self.rows = rows    self.cols = cols    if data is None: data = [None for i in range(rows * cols)]    self.data = data  def set_val(self, x, y, val):    self.data[y * self.cols + x] = val  def get_val(self, x, y):    return self.data[y * self.cols + x]  def exist_val_four_around(self, x, y, ignore_set):    move_arr = [(-1,0),(1,0),(0,-1),(0,1)]    for dx,dy in move_arr:      tx = x + dx      ty = y + dy      if (tx,ty) in ignore_set: continue      if tx < 0 or tx >= self.cols or ty <0 or ty >= self.rows: continue      if self.data[ty * self.cols + tx]: return True    return Falseclass IdiomLib():  def __init__(self, block_num=12):    self.word_dic={}    self.word_arr=[]    self.block_num=block_num    self.matrix = Matrix(self.block_num, self.block_num)    self.idiom_dic={}    self.all_word_num=0    self.hide_arr = []  def load_idiom_from_file(self, filename='poetry.txt'):    if sys.version_info < (3,0):       f = open(filename)    else:      f = open(filename,encoding='UTF-8')    all_idiom = f.readlines()    f.close()    for idiom in all_idiom:      if sys.version_info < (3,0):        idiom = idiom.strip().decode('utf-8')      else:        idiom = idiom.strip()      for word in idiom:        if word not in self.word_dic:           self.word_dic[word] = [idiom]        else:          self.word_dic[word].append(idiom)    self.word_arr = list(self.word_dic.keys())  def check_new_idiom(self, 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=[]    for i in range(-windex,-windex+len(new_idiom)):       if i==0:         new_idiom_word_arr.append(word_info)      else:        tx = cx+i if new_dire == 0 else cx        if tx < 0 or tx >= self.block_num: return None,None        ty = cy if new_dire == 0 else cy+i        if ty < 0 or ty >= self.block_num: return None,None        if self.matrix.exist_val_four_around(tx, ty, ignore_set): return None,None        old_word_info = self.matrix.get_val(tx, ty)        if old_word_info:          return None,None        new_word_info = WordInfo(new_idiom[i+windex], tx, ty)        new_idiom_word_arr.append(new_word_info)    return new_idiom_word_arr,windex  def add_idiom_to_matrix(self, idiom_num):    if idiom_num == 0: return 0    for idiom,idiom_info in self.idiom_dic.items():      dire = idiom_info.dire      new_dire = 1 - dire      for word_info in idiom_info.word_arr:        word = word_info.word        idiom_list = self.word_dic[word]        for new_idiom in idiom_list:          if new_idiom in self.idiom_dic: continue          new_idiom_word_arr,windex = self.check_new_idiom(new_idiom, new_dire, word_info)          if new_idiom_word_arr:new_idiom_info = IdiomInfo(new_idiom)new_idiom_info.dire = new_direfor new_index in range(len(new_idiom_word_arr)):  new_word_info = new_idiom_word_arr[new_index]  if new_index == windex:    new_idiom_info.word_arr.append(word_info)  else:    self.matrix.set_val(new_word_info.i, new_word_info.j , new_word_info)    new_idiom_info.word_arr.append(new_word_info)self.idiom_dic[new_idiom] = new_idiom_inforeturn len(new_idiom) -1 + self.add_idiom_to_matrix(idiom_num - 1)    return 0  def get_idiom_matrix(self, idiom_num):    self.idiom_dic={}    cx = int(self.block_num/2)-1    cy = int(self.block_num/2)-1    n = random.randint(0,len(self.word_arr)-1)    word = self.word_arr[n]    idiom = self.word_dic[word][0]    wn = len(idiom)    self.idiom_dic[idiom] = IdiomInfo(idiom)    last_i = -100    for i in range(len(idiom)):      word_info = WordInfo(idiom[i],cx-int(wn/2)+1+i,cy)      self.matrix.set_val(cx-int(wn/2)+1+i,cy,word_info)      self.idiom_dic[idiom].word_arr.append(word_info)    wn += self.add_idiom_to_matrix(idiom_num-1)    return wn  def get_hide_arr(self, percent):    self.hide_arr=[]    idiom_word_arr = []    for k,v in self.idiom_dic.items():      arr = []      for word_info in v.word_arr:        arr.append(word_info)      idiom_word_arr.append([k, arr])    #idiom_word_arr.sort(cmp=lambda x,y:cmp(len(y[-1]),len(x[-1])))    idiom_word_arr.sort(key=lambda x:len(x[-1]))    idiom_index = 0    while len(self.hide_arr) < self.all_word_num*percent:      tmp_arr = idiom_word_arr[idiom_index%len(idiom_word_arr)][1]      n = random.randint(0,len(tmp_arr)-1)      info = tmp_arr.pop(n)      word=info.word       info.word = ''      info.hide_index = len(self.hide_arr)      info.is_lock = False      self.hide_arr.append([info.i,info.j,word,None])      idiom_index+=1    return self.hide_arr   def get_next_select(self, x, y):    arr = []    for i in range(self.block_num):      for j in range(self.block_num):        info = self.matrix.get_val(i, j)        if info is not None and len(info.word) == 0:          dist = (i-x)*(i-x)+(j-y)*(j-y)          if i<x: dist+=0.2          if j<y: dist+=0.4          arr.append((i,j,dist))    if len(arr) == 0:      return None    #arr.sort(cmp=lambda x,y:cmp(x[-1],y[-1]))    arr.sort(key=lambda x:x[-1])    return (arr[0][0],arr[0][1])  def check_idiom(self):    for idiom, idiom_info in self.idiom_dic.items():      tmp_idiom_str = ''      word_arr = idiom_info.word_arr      for word_info in word_arr:        word = word_info.word        if len(word) > 0:          tmp_idiom_str+=word      if len(tmp_idiom_str) == len(idiom):        state = 1 if tmp_idiom_str == idiom else 2      else:        state = 0      for word_info in word_arr:        if word_info.state != 1: word_info.state = state    for idiom, idiom_info in self.idiom_dic.items():      word_arr = idiom_info.word_arr      for word_info in word_arr:        if word_info.state != 1:          return False    return True  stage = 1  def init(self, new_stage):    idiom_num = int(new_stage/5)+3    if new_stage>100:      percent = 0.7    else:      percent = 0.2+(new_stage*1.0/100)*(0.7-0.2)    self.matrix = Matrix(self.block_num, self.block_num)    self.all_word_num = self.get_idiom_matrix(idiom_num)    self.get_hide_arr(percent)    self.select_rect = self.hide_arr[0][0],self.hide_arr[0][1]if __name__ == '__main__': pass

main.py的代码

# -*- coding=utf-8 -*-import sysimport randomimport pygamefrom pygame.locals import *from idiom_lib import IdiomLibif sys.version_info < (3,0):  reload(sys)  sys.setdefaultencoding('utf-8')elif sys.version_info <= (3,3):  import imp  imp.reload(sys)else:  import importlib  importlib.reload(sys)block_num=12lib = IdiomLib(block_num=block_num)lib.load_idiom_from_file()header_height = 30main_space = 20block_size = 36bspace = 2space = 20width = block_size * block_num + main_space * 2height = header_height + block_size * block_num + main_space * 2 + (block_size+space) * 3pygame.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,200white = 255,255,255#textImage = font.render(u'你好', True, white)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))stage = 1lib.init(stage)stage_textImage = pygame.font.Font(u'syht.otf', 30).render(u'第%s关'%stage, True, dray_gray)stage_font_width, stage_font_height = stage_textImage.get_size()stage_x = int((width - stage_font_width)/2)stage_y = int((header_height - stage_font_height)/2)+int(main_space/2)while True: for event in pygame.event.get(): if event.type == pygame.QUIT:   pygame.quit()   exit() if event.type == MOUSEBUTTONDOWN:  pressed_array = pygame.mouse.get_pressed()  if pressed_array[0]:  x, y = pygame.mouse.get_pos()  for i in range(block_num):   for j in range(block_num):   bx = main_space + block_size*i+bspace   by = header_height + main_space + block_size*j+bspace   if x >= bx and x <= bx+block_size-bspace*2 and y >= by and y<= by+block_size-bspace*2:    info = lib.matrix.get_val(i, j)    if info and info.state != 1 and info.hide_index >= 0:    if info.op_hide_index>=0:     lib.hide_arr[info.op_hide_index][-1] = None     info.word = ''     info.op_hide_index=-1     lib.check_idiom()    lib.select_rect = i,j    break  sx = main_space  sy = header_height + main_space+ block_size*block_num +space  n = 0  for hi in range(len(lib.hide_arr)):   tmp_x = sx + (n%block_num)*block_size   tmp_y = sy + int(n/block_num)*block_size   if lib.hide_arr[hi][-1] is None and x >= tmp_x and x <= tmp_x+block_size-bspace*2 and y >= tmp_y and y<= tmp_y+block_size-bspace*2:   info = lib.matrix.get_val(lib.select_rect[0],lib.select_rect[1])   info.word = lib.hide_arr[hi][2]   info.op_hide_index = hi   info.state = 0   lib.hide_arr[hi][-1] = lib.select_rect   lib.select_rect = lib.get_next_select(lib.select_rect[0],lib.select_rect[1])   flag = lib.check_idiom()   if flag:    stage += 1    lib.init(stage)    stage_textImage = pygame.font.Font(u'syht.otf', 30).render(u'第%s关'%stage, True, dray_gray)   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)) for i in range(block_num): for j in range(block_num):  info = lib.matrix.get_val(i,j)  if info is not None:  bx = block_size*i+bspace  by = block_size*j+bspace  panel.blit(block_bg_image, (bx,by))    if info.state == 1:   textImage = font.render(info.word, True, (30,144,30))  elif info.is_lock == 1:   textImage = font.render(info.word, True, (100,100,100))  elif info.state == 2:   textImage = font.render(info.word, True, (255,0,0))  else:   textImage = font.render(info.word, True, dray_gray)  tw, th = textImage.get_size()  dx=int((block_size-bspace*2-tw)/2)  dy=int((block_size-bspace*2-th)/2)  panel.blit(textImage, (bx+dx,by+dy))  if (i,j) == lib.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 for i,j,word,op in lib.hide_arr: screen.blit(block_bg_image, (sx + (n%block_num)*block_size,sy + int(n/block_num)*block_size)) if op is None:  textImage = font.render(word, True, dray_gray)  tw, th = textImage.get_size()  dx=int((block_size-bspace*2-tw)/2)  dy=int((block_size-bspace*2-th)/2)  screen.blit(textImage, (dx+sx+ (n%block_num)*block_size,dy+sy+ int(n/block_num)*block_size)) n+=1 pygame.display.update()

代码就这么多了,不过这边用到几个额外的依赖:

bg.jpeg 用于做整个界面的背景

bg2.jpeg 用于做上半部分的背景

tzg.jpg 每个文字的格子的背景

words.txt 一个成语的列表文件(每行一条成语),如果换成诗词或者歇后语什么的也是没有问题的

syht.otf 一个字体库,用于正常显示中文

运行python main.py即可开始游戏

如果嫌格子太多或者太小,可以调一下这两个参数

block_size = 32block_num=12

block_size 表示格子的大小

block_num 上半部分的区域横竖最多显示多少个格子

block_size = 26,block_num=18的效果图:

block_size = 40,block_num=10的效果图:

试试你的诗词水平,看能冲到第几关吧!

完整的资源已经上传本站:

http://xiazai..net.cn/201912/yuanma/guess_idiom_jb51.rar

也可以直接从github下载

https://github.com/zhangenter/guess_idiom

总结

以上所述是小编给大家介绍的使用pygame写一个古诗词填空通关游戏,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!


  • 上一条:
    np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
    下一条:
    numpy.transpose()实现数组的转置例子
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客