过年前的时候,看到同事HQJ在手机上玩猜成语,前两天,我也下载了一个《疯狂看图猜成语2》,其实最开始看到这个游戏时候,就习惯性的想作弊了。
      玩游戏我一直喜欢修改的,比如FPE啦,金山游侠啦,对我来说都是玩游戏必备的工具。
      这个看图猜成语,就是给一幅图,下面是24个汉字,从里面选4个字,作为符合图内容的成语答案。
      ok,现在让我们go。

系统:Windows XP sp2
ruby:1.9.2p180
编辑器:SciTE 1.73

工作环境,无法上网,所以系统旧,ruby旧,大家先承担些,后面没问题了,再转Ubuntu(Ubuntu在u盘上安装的系统,比windows下还慢)。

1.开始的时候,很简单的想法,就是从里面随便抽汉字,组成4个字的词,看里面是否有成语,这个是最简单的。
      我喜欢使用ruby,纯属个人爱好,代码也许很烂,看的人多担待些。
      在Windows下有个问题,操作系统的编码是gbk,但是ruby1.9底层是utf-8,所以总是需要转码。

#coding: UTF-8
require 'iconv'
words_array = %w|无 黑 用 如 小 比 伦 材 脚 纸 四 表 两 得 一 字 天 大 朝 白 与 举 一 里|   #成语游戏的备选字库
words = words_array.map {|x|  Iconv.conv 'gbk', 'utf-8', x} #utf-8转gbk
idioms = words.permutation(4).to_a #每4个字分组
idioms.each {|x|  puts x.join}  #分组合并,就是四字成语

功能是有了,但是这个排列组合的数量巨大,人眼很难找到成语,24个字4字排列总共255024个,眼神好能找到符合的成语,不好就很难了。

2.数量巨大的结果不实用,那么就减少。一个想法是从网上弄成语词库,从里面选就可以了。
      去网上找成语词库,真的不怎么好找,都是带解释什么的乱七八糟的,最后找到一个叫“成语词典.txt”的文件,里面的内容是类似“【束教管闻】谓学识浅陋,见闻不广。”这样的内容内容,就他了,很容易通过正则取出【】中间的内容为成语词典。

#coding: UTF-8
require 'iconv'
s1 = Iconv.conv 'gbk','utf-8',"【" #烦人的转码
s2 = Iconv.conv 'gbk','utf-8',"】"
File.open('成语.txt','w') do |wfile|File.open('成语词典.txt','r') do |rfile|rfile.each do |line|line =~ /#{s1}(.*)#{s2}/wfile << $1 << "\n"  #没有\n就会连一起了
    endend
end

输出为“成语.txt”,最后有几个错误的词,手工给删除了,最后是23594条成语。

3.有字库排列,有成语词典,第一个想法当然是排列对照,简单的就是两个循环。其实我最开始就是这么做的,比较丢人啊,就不写了,速度很慢,你想想255024*23594的循环。后来就问了HQJ,程序员就明白的多,告诉我既然成语词典少,就从成语词典过滤,先比较第一个字,这样一次就只有几十上百个词语选择,接着再去字库中选择。

按照这个思路,写了几版,最终的定型大概是这样的。

#coding: UTF-8
require 'iconv'
words = %w|无 黑 用 如 小 比 伦 材 脚 纸 四 表 两 得 一 字 天 大 朝 白 与 举 一 里|idioms_array = Array.new
idioms_regexp  = Array.newFile.open('成语.txt','r') do |file|file.each do |line|idioms_array << line.chomp   #把成语词典折腾出来,作为array数组
  end
endwords_g = words.map {|x| Iconv.conv 'gbk', 'utf-8',x}.uniq #转码,另外把重复的字去除,后面用不到

words_g.each {|word|idioms_array.map {|x| idioms_regexp << x if x =~ /^#{word}/} #循环,从成语词典中匹配第一个字相同的记录idioms_regexp.map  {|idiom|idioms_regexp = []   #这里坑了我很久,一直有重复的,后来发现因为里面有数据,清空就好了puts idiom if words_g.include?(idiom[1]) && words_g.include?(idiom[2]) && words_g.include?(idiom[3]) #检查成语的第2、3、4个字,是否在词库中,都在那就ok了
  }
}

4.上面的想法都太直白了,还是按照ruby的习惯,尽可能的少的代码,把循环等去除一下。

重构code:

#coding: UTF-8
require 'iconv'
require 'benchmark'words = %w|无 黑 用 如 小 比 伦 材 脚 纸 四 表 两 得 一 字 天 大 朝 白 与 举 一 里|idioms_array = Array.newFile.open('成语.txt','r') do |file|file.each do |line|idioms_array << line.chomp   #把成语词典折腾出来,作为array数组
  end
endwords_g = words.map {|x| Iconv.conv 'gbk', 'utf-8',x}.uniq #转码,另外把重复的字去除,后面用不到

Benchmark.bm do |bm|bm.report {words_g.each do |word|idioms_array.map do |idiom|puts idiom if idiom =~ /^#{word}/ and words_g.include?(idiom[1]) and words_g.include?(idiom[2]) and words_g.include?(idiom[3])
      endend}
end

我的烂机器上,大概6.8秒。重构与否其实速度没有变化。本来还序列化的了,但是和直接读txt一样,所以就没有用。

5.Ubuntu下使用下面的代码。因为我的Ubuntu性能更烂,所以需要近10秒。而且Ubuntu下,需要把成语.txt转换为utf-8格式,所以我用了“成语u.txt”。

Ubuntu下代码:

#coding: UTF-8
require 'iconv'
require 'benchmark'words = %w|无 黑 用 如 小 比 伦 材 脚 纸 四 表 两 得 一 字 天 大 朝 白 与 举 一 里|
idioms_array = Array.newFile.open('成语u.txt','r') do |file|file.each do |line|idioms_array << line.chomp   #把成语词典折腾出来,作为array数组
  end
endBenchmark.bm do |bm|bm.report {words.uniq.each do |word|idioms_array.map do |idiom|puts idiom if idiom =~ /^#{word}/ and words.include?(idiom[1]) and words.include?(idiom[2]) and words.include?(idiom[3])
      endend}
end

6.看到这里,大家发现了什么没有,其实上面说的都是在扯淡,不过恐怕没有几个人有耐心看到这里的吧。我的处理思想是有问题的,其实完全想多了。最简单的就是,从成语文件中读取,判断是否在字库中存在即可,下面的代码是秒速的,不到0.2秒结果就出来了,快2个数量级的差别。

Windows版本:

#coding: UTF-8
require 'iconv'
require 'benchmark'words = %w|无 黑 用 如 小 比 伦 材 脚 纸 四 表 两 得 一 字 天 大 朝 白 与 举 一 里|words_g = words.map {|x| Iconv.conv 'gbk', 'utf-8',x}.uniq #转码,另外把重复的字去除,后面用不到

Benchmark.bm do |bm|bm.report {File.open('成语.txt','r') do |file|file.each do |line|puts line if words_g.include?(line[0]) and words_g.include?(line[1]) and words_g.include?(line[2]) and words_g.include?(line[3])endend}
end

Ubuntu版本:

#coding: UTF-8
require 'benchmark'words = %w|无 黑 用 如 小 比 伦 材 脚 纸 四 表 两 得 一 字 天 大 朝 白 与 举 一 里|Benchmark.bm do |bm|bm.report {File.open('成语u.txt','r') do |file|file.each do |line|puts line if words.include?(line[0]) and words.include?(line[1]) and words.include?(line[2]) and words.include?(line[3])endend}
end

7.大家使用的时候,可以把benchmark的部分屏蔽,反正就是要个结果而已。还有,因为我用的成语词典库不大,所以有很多查不到的,比如286关“胜友如云”,还有“置之脑后”"不可造次""巧用天时""寸土如金"“自始至终”“串通一气”等,遇上这些,大家还是用金币吧,不过应该不是很多。

代码我放到下面的链接中了,只放最终的代码。
      感谢能看到这里的朋友。

转载于:https://www.cnblogs.com/qqrrm/p/3569839.html

看图猜成语通关辅助程序(ruby)相关推荐

  1. 看图猜成语微信小程序源码

    介绍: 后台可以自行设置关卡.等级.也可以一键部署, 开通流量主之后实现躺赚,你懂得. 个人号也可以开通, 审核一次性必过. 类目选择 教育,源码仅供您参考! 网盘下载地址: https://ziji ...

  2. python微信小程序看图猜成语源码flask

    wx供重浩:创享日记 对话框发送:python成语 获取完整源码源文件+说明文档+配置教程等 启动Idiom/flask下的venv虚拟环境,运行python manage.py runserver命 ...

  3. python例程:《看图猜成语》程序

    目录 <看图猜成语>程序使用说明 主要代码展示 源码下载路径 <看图猜成语>程序使用说明 启动Idiom/flask下的venv虚拟环境,运行python manage.py ...

  4. 看图猜成语小程序源码+详细搭建教程

    本小程序可开通流量主 ,后台可以自行设置关卡.等级.也可以一键部署, 开通流量主之后实现躺赚,你懂得. 个人号也可以开通,审核一次性必过. 类目选择 教育 小程序源码下载地址:(8条消息) 看图猜成语 ...

  5. (已更新)看图猜成语小程序源码+详细搭建教程

    本小程序后台可以自行设置关卡.等级.也可以一键部署, 个人号也可以开通,审核一次性必过. 类目选择 教育 小程序源码下载地址:(已更新)看图猜成语小程序源码+详细搭建教程-小程序文档类资源-CSDN下 ...

  6. 基于flask的看图猜成语小程序

    开发工具(pycharm): 数据库(mysql): 功能模块: 1.自动下一题 2.判断正误 3.得分排行 4.看图猜成语

  7. Python GUI案例之看图猜成语开发(第三篇)

    Python GUI案例之看图猜成语(第三篇) 前言 看图猜成语小程序开发(第三篇) 游戏闯关模式页面 Python GUI案例之看图猜成语开发(第一篇) Python GUI案例之看图猜成语开发(第 ...

  8. Python GUI案例之看图猜成语开发(第二篇)

    Python GUI案例之看图猜成语(第二篇) 前言 看图猜成语小程序开发(第二篇) 游戏选择模式页面 游戏训练模式页面 Python GUI案例之看图猜成语开发(第一篇) Python GUI案例之 ...

  9. 【游戏系列】用vue做个看图猜成语游戏吧

    前几年看图猜成语一类游戏风靡一时,很多人玩这个游戏,我当时也是其中之一,如今当了一个没多少头发的程序员,有时间的时候,也会去研究一下以前的那些小游戏 vue怎么创建项目这里就不介绍了,后面有时间再写一 ...

最新文章

  1. PTA数据结构与算法题目集(中文)7-36
  2. 自动驾驶出租车竞争激烈,国内百度占得先机!
  3. Linux之Less命令跳转到特定的行号
  4. 小学四年级下册计算机考试试题,四年级信息技术下学期测试题
  5. AjaxPro怎么用
  6. 【LeetCode】两数之和
  7. vue+elementui中,el-select多选下拉列表中,如何同时获取:value和:label的值?
  8. Android 系统(123)---MTK android 常用修改点
  9. 外汇交易所巨头 Travelex 遭攻击暂停服务,详情不明
  10. 关于performSelector调用和直接调用区别
  11. Web Deploy 发布网站错误 检查授权和委派设置
  12. 2020杭电多校6 1006A Very Easy Graph Problem血泪史
  13. 最新 Python 爬虫利器!
  14. Web初学者-作业-[学子商城-收藏页]
  15. thinkpad l470 一种键盘错乱解决方法
  16. Windows 2008 Server R2 桌面体验
  17. broadcom学习心得
  18. linux下下载fnl数据,使用python直接提取fnl再分析资料的气象因子数据
  19. 亓官劼的2020年度总结
  20. 湖北智禾网络科技:新卖家前期对电商和淘宝店铺具备哪些基本的认知

热门文章

  1. 中移动3G第一阶段全业务曝光 含34个增值业务
  2. Dozer的基本使用
  3. 【正点原子Linux连载】第九章 进程-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1
  4. 点分治(树分治)详解
  5. 怎样把照片中的头像扶正_有一个有趣的男朋友是种怎样的体验?
  6. qq手机助手电脑版 v5.1.2 官方版
  7. tdp_page_fault 函数解析之level,gfn变量的含义
  8. 计算机上做表表格不够用怎么添加,excle表格不够怎么加/excel表格不够用怎么办...
  9. matlab绘图(三)绘制三维图像
  10. PoPo数据可视化周刊第5期