设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3485|回复: 2
打印 上一主题 下一主题

[讨论] 绝对有解的⑨宫格拼图(另:打乱数组)

[复制链接]

Lv2.观梦者

(?????)

梦石
0
星屑
700
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

跳转到指定楼层
1
发表于 2012-1-25 20:27:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 各种压力的猫君 于 2012-1-25 20:42 编辑

*请先下载柳大的拼图游戏(http://www.66rpg.com/articles/18

非常严重的问题……9宫格50%概率会无解……

于是下面脚本诞生
  1. #==============================================================================
  2. # ■ 绝对有解的⑨宫格 by 各种压力的猫君
  3. #------------------------------------------------------------------------------
  4. #  完全没优化效率的原始版本。
  5. #   适用于柳大的拼图无双(http://www.66rpg.com/articles/18)
  6. #   插入 Scene_PT 以下 MAIN 以上。
  7. #==============================================================================

  8. class Scene_PT
  9.   #--------------------------------------------------------------------------
  10.   # ● 初始化对像
  11.   #--------------------------------------------------------------------------
  12.   alias randnumbers_66 randnumbers
  13.   def randnumbers
  14.     if @max_x == 3 && @max_y == 3
  15.       possible9 # 绝对有解的⑨宫格 by 各种压力的猫君
  16.     else
  17.       randnumbers_66
  18.     end
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 打乱数组 by 各种压力的猫君
  22.   #--------------------------------------------------------------------------
  23.   def shuffle_array(array)
  24.     # 新数组
  25.     new_array = []
  26.     # 临时数组
  27.     temp_array = []
  28.     # 临时变量(循环次数)
  29.     pass = 0
  30.     # 循环
  31.     loop do
  32.       # 每30次调用一次Graphics.update,避免10s
  33.       # Graphics.update if pass % 30 == 0
  34.       # 当所有序列排列完毕后跳出循环
  35.       break if temp_array.size == array.size
  36.       # 在数组个数之内生成随机数
  37.       temp_index = rand(array.size)
  38.       # 判断是否已存在
  39.       if temp_array.include?(temp_index)
  40.         # 增加循环次数
  41.         pass += 1
  42.         next # 继续循环
  43.       else
  44.         temp_array.push(temp_index) # 压入数组
  45.       end
  46.       # 增加循环次数
  47.       pass += 1
  48.     end
  49.     # 生成新数组
  50.     for i in temp_array
  51.       new_array.push array[i]
  52.     end
  53.     # 返回新数组
  54.     return new_array
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   # ● 生成绝对有解的⑨宫格 by 各种压力的猫君
  58.   #--------------------------------------------------------------------------
  59.   def possible9
  60.     # 生成0~8数组
  61.     temp_array = []
  62.     for i in 0..8
  63.       temp_array.push(i)
  64.     end
  65.     # 打乱数组
  66.     rand_9 = shuffle_array(temp_array)
  67.     # 检查是否有解
  68.     unless possible9?(rand_9)
  69.       # 重排
  70.       rand_9 = shuffle_array(temp_array)
  71.     end
  72.     # 删除空格
  73.     rand_9.delete(8)
  74.     # 写入变量
  75.     @randnumbers = rand_9
  76.   end
  77.   #--------------------------------------------------------------------------
  78.   # ● 检查⑨宫格是否有解 by 各种压力的猫君
  79.   #--------------------------------------------------------------------------
  80.   def possible9?(array)
  81.     get_index = []
  82.     correct_index = []
  83.     need_exchange = 0
  84.     for i in 0..8
  85.       get_index.push(array.index(i))
  86.     end
  87.     #
  88.     for i in 0..8
  89.       correct_index.push(i)
  90.     end
  91.     #
  92.     try_exchange = get_index.clone
  93.     for i in 0..8
  94.       if try_exchange[i] == correct_index[i]
  95.         # 无需移动
  96.       else
  97.         # 需要对调次数+1
  98.         need_exchange += 1
  99.         # 实际对调
  100.         try_exchange[i] = get_index[correct_index[i]]
  101.         try_exchange[correct_index[i]] = get_index[i]
  102.       end
  103.     end
  104.     #
  105.     if need_exchange % 2 == 0
  106.       # 有解
  107.       return true
  108.     else
  109.       # 无解
  110.       return false
  111.     end
  112.   end
  113. end
复制代码
各种求优化 求讨论

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60700
在线时间
1933 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

2
发表于 2012-1-25 20:51:48 | 只看该作者
本帖最后由 orzfly 于 2012-1-25 22:19 编辑
  1. def possible?(array)
  2.   dims = Math.sqrt(array.length).to_i
  3.   return nil if dims ** 2 != array.length
  4.   eq1 = inversion_number(array) % 2 == 0
  5.   return eq1 if dims % 2 == 1
  6.   eq2 = (array.index(0) / dims - (dims - 1)) % 2 == 0
  7.   return (!eq1) == (eq2)
  8. end

  9. def inversion_number(array)
  10.   t = 0; (array.length - 1).times { |x| array[0, x + 1].each { |y| t += 1 if y < array[x + 1] and y != 0 } }; t
  11. end

  12. print "#{possible?([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0])}\n"
  13. print "#{possible?([1,2,3,4,5,6,7,8,9,10,11,0,12,13,14,15])}\n"
  14. print "#{possible?([1,2,3,4,0,5,6,7,9,10,11,8,13,14,15,12])}\n"
  15. print "#{possible?([1,2,3,4,5,6,7,8,0])}\n"
  16. print "#{possible?([1,2,3,4,5,6,7,0,8])}\n"
  17. print "#{possible?([2,1,3,4,5,6,7,8,0])}\n"
复制代码
参考资料 = = http://blog.csdn.net/tiaotiaoyly/article/details/2008233
我只是写了个ruby版而已@各种压力的猫君

打乱数组
  1. array.sort_by{ rand }
复制代码
我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5402
在线时间
2559 小时
注册时间
2011-9-27
帖子
1119

极短23参与开拓者

3
发表于 2012-1-25 22:05:32 | 只看该作者
本帖最后由 怕鼠的猫 于 2012-1-25 22:18 编辑

线性代数中提到的 奇排列 和 偶排列。 随机生成之后判定一下乱序数。 你懂的。
  1. a=Array.new(9){|i| i}.shuffle
  2. b=(0..8).to_a.shuffle
复制代码
0..8 乱序数组。

点评

T_T线性代数忘光了……我怎么感觉是组合数学= = 内牛满面  发表于 2012-2-28 16:27
shuffle似乎旧版无效……建议换成.sort_by{rand}  发表于 2012-2-3 16:51
TVT 线性代数……初中生内牛满面  发表于 2012-1-25 22:13
从平淡走向更平淡。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-5 22:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表