Project1
标题:
绝对有解的⑨宫格拼图(另:打乱数组)
[打印本页]
作者:
各种压力的猫君
时间:
2012-1-25 20:27
标题:
绝对有解的⑨宫格拼图(另:打乱数组)
本帖最后由 各种压力的猫君 于 2012-1-25 20:42 编辑
*请先下载柳大的拼图游戏(
http://www.66rpg.com/articles/18
)
非常严重的问题……9宫格50%概率会无解……
于是下面脚本诞生
#==============================================================================
# ■ 绝对有解的⑨宫格 by 各种压力的猫君
#------------------------------------------------------------------------------
# 完全没优化效率的原始版本。
# 适用于柳大的拼图无双(http://www.66rpg.com/articles/18)
# 插入 Scene_PT 以下 MAIN 以上。
#==============================================================================
class Scene_PT
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
alias randnumbers_66 randnumbers
def randnumbers
if @max_x == 3 && @max_y == 3
possible9 # 绝对有解的⑨宫格 by 各种压力的猫君
else
randnumbers_66
end
end
#--------------------------------------------------------------------------
# ● 打乱数组 by 各种压力的猫君
#--------------------------------------------------------------------------
def shuffle_array(array)
# 新数组
new_array = []
# 临时数组
temp_array = []
# 临时变量(循环次数)
pass = 0
# 循环
loop do
# 每30次调用一次Graphics.update,避免10s
# Graphics.update if pass % 30 == 0
# 当所有序列排列完毕后跳出循环
break if temp_array.size == array.size
# 在数组个数之内生成随机数
temp_index = rand(array.size)
# 判断是否已存在
if temp_array.include?(temp_index)
# 增加循环次数
pass += 1
next # 继续循环
else
temp_array.push(temp_index) # 压入数组
end
# 增加循环次数
pass += 1
end
# 生成新数组
for i in temp_array
new_array.push array[i]
end
# 返回新数组
return new_array
end
#--------------------------------------------------------------------------
# ● 生成绝对有解的⑨宫格 by 各种压力的猫君
#--------------------------------------------------------------------------
def possible9
# 生成0~8数组
temp_array = []
for i in 0..8
temp_array.push(i)
end
# 打乱数组
rand_9 = shuffle_array(temp_array)
# 检查是否有解
unless possible9?(rand_9)
# 重排
rand_9 = shuffle_array(temp_array)
end
# 删除空格
rand_9.delete(8)
# 写入变量
@randnumbers = rand_9
end
#--------------------------------------------------------------------------
# ● 检查⑨宫格是否有解 by 各种压力的猫君
#--------------------------------------------------------------------------
def possible9?(array)
get_index = []
correct_index = []
need_exchange = 0
for i in 0..8
get_index.push(array.index(i))
end
#
for i in 0..8
correct_index.push(i)
end
#
try_exchange = get_index.clone
for i in 0..8
if try_exchange[i] == correct_index[i]
# 无需移动
else
# 需要对调次数+1
need_exchange += 1
# 实际对调
try_exchange[i] = get_index[correct_index[i]]
try_exchange[correct_index[i]] = get_index[i]
end
end
#
if need_exchange % 2 == 0
# 有解
return true
else
# 无解
return false
end
end
end
复制代码
各种求优化 求讨论
作者:
orzfly
时间:
2012-1-25 20:51
本帖最后由 orzfly 于 2012-1-25 22:19 编辑
def possible?(array)
dims = Math.sqrt(array.length).to_i
return nil if dims ** 2 != array.length
eq1 = inversion_number(array) % 2 == 0
return eq1 if dims % 2 == 1
eq2 = (array.index(0) / dims - (dims - 1)) % 2 == 0
return (!eq1) == (eq2)
end
def inversion_number(array)
t = 0; (array.length - 1).times { |x| array[0, x + 1].each { |y| t += 1 if y < array[x + 1] and y != 0 } }; t
end
print "#{possible?([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0])}\n"
print "#{possible?([1,2,3,4,5,6,7,8,9,10,11,0,12,13,14,15])}\n"
print "#{possible?([1,2,3,4,0,5,6,7,9,10,11,8,13,14,15,12])}\n"
print "#{possible?([1,2,3,4,5,6,7,8,0])}\n"
print "#{possible?([1,2,3,4,5,6,7,0,8])}\n"
print "#{possible?([2,1,3,4,5,6,7,8,0])}\n"
复制代码
参考资料 = =
http://blog.csdn.net/tiaotiaoyly/article/details/2008233
我只是写了个ruby版而已
@各种压力的猫君
打乱数组
array.sort_by{ rand }
复制代码
作者:
怕鼠的猫
时间:
2012-1-25 22:05
本帖最后由 怕鼠的猫 于 2012-1-25 22:18 编辑
线性代数中提到的 奇排列 和 偶排列。 随机生成之后判定一下乱序数。 你懂的。
a=Array.new(9){|i| i}.shuffle
b=(0..8).to_a.shuffle
复制代码
0..8 乱序数组。
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1