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

Project1

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

[RMVX发布] 24点破解器 (2012-10-1新出V2.0.4,见6楼)

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
21 小时
注册时间
2011-8-22
帖子
13
跳转到指定楼层
1
发表于 2012-1-20 11:00:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 lotsofone 于 2012-10-1 00:08 编辑

    24点破解器,玩24点遇到难题交给它都能解决。本破解器可以求出由4个从1到13的随机数构成的24点游戏的所有解。

24点破解器.rar (130.27 KB, 下载次数: 788)
代码不仅有破24点的程序,还附带了一些Window类,用来设置4个24点的数值和显示解法。
若因修正bug改变代码,导致下载的文件里的脚本与下面的脚本不同,请以下面的脚本为准。
RUBY 代码复制
  1. class Window_Setable < Window_Base
  2.   attr_accessor :item_id, :item_set, :sets
  3.   def initialize(x, y, width, height, sets)
  4.     super(x, y, width, height)
  5.     self.sets = sets
  6.     self.item_id = 0
  7.     self.active = true
  8.     self.cursor_rect = sets[0][0]
  9.     self.item_set = []
  10.     for i in 0...sets.size
  11.       self.item_set[i] = sets[0][2]
  12.     end
  13.     for i in 0...self.sets.size
  14.       rect = self.sets[i][0]
  15.       str = self.sets[i][1][self.item_set[i]]
  16.       self.contents.draw_text(rect, str)
  17.     end
  18.   end
  19.   def update
  20.     super
  21.     if Input.trigger?(Input::RIGHT) or Input.repeat?(Input::RIGHT)
  22.       self.item_id += 1
  23.       if self.item_id >= self.sets.size
  24.         self.item_id -= self.sets.size
  25.       end
  26.       @moved_lr = true
  27.     end
  28.     if Input.trigger?(Input::LEFT) or Input.repeat?(Input::LEFT)
  29.       self.item_id -= 1
  30.       if self.item_id < 0
  31.         self.item_id += self.sets.size
  32.       end
  33.       @moved_lr = true
  34.     end
  35.     self.cursor_rect = sets[item_id][0]
  36.     if Input.trigger?(Input::UP) or Input.repeat?(Input::UP)
  37.       self.item_set[item_id] += 1
  38.       if self.item_set[item_id] >= self.sets[item_id][1].size
  39.         self.item_set[item_id] -= self.sets[item_id][1].size
  40.       end
  41.       @moved_ud = true
  42.     end
  43.     if Input.trigger?(Input::DOWN) or Input.repeat?(Input::DOWN)
  44.       self.item_set[item_id] -= 1
  45.       if self.item_set[item_id] < 0
  46.         self.item_set[item_id] += self.sets[item_id][1].size
  47.       end
  48.       @moved_ud = true
  49.     end
  50.     return true if !@moved_ud
  51.     self.contents.clear
  52.     for i in 0...self.sets.size
  53.       rect = self.sets[i][0]
  54.       str = self.sets[i][1][self.item_set[i]]
  55.       self.contents.draw_text(rect, str)
  56.     end
  57.     self.cursor_rect = sets[self.item_id][0]
  58.     @moved_lr = false
  59.     @moved_ud = false
  60.     def dispose
  61.       super
  62.       $windows.delete_at($windows.size-1)
  63.     end
  64.   end
  65. end
  66. class Window_Input < Window_Setable
  67.   def initialize(x, y, width, height, sets)
  68.     super
  69.     @result_window = Window_Result.new(0, 96, 544, 416-96)
  70.     @compare_item_id = self.item_id
  71.     @compare_item_set = []
  72.     self.contents.draw_text(Rect.new(0, 0, 544-32, 32), "请设定4个数:")
  73.     for i in 0...self.item_set.size
  74.       @compare_item_set[i] = self.item_set[i]
  75.     end
  76.   end
  77.   def update
  78.     super
  79.     return true if @compare_item_set == self.item_set
  80.     @result_window.update
  81.     @compare_item_set = []
  82.     for i in 0...self.item_set.size
  83.       @compare_item_set[i] = self.item_set[i]
  84.     end
  85.     self.contents.draw_text(Rect.new(0, 0, 544-32, 32), "请设定4个数:")
  86.   end
  87. end
  88. class Window_Result < Window_Base
  89.   def author
  90.     return "lotsofone"
  91.   end
  92.   def initialize(x, y, width, height)
  93.     super
  94.     self.contents.draw_text(Rect.new(390, 250, 100, 24), "by "+author)
  95.   end
  96.   def update
  97.     super
  98.     self.contents.clear
  99.     number_a = $windows[0].sets[0][1][$windows[0].item_set[0]]
  100.     number_b = $windows[0].sets[1][1][$windows[0].item_set[1]]
  101.     number_c = $windows[0].sets[2][1][$windows[0].item_set[2]]
  102.     number_d = $windows[0].sets[3][1][$windows[0].item_set[3]]
  103.     strall = for_result_b_24(number_a.to_i, number_b.to_i, number_c.to_i, number_d.to_i)
  104.     str_array = strall.split(/:/)
  105.     self.contents.draw_text(Rect.new(0, 0, 544-32, 32), "解法:")
  106.     for i in 0...str_array.size
  107.       self.contents.draw_text(Rect.new(0, 32*i+32, 544-32, 32), str_array[i])
  108.     end
  109.     self.contents.draw_text(Rect.new(390, 250, 100, 24), "by "+author)
  110.   end
  111. end
  112. def deal_rest(result)
  113.   if (result[1].to_i < result[3].to_i) and (result[2] == "-") and (result[8] == "-")
  114.     exchanges = result[1]
  115.     result[1] = result[3]
  116.     result[3] = exchanges
  117.     exchanges = result[7]
  118.     result[7] = result[9]
  119.     result[9] = exchanges
  120.   end
  121.   if eval(result[1]+result[2]+result[3])>eval(result[7]+result[8]+result[9]) and result[5] == "*"
  122.     translates = []
  123.     for i in 0..10
  124.       translates[i] = result[i]
  125.     end
  126.     result[1] = translates[7]
  127.     result[2] = translates[8]
  128.     result[3] = translates[9]
  129.     result[7] = translates[1]
  130.     result[8] = translates[2]
  131.     result[9] = translates[3]
  132.   end
  133.   if result[1] > result[3] and result[2] == "+"
  134.     exchanges = result[1]
  135.     result[1] = result[3]
  136.     result[3] = exchanges
  137.   end
  138.   if result[7] > result[9] and result[8] == "+"
  139.     exchanges = result[7]
  140.     result[7] = result[9]
  141.     result[9] = exchanges
  142.   end
  143. end
  144. def break_24_locked(a, b, c, d)#此方法为本程序的核心之一
  145.   ret = []
  146.   eval_array = ["(", "(", a.to_s, nil, b.to_s, ")", nil, c.to_s, ")", nil, d.to_s]
  147.   method_array = ["+", "-", "*", "/"]
  148.   for x in method_array
  149.     if x == "/"
  150.       next if a / b * b != a
  151.     end
  152.     eval_array[3] = x
  153.     for y in method_array
  154.       if y == "/"
  155.         next if eval(a.to_s + x + b.to_s)/c*c != eval(a.to_s + x + b.to_s)
  156.       end
  157.       eval_array[6] = y
  158.       for z in method_array
  159.         if z == "/"
  160.           next if eval("(" + a.to_s + x + b.to_s + ")" + y + c.to_s)/d*d != eval("(" + a.to_s + x + b.to_s + ")" + y + c.to_s)
  161.         end
  162.         eval_array[9] = z
  163.         eval_string = eval_array[0]
  164.         for i in 1..10
  165.           eval_string += eval_array[i]
  166.         end
  167.         if eval(eval_string) == $equal_value
  168.           arr = []
  169.           for i in 0..10
  170.             arr[i] = eval_array[i]
  171.           end
  172.           ret << arr
  173.         end
  174.       end
  175.     end
  176.   end
  177.   eval_array = ["(", a.to_s, nil, b.to_s, ")", nil, "(", c.to_s, nil, d.to_s, ")"]
  178.   for x in 0..1
  179.     for y in 2..3
  180.       for z in 0..1
  181.         eval_array[2] = method_array[x]
  182.         eval_array[5] = method_array[y]
  183.         eval_array[8] = method_array[z]
  184.         if eval_array[5] == "/"
  185.           chu_shu = eval(eval_array[7]+eval_array[8]+eval_array[9])
  186.           bei_chu_shu = eval(eval_array[1]+eval_array[2]+eval_array[3])
  187.           next if chu_shu == 0 or bei_chu_shu / chu_shu * chu_shu != bei_chu_shu
  188.         end
  189.         eval_string = eval_array[0]
  190.         for i in 1..10
  191.           eval_string += eval_array[i]
  192.         end
  193.         if eval(eval_string) == $equal_value
  194.           arr = []
  195.           for i in 0..10
  196.             arr[i] = eval_array[i]
  197.           end
  198.           ret << arr
  199.         end
  200.       end
  201.     end
  202.   end
  203.   return ret  
  204. end
  205. def deal(array)
  206.   for i in 0...array.size
  207.     if array[i][1] == "("
  208.       deal_most(array[i])
  209.     else
  210.       deal_rest(array[i])
  211.     end
  212.     for n in 0...array[i].size
  213.       if array[i][n]=="*"
  214.         array[i][n]="×"
  215.       elsif array[i][n]=="/"
  216.         array[i][n]="÷"
  217.       end
  218.     end
  219.   end
  220.   i = 0
  221.   while i < array.size
  222.     for n in 0...array.size
  223.       next if n == i
  224.       if array[i] == array[n]
  225.         array.delete_at(i)
  226.         i -= 1
  227.         break
  228.       end
  229.     end
  230.     i += 1
  231.   end
  232.   for i in 0...array.size
  233.     tra = array[i]
  234.     array[i] = tra[0]
  235.     for n in 1..10
  236.       break if ! tra[n]
  237.       array[i] += tra[n]
  238.     end   
  239.   end
  240. end
  241. def break_24(a, b, c, d)#此方法为本程序的核心之一
  242.   ret = []
  243.   n = [a, b, c, d]
  244.   for w in 0..3
  245.     for x in 0..3
  246.       next if x == w
  247.       for y in 0..3
  248.         next if y==x or y==w
  249.         for z in 0..3
  250.           next if z==x or z==y or z==w
  251.           ret.concat(break_24_locked(n[w], n[x], n[y], n[z]))
  252.         end
  253.       end
  254.     end
  255.   end
  256.   deal(ret)
  257.   return ret
  258. end
  259. def deal_most(result)  
  260.   if result[3] == "/"
  261.     if result[6] == "*"
  262.       tr = result[4]
  263.       result[4] = result[7]
  264.       result[7] = tr
  265.       result[3] = "*"
  266.       result[6] = "/"
  267.     end
  268.   end
  269.   if result[3] == "-"
  270.     if result[6] == "+"
  271.       tr = result[4]
  272.       result[4] = result[7]
  273.       result[7] = tr
  274.       result[3] = "+"
  275.       result[6] = "-"
  276.     end
  277.   end
  278.   if result[6] == "/"
  279.     if result[9] == "*"
  280.       tr = result[7]
  281.       result[7] = result[10]
  282.       result[10] = tr
  283.       result[6] = "*"
  284.       result[9] = "/"
  285.     end
  286.   end
  287.   if result[6] == "-"
  288.     if result[9] == "+"
  289.       tr = result[7]
  290.       result[7] = result[10]
  291.       result[10] = tr
  292.       result[6] = "+"
  293.       result[9] = "-"
  294.     end
  295.   end
  296.   if result[3] == "/"
  297.     if result[6] == "*"
  298.       tr = result[4]
  299.       result[4] = result[7]
  300.       result[7] = tr
  301.       result[3] = "*"
  302.       result[6] = "/"
  303.     end
  304.   end
  305.   if result[3] == "-"
  306.     if result[6] == "+"
  307.       tr = result[4]
  308.       result[4] = result[7]
  309.       result[7] = tr
  310.       result[3] = "+"
  311.       result[6] = "-"
  312.     end
  313.   end
  314.   if result[3] == "*" or result[3] == "+"
  315.     if result[2].to_i > result[4].to_i
  316.       trans = result[2]
  317.       result[2] = result[4]
  318.       result[4] = trans
  319.     end
  320.   end
  321.   if result[3] == "+"
  322.     if result[6] == "+"
  323.       if result[9] == "+"
  324.         ta = [result[2],result[4],result[7],result[10]]
  325.         if ta[0]<=ta[1] and ta[0]<=ta[2] and ta[0]<=ta[3]
  326.           result[2] = ta[0]
  327.           ta.delete_at(0)
  328.         elsif ta[1]<=ta[0] and ta[1]<=ta[2] and ta[1]<=ta[3]
  329.           result[2] = ta[1]
  330.           ta.delete_at(1)
  331.         elsif ta[2]<=ta[0] and ta[2]<=ta[1] and ta[2]<=ta[3]
  332.           result[2] = ta[2]
  333.           ta.delete_at(2)
  334.         elsif ta[3]<=ta[0] and ta[3]<=ta[1] and ta[3]<=ta[2]
  335.           result[2] = ta[3]
  336.           ta.delete_at(3)
  337.         end
  338.         if ta[0]<=ta[1] and ta[0]<=ta[2]
  339.           result[4]=ta[0]
  340.           ta.delete_at(0)
  341.         elsif ta[1]<=ta[0] and ta[1]<=ta[2]
  342.           result[4]=ta[1]
  343.           ta.delete_at(1)
  344.         elsif ta[2]<=ta[0] and ta[2]<=ta[1]
  345.           result[4]=ta[2]
  346.           ta.delete_at(2)
  347.         end
  348.         if ta[0]<=ta[1]
  349.           result[7] = ta[0]
  350.           result[10] = ta[1]
  351.         else
  352.           result[7] = ta[1]
  353.           result[10] = ta[0]
  354.         end
  355.       else
  356.         ta = [result[2],result[4],result[7]]
  357.         if ta[0]<=ta[1] and ta[0]<=ta[2]
  358.           result[2]=ta[0]
  359.           ta.delete_at(0)
  360.         elsif ta[1]<=ta[0] and ta[1]<=ta[2]
  361.           result[2]=ta[1]
  362.           ta.delete_at(1)
  363.         elsif ta[2]<=ta[0] and ta[2]<=ta[1]
  364.           result[2]=ta[2]
  365.           ta.delete_at(2)
  366.         end
  367.         if ta[0]<=ta[1]
  368.           result[4] = ta[0]
  369.           result[7] = ta[1]
  370.         else
  371.           result[7] = ta[0]
  372.           result[4] = ta[1]
  373.         end
  374.       end
  375.     end
  376.   end
  377.   if (result[6] == "*" and result[9] == "*") or (result[6] == "+" and result[9] == "+") or (result[6] == "-" and result[9] == "-") or (result[6] == "/" and result[9] == "/")
  378.     if result[7]>result[10]
  379.       tnm = result[7]
  380.       result[7] = result[10]
  381.       result[10] = tnm
  382.     end
  383.   end
  384.   if result[3] == "*"
  385.     if result[6] == "*"
  386.       if result[9] == "*"
  387.         ta = [result[2],result[4],result[7],result[10]]
  388.         if ta[0]<=ta[1] and ta[0]<=ta[2] and ta[0]<=ta[3]
  389.           result[2] = ta[0]
  390.           ta.delete_at(0)
  391.         elsif ta[1]<=ta[0] and ta[1]<=ta[2] and ta[1]<=ta[3]
  392.           result[2] = ta[1]
  393.           ta.delete_at(1)
  394.         elsif ta[2]<=ta[0] and ta[2]<=ta[1] and ta[2]<=ta[3]
  395.           result[2] = ta[2]
  396.           ta.delete_at(2)
  397.         elsif ta[3]<=ta[0] and ta[3]<=ta[1] and ta[3]<=ta[2]
  398.           result[2] = ta[3]
  399.           ta.delete_at(3)
  400.         end
  401.         if ta[0]<=ta[1] and ta[0]<=ta[2]
  402.           result[4]=ta[0]
  403.           ta.delete_at(0)
  404.         elsif ta[1]<=ta[0] and ta[1]<=ta[2]
  405.           result[4]=ta[1]
  406.           ta.delete_at(1)
  407.         elsif ta[2]<=ta[0] and ta[2]<=ta[1]
  408.           result[4]=ta[2]
  409.           ta.delete_at(2)
  410.         end
  411.         if ta[0]<=ta[1]
  412.           result[7] = ta[0]
  413.           result[10] = ta[1]
  414.         else
  415.           result[7] = ta[1]
  416.           result[10] = ta[0]
  417.         end
  418.       else
  419.         ta = [result[2],result[4],result[7]]
  420.         if ta[0]<=ta[1] and ta[0]<=ta[2]
  421.           result[2]=ta[0]
  422.           ta.delete_at(0)
  423.         elsif ta[1]<=ta[0] and ta[1]<=ta[2]
  424.           result[2]=ta[1]
  425.           ta.delete_at(1)
  426.         elsif ta[2]<=ta[0] and ta[2]<=ta[1]
  427.           result[2]=ta[2]
  428.           ta.delete_at(2)
  429.         end
  430.         if ta[0]<=ta[1]
  431.           result[4] = ta[0]
  432.           result[7] = ta[1]
  433.         else
  434.           result[7] = ta[0]
  435.           result[4] = ta[1]
  436.         end
  437.       end
  438.     end
  439.   end
  440.   if result[3] == "*" or result[3] == "/"
  441.     if result[6] == "*" or result[6] == "/"
  442.       result.delete("(")
  443.       result.delete(")")
  444.     else
  445.       if result[9] == "*" or result[9] == "/"
  446.         result.delete_at(5)
  447.         result.delete_at(0)
  448.       else         
  449.         result.delete("(")
  450.         result.delete(")")
  451.       end
  452.     end
  453.   else
  454.     if result[6] == "*" or result[6] == "/"
  455.       result.delete_at(8)
  456.       result.delete_at(0)
  457.     else
  458.       if result[9] == "*" or result[9] == "/"
  459.         result.delete_at(5)
  460.         result.delete_at(0)
  461.       else
  462.         result.delete("(")
  463.         result.delete(")")
  464.       end
  465.     end
  466.   end
  467. end
  468. def for_result_b_24(a, b, c, d)
  469.   ra = break_24(a, b, c, d)
  470.   ret = ra[0]
  471.   number = 3
  472.   times = 0
  473.   if ra.size>=1
  474.     for i in 1...ra.size
  475.       times += 1
  476.       ret << "     " if times % number != 0
  477.       ret << ":"  if times % number == 0
  478.       ret << ra[i]
  479.     end
  480.   end
  481.   if ret == nil
  482.     ret = "无解"
  483.   end
  484.   ret
  485. end
  486. $equal_value=24
  487. Graphics.freeze
  488. array = []
  489. for i in 0..12
  490.   array[i] = (i+1).to_s
  491. end
  492. sets = []
  493. set_now = 0
  494. for i in 0..3
  495.   sets[i] = [Rect.new(0+(i*272/3), 32, 32, 32), array, set_now]
  496. end
  497. $windows = [Window_Input.new(0, 0, 336, 96, sets)]
  498. Graphics.transition(30)
  499. loop do
  500.   Graphics.update
  501.   Input.update
  502.   $windows[$windows.size-1].update if $windows[0]
  503. end

ps:我是把除Window_Base和Cache以外的脚本全删光,然后添加的这些脚本。
最近更新时间:2012-1-20 13:04 修正了12*12/2/3和12/2*12/3这种相同的解不能合并的bug。

猛然发现自己漏解:它解不出 a+-(b×÷c)+-d = 24等的解。编这东西很容易漏掉某些情况,所有情况包括:
(a~b)~c~d√
(a~b~c)~d√
a~(b~c)~d×
a~b~(c~d)×
a~(b~c~d)×
(a~b)~(c~d)√
(标×表示本程序没有收录)
懒得改了,以后再更新。

评分

参与人数 3星屑 +1502 收起 理由
fux2 + 1332 精品文章
orzfly + 38 塞糖
Sonic1997 + 132

查看全部评分

Lv1.梦旅人

海原大樹

梦石
0
星屑
205
在线时间
966 小时
注册时间
2011-12-17
帖子
720
2
发表于 2012-1-20 11:36:00 | 只看该作者
标题就直接带了个【破x】,不怕被误会咩{:nm_6:}(总之好强大{:nm_3:})

点击有惊喜什么的...
回复 支持 反对

使用道具 举报

Lv1.梦旅人

音速君

梦石
0
星屑
161
在线时间
1623 小时
注册时间
2011-6-9
帖子
3393

开拓者贵宾

3
发表于 2012-1-20 12:32:37 | 只看该作者
本帖最后由 Sonic1997 于 2012-1-19 21:12 编辑

建议弄多一点数字吧反正又不会出错{:nm_6:}
RE:↓还真不知道

点评

乃显然不知道24点的玩法  发表于 2012-1-20 13:10
Deartime
RMVA从零学起
【RMVA从零学起】【基础27课】数据库-系统
#2013年11月24日更新
偷懒了好久呢. .
于是最终还是决定暂时不写进阶教程了
先把这些基础的东西仔细说一下.w.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
565 小时
注册时间
2010-10-30
帖子
167
4
发表于 2012-1-20 13:56:59 | 只看该作者
下来看看,貌似很强大。。
(ARPG)赵云突围: http://rpg.blue/thread-303844-1-1.html
(剧情向战斗)命运赌局: http://rpg.blue/thread-257144-1-1.html
(ARPG)三英战吕布: http://rpg.blue/thread-220451-1-1.html
(R剧)秋风五丈原: http://rpg.blue/thread-211306-1-1.html
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42344
在线时间
7599 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

5
发表于 2012-1-20 17:55:48 | 只看该作者
在下还记得LZ以前发布的ARPG系统很给力呢XD
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
21 小时
注册时间
2011-8-22
帖子
13
6
 楼主| 发表于 2012-3-11 20:23:56 | 只看该作者
本帖最后由 lotsofone 于 2012-12-1 19:57 编辑

更新,24点破解器V2.0.4出来了,修正了V2.0的已经找到的bug。2.0相比1.0,新版支持分数计算,比如1.0不能解出1 5 5 5,V2.0能解出(5-1÷5)×5,3 3 8 8也是其中一个。在破解上,V1.0采用的方法是设定一个字符串"((a~b)~c)~d",并把加减乘除号代入"~"中,后来又添加了(a~b)~(c~d),但还是不能求出所有接;V2.0采用了一个更智能化的方法,把4个化3个,3个化2个,就求出了所有解法。唯一的缺点就是速度变得稍慢。1.0平均每个需要0.39337秒,2.0为每个0.64414秒。

24点破解器 V2.0.5.rar (969.3 KB, 下载次数: 57)
脚本如下,顺便感谢一下 orzfly 解答我的脚本问题。
为能完整显示,脚本分成三段。
如果有修正bug等改动脚本的操作使得文件包的脚本和下面的脚本不同,请以下面的脚本为准。最新更新时间2012-10-1。
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Cache
  3. #------------------------------------------------------------------------------
  4. #  本模组载入所有图像,建立并保存Bitmap物件。为加快载入速度并节省内存,
  5. #  本模组将以建立的bitmap物件保存在内部哈希表中,使得程序在需求已存在
  6. #  的图像时能快速读取bitmap物件。
  7. #==============================================================================
  8.  
  9. module Cache
  10.   #--------------------------------------------------------------------------
  11.   # * 获取动画图档
  12.   #     filename : 文件名
  13.   #     hue      : 色调
  14.   #--------------------------------------------------------------------------
  15.   def self.animation(filename, hue)
  16.     load_bitmap("Graphics/Animations/", filename, hue)
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # * 获取战斗图图档
  20.   #     filename : 文件名
  21.   #     hue      : 色调
  22.   #--------------------------------------------------------------------------
  23.   def self.battler(filename, hue)
  24.     load_bitmap("Graphics/Battlers/", filename, hue)
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # * 获取角色行走图图档
  28.   #     filename : 文件名
  29.   #--------------------------------------------------------------------------
  30.   def self.character(filename)
  31.     load_bitmap("Graphics/Characters/", filename)
  32.   end
  33.   #--------------------------------------------------------------------------
  34.   # * 获取头像图档
  35.   #     filename : 文件名
  36.   #--------------------------------------------------------------------------
  37.   def self.face(filename)
  38.     load_bitmap("Graphics/Faces/", filename)
  39.   end
  40.   #--------------------------------------------------------------------------
  41.   # * 获取远景图档
  42.   #     filename : 文件名
  43.   #--------------------------------------------------------------------------
  44.   def self.parallax(filename)
  45.     load_bitmap("Graphics/Parallaxes/", filename)
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # * 获取图片图档
  49.   #     filename : 文件名
  50.   #--------------------------------------------------------------------------
  51.   def self.picture(filename)
  52.     load_bitmap("Graphics/Pictures/", filename)
  53.   end
  54.   #--------------------------------------------------------------------------
  55.   # * 获取系统图档
  56.   #     filename : 文件名
  57.   #--------------------------------------------------------------------------
  58.   def self.system(filename)
  59.     load_bitmap("Graphics/System/", filename)
  60.   end
  61.   #--------------------------------------------------------------------------
  62.   # * 清除Cache
  63.   #--------------------------------------------------------------------------
  64.   def self.clear
  65.     @cache = {} if @cache == nil
  66.     @cache.clear
  67.     GC.start
  68.   end
  69.   #--------------------------------------------------------------------------
  70.   # * 载入图档
  71.   #--------------------------------------------------------------------------
  72.   def self.load_bitmap(folder_name, filename, hue = 0)
  73.     @cache = {} if @cache == nil
  74.     path = folder_name + filename
  75.     if not @cache.include?(path) or @cache[path].disposed?
  76.       if filename.empty?
  77.         @cache[path] = Bitmap.new(32, 32)
  78.       else
  79.         @cache[path] = Bitmap.new(path)
  80.       end
  81.     end
  82.     if hue == 0
  83.       return @cache[path]
  84.     else
  85.       key = [path, hue]
  86.       if not @cache.include?(key) or @cache[key].disposed?
  87.         @cache[key] = @cache[path].clone
  88.         @cache[key].hue_change(hue)
  89.       end
  90.       return @cache[key]
  91.     end
  92.   end
  93. end

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Window_Base
  3. #------------------------------------------------------------------------------
  4. #  游戏中全部窗口的超级类。
  5. #==============================================================================
  6.  
  7. class Window_Base < Window
  8.   #--------------------------------------------------------------------------
  9.   # ● 常量
  10.   #--------------------------------------------------------------------------
  11.   WLH = 24                  # 窗口行高(Window Line Height)
  12.   #--------------------------------------------------------------------------
  13.   # ● 初始化对像
  14.   #     x      : 窗口 X 座标
  15.   #     y      : 窗口 Y 座标
  16.   #     width  : 窗口宽度
  17.   #     height : 窗口高度
  18.   #--------------------------------------------------------------------------
  19.   def initialize(x, y, width, height)
  20.     super()
  21.     self.windowskin = Cache.system("Window")
  22.     self.x = x
  23.     self.y = y
  24.     self.width = width
  25.     self.height = height
  26.     self.z = 100
  27.     self.back_opacity = 200
  28.     self.openness = 255
  29.     create_contents
  30.     @opening = false
  31.     @closing = false
  32.   end
  33.   #--------------------------------------------------------------------------
  34.   # ● 释放
  35.   #--------------------------------------------------------------------------
  36.   def dispose
  37.     self.contents.dispose
  38.     super
  39.   end
  40.   #--------------------------------------------------------------------------
  41.   # ● 生成窗口内容
  42.   #--------------------------------------------------------------------------
  43.   def create_contents
  44.     self.contents.dispose
  45.     self.contents = Bitmap.new(width - 32, height - 32)
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 更新画面
  49.   #--------------------------------------------------------------------------
  50.   def update
  51.     super
  52.     if @opening
  53.       self.openness += 48
  54.       @opening = false if self.openness == 255
  55.     elsif @closing
  56.       self.openness -= 48
  57.       @closing = false if self.openness == 0
  58.     end
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   # ● 打开窗口
  62.   #--------------------------------------------------------------------------
  63.   def open
  64.     @opening = true if self.openness < 255
  65.     @closing = false
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 关闭窗口
  69.   #--------------------------------------------------------------------------
  70.   def close
  71.     @closing = true if self.openness > 0
  72.     @opening = false
  73.   end
  74.   #--------------------------------------------------------------------------
  75.   # ● 获取文字颜色
  76.   #     n : 文字颜色色号(0-31)
  77.   #--------------------------------------------------------------------------
  78.   def text_color(n)
  79.     x = 64 + (n % 8) * 8
  80.     y = 96 + (n / 8) * 8
  81.     return windowskin.get_pixel(x, y)
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 获取一般文字颜色
  85.   #--------------------------------------------------------------------------
  86.   def normal_color
  87.     return text_color(0)
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 获取系统文字颜色
  91.   #--------------------------------------------------------------------------
  92.   def system_color
  93.     return text_color(16)
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # ● 获取危机文字颜色
  97.   #--------------------------------------------------------------------------
  98.   def crisis_color
  99.     return text_color(17)
  100.   end
  101.   #--------------------------------------------------------------------------
  102.   # ● 获取战斗不能文字颜色
  103.   #--------------------------------------------------------------------------
  104.   def knockout_color
  105.     return text_color(18)
  106.   end
  107.   #--------------------------------------------------------------------------
  108.   # ● 获取变量条背景颜色
  109.   #--------------------------------------------------------------------------
  110.   def gauge_back_color
  111.     return text_color(19)
  112.   end
  113.   #--------------------------------------------------------------------------
  114.   # ● 获取体力值槽颜色1
  115.   #--------------------------------------------------------------------------
  116.   def hp_gauge_color1
  117.     return text_color(20)
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # ● 获取体力值槽颜色2
  121.   #--------------------------------------------------------------------------
  122.   def hp_gauge_color2
  123.     return text_color(21)
  124.   end
  125.   #--------------------------------------------------------------------------
  126.   # ● 获取魔力值槽颜色1
  127.   #--------------------------------------------------------------------------
  128.   def mp_gauge_color1
  129.     return text_color(22)
  130.   end
  131.   #--------------------------------------------------------------------------
  132.   # ● 获取魔力值槽颜色2
  133.   #--------------------------------------------------------------------------
  134.   def mp_gauge_color2
  135.     return text_color(23)
  136.   end
  137.   #--------------------------------------------------------------------------
  138.   # ● 获取装备画面能力值上升颜色
  139.   #--------------------------------------------------------------------------
  140.   def power_up_color
  141.     return text_color(24)
  142.   end
  143.   #--------------------------------------------------------------------------
  144.   # ● 获取装备画面能力值下降颜色
  145.   #--------------------------------------------------------------------------
  146.   def power_down_color
  147.     return text_color(25)
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # ● 会制图标
  151.   #     icon_index : 图标号
  152.   #     x     : 描画目标 X 坐标
  153.   #     y     : 描画目标 Y 坐标
  154.   #     enabled    : 有效化标志,为 false 时则图标半透明化。
  155.   #--------------------------------------------------------------------------
  156.   def draw_icon(icon_index, x, y, enabled = true)
  157.     bitmap = Cache.system("Iconset")
  158.     rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  159.     self.contents.blt(x, y, bitmap, rect, enabled ? 255 : 128)
  160.   end
  161.   #--------------------------------------------------------------------------
  162.   # ● 绘制头像
  163.   #     face_name  : 头像文件名
  164.   #     face_index : 头像号码
  165.   #     x     : 描画目标 X 坐标
  166.   #     y     : 描画目标 Y 坐标
  167.   #     size       : 显示大小
  168.   #--------------------------------------------------------------------------
  169.   def draw_face(face_name, face_index, x, y, size = 96)
  170.     bitmap = Cache.face(face_name)
  171.     rect = Rect.new(0, 0, 0, 0)
  172.     rect.x = face_index % 4 * 96 + (96 - size) / 2
  173.     rect.y = face_index / 4 * 96 + (96 - size) / 2
  174.     rect.width = size
  175.     rect.height = size
  176.     self.contents.blt(x, y, bitmap, rect)
  177.     bitmap.dispose
  178.   end
  179.   #--------------------------------------------------------------------------
  180.   # ● 绘制行走图
  181.   #     character_name  : 行走图文件名
  182.   #     character_index : 行走图号码
  183.   #     x     : 描画目标 X 坐标
  184.   #     y     : 描画目标 Y 坐标
  185.   #--------------------------------------------------------------------------
  186.   def draw_character(character_name, character_index, x, y)
  187.     return if character_name == nil
  188.     bitmap = Cache.character(character_name)
  189.     sign = character_name[/^[\!\$]./]
  190.     if sign != nil and sign.include?('$')
  191.       cw = bitmap.width / 3
  192.       ch = bitmap.height / 4
  193.     else
  194.       cw = bitmap.width / 12
  195.       ch = bitmap.height / 8
  196.     end
  197.     n = character_index
  198.     src_rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, ch)
  199.     self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect)
  200.   end
  201.   #--------------------------------------------------------------------------
  202.   # ● 获取体力文字颜色
  203.   #     actor : 角色
  204.   #--------------------------------------------------------------------------
  205.   def hp_color(actor)
  206.     return knockout_color if actor.hp == 0
  207.     return crisis_color if actor.hp < actor.maxhp / 4
  208.     return normal_color
  209.   end
  210.   #--------------------------------------------------------------------------
  211.   # ● 获取魔力文字颜色
  212.   #     actor : 角色
  213.   #--------------------------------------------------------------------------
  214.   def mp_color(actor)
  215.     return crisis_color if actor.mp < actor.maxmp / 4
  216.     return normal_color
  217.   end
  218.   #--------------------------------------------------------------------------
  219.   # ● 绘制角色行走图
  220.   #     actor : 角色
  221.   #     x     : 描画目标 X 坐标
  222.   #     y     : 描画目标 Y 坐标
  223.   #--------------------------------------------------------------------------
  224.   def draw_actor_graphic(actor, x, y)
  225.     draw_character(actor.character_name, actor.character_index, x, y)
  226.   end
  227.   #--------------------------------------------------------------------------
  228.   # ● 绘制角色头像
  229.   #     actor : 角色
  230.   #     x     : 描画目标 X 坐标
  231.   #     y     : 描画目标 Y 坐标
  232.   #     size  : 绘制大小
  233.   #--------------------------------------------------------------------------
  234.   def draw_actor_face(actor, x, y, size = 96)
  235.     draw_face(actor.face_name, actor.face_index, x, y, size)
  236.   end
  237.   #--------------------------------------------------------------------------
  238.   # ● 绘制角色名称
  239.   #     actor : 角色
  240.   #     x     : 描画目标 X 坐标
  241.   #     y     : 描画目标 Y 坐标
  242.   #--------------------------------------------------------------------------
  243.   def draw_actor_name(actor, x, y)
  244.     self.contents.font.color = hp_color(actor)
  245.     self.contents.draw_text(x, y, 108, WLH, actor.name)
  246.   end
  247.   #--------------------------------------------------------------------------
  248.   # ● 绘制角色职业
  249.   #     actor : 角色
  250.   #     x     : 描画目标 X 坐标
  251.   #     y     : 描画目标 Y 坐标
  252.   #--------------------------------------------------------------------------
  253.   def draw_actor_class(actor, x, y)
  254.     self.contents.font.color = normal_color
  255.     self.contents.draw_text(x, y, 108, WLH, actor.class.name)
  256.   end
  257.   #--------------------------------------------------------------------------
  258.   # ● 绘制角色等级
  259.   #     actor : 角色
  260.   #     x     : 描画目标 X 坐标
  261.   #     y     : 描画目标 Y 坐标
  262.   #--------------------------------------------------------------------------
  263.   def draw_actor_level(actor, x, y)
  264.     self.contents.font.color = system_color
  265.     self.contents.draw_text(x, y, 32, WLH, Vocab::level_a)
  266.     self.contents.font.color = normal_color
  267.     self.contents.draw_text(x + 32, y, 24, WLH, actor.level, 2)
  268.   end
  269.   #--------------------------------------------------------------------------
  270.   # ● 绘制角色状态
  271.   #     actor : 角色
  272.   #     x     : 描画目标 X 坐标
  273.   #     y     : 描画目标 Y 坐标
  274.   #     width : 描画目标宽度
  275.   #--------------------------------------------------------------------------
  276.   def draw_actor_state(actor, x, y, width = 96)
  277.     count = 0
  278.     for state in actor.states
  279.       draw_icon(state.icon_index, x + 24 * count, y)
  280.       count += 1
  281.       break if (24 * count > width - 24)
  282.     end
  283.   end
  284.   #--------------------------------------------------------------------------
  285.   # ● 绘制角色体力
  286.   #     actor : 角色
  287.   #     x     : 描画目标 X 坐标
  288.   #     y     : 描画目标 Y 坐标
  289.   #     width : 描画目标宽度
  290.   #--------------------------------------------------------------------------
  291.   def draw_actor_hp(actor, x, y, width = 120)
  292.     draw_actor_hp_gauge(actor, x, y, width)
  293.     self.contents.font.color = system_color
  294.     self.contents.draw_text(x, y, 30, WLH, Vocab::hp_a)
  295.     self.contents.font.color = hp_color(actor)
  296.     last_font_size = self.contents.font.size
  297.     xr = x + width
  298.     if width < 120
  299.       self.contents.draw_text(xr - 44, y, 44, WLH, actor.hp, 2)
  300.     else
  301.       self.contents.draw_text(xr - 99, y, 44, WLH, actor.hp, 2)
  302.       self.contents.font.color = normal_color
  303.       self.contents.draw_text(xr - 55, y, 11, WLH, "/", 2)
  304.       self.contents.draw_text(xr - 44, y, 44, WLH, actor.maxhp, 2)
  305.     end
  306.   end
  307.   #--------------------------------------------------------------------------
  308.   # ● 绘制角色体力值槽
  309.   #     actor : 角色
  310.   #     x     : 描画目标 X 坐标
  311.   #     y     : 描画目标 Y 坐标
  312.   #     width : 描画目标宽度
  313.   #--------------------------------------------------------------------------
  314.   def draw_actor_hp_gauge(actor, x, y, width = 120)
  315.     gw = width * actor.hp / actor.maxhp
  316.     gc1 = hp_gauge_color1
  317.     gc2 = hp_gauge_color2
  318.     self.contents.fill_rect(x, y + WLH - 8, width, 6, gauge_back_color)
  319.     self.contents.gradient_fill_rect(x, y + WLH - 8, gw, 6, gc1, gc2)
  320.   end
  321.   #--------------------------------------------------------------------------
  322.   # ● 绘制角色魔力
  323.   #     actor : 角色
  324.   #     x     : 描画目标 X 坐标
  325.   #     y     : 描画目标 Y 坐标
  326.   #     width : 描画目标宽度
  327.   #--------------------------------------------------------------------------
  328.   def draw_actor_mp(actor, x, y, width = 120)
  329.     draw_actor_mp_gauge(actor, x, y, width)
  330.     self.contents.font.color = system_color
  331.     self.contents.draw_text(x, y, 30, WLH, Vocab::mp_a)
  332.     self.contents.font.color = mp_color(actor)
  333.     last_font_size = self.contents.font.size
  334.     xr = x + width
  335.     if width < 120
  336.       self.contents.draw_text(xr - 44, y, 44, WLH, actor.mp, 2)
  337.     else
  338.       self.contents.draw_text(xr - 99, y, 44, WLH, actor.mp, 2)
  339.       self.contents.font.color = normal_color
  340.       self.contents.draw_text(xr - 55, y, 11, WLH, "/", 2)
  341.       self.contents.draw_text(xr - 44, y, 44, WLH, actor.maxmp, 2)
  342.     end
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # ● 绘制角色魔力值槽
  346.   #     actor : 角色
  347.   #     x     : 描画目标 X 坐标
  348.   #     y     : 描画目标 Y 坐标
  349.   #     width : 描画目标宽度
  350.   #--------------------------------------------------------------------------
  351.   def draw_actor_mp_gauge(actor, x, y, width = 120)
  352.     gw = width * actor.mp / [actor.maxmp, 1].max
  353.     gc1 = mp_gauge_color1
  354.     gc2 = mp_gauge_color2
  355.     self.contents.fill_rect(x, y + WLH - 8, width, 6, gauge_back_color)
  356.     self.contents.gradient_fill_rect(x, y + WLH - 8, gw, 6, gc1, gc2)
  357.   end
  358.   #--------------------------------------------------------------------------
  359.   # ● 绘制角色能力值
  360.   #     actor : 角色
  361.   #     x     : 描画目标 X 坐标
  362.   #     y     : 描画目标 Y 坐标
  363.   #     type  : 能力值类型(0-3)
  364.   #--------------------------------------------------------------------------
  365.   def draw_actor_parameter(actor, x, y, type)
  366.     case type
  367.     when 0
  368.       parameter_name = Vocab::atk
  369.       parameter_value = actor.atk
  370.     when 1
  371.       parameter_name = Vocab::def
  372.       parameter_value = actor.def
  373.     when 2
  374.       parameter_name = Vocab::spi
  375.       parameter_value = actor.spi
  376.     when 3
  377.       parameter_name = Vocab::agi
  378.       parameter_value = actor.agi
  379.     end
  380.     self.contents.font.color = system_color
  381.     self.contents.draw_text(x, y, 120, WLH, parameter_name)
  382.     self.contents.font.color = normal_color
  383.     self.contents.draw_text(x + 120, y, 36, WLH, parameter_value, 2)
  384.   end
  385.   #--------------------------------------------------------------------------
  386.   # ● 绘制物品
  387.   #     item    : 物品(技能、武器、防具也合用)
  388.   #     x       : 描画目标 X 坐标
  389.   #     y       : 描画目标 Y 坐标
  390.   #     enabled : 有效化标志,为 false 时则物品半透明化。
  391.   #--------------------------------------------------------------------------
  392.   def draw_item_name(item, x, y, enabled = true)
  393.     if item != nil
  394.       draw_icon(item.icon_index, x, y, enabled)
  395.       self.contents.font.color = normal_color
  396.       self.contents.font.color.alpha = enabled ? 255 : 128
  397.       self.contents.draw_text(x + 24, y, 172, WLH, item.name)
  398.     end
  399.   end
  400.   #--------------------------------------------------------------------------
  401.   # ● 绘制金钱单位
  402.   #     value : 数目
  403.   #     x     : 描画目标 X 坐标
  404.   #     y     : 描画目标 Y 坐标
  405.   #     width : 描画目标宽度
  406.   #--------------------------------------------------------------------------
  407.   def draw_currency_value(value, x, y, width)
  408.     cx = contents.text_size(Vocab::gold).width
  409.     self.contents.font.color = normal_color
  410.     self.contents.draw_text(x, y, width-cx-2, WLH, value, 2)
  411.     self.contents.font.color = system_color
  412.     self.contents.draw_text(x, y, width, WLH, Vocab::gold, 2)
  413.   end
  414. end
  415. class Window_Setable < Window_Base
  416.   attr_accessor :item_id, :item_set, :sets
  417.   def initialize(x, y, width, height, sets)
  418.     super(x, y, width, height)
  419.     self.sets = sets
  420.     self.item_id = 0
  421.     self.active = true
  422.     self.cursor_rect = sets[0][0]
  423.     self.item_set = []
  424.     for i in 0...sets.size
  425.       self.item_set[i] = sets[0][2]
  426.     end
  427.     for i in 0...self.sets.size
  428.       rect = self.sets[i][0]
  429.       str = self.sets[i][1][self.item_set[i]]
  430.       self.contents.draw_text(rect, str)
  431.     end
  432.   end
  433.   def update
  434.     super
  435.     if Input.trigger?(Input::RIGHT) or Input.repeat?(Input::RIGHT)
  436.       self.item_id += 1
  437.       if self.item_id >= self.sets.size
  438.         self.item_id -= self.sets.size
  439.       end
  440.       @moved_lr = true
  441.     end
  442.     if Input.trigger?(Input::LEFT) or Input.repeat?(Input::LEFT)
  443.       self.item_id -= 1
  444.       if self.item_id < 0
  445.         self.item_id += self.sets.size
  446.       end
  447.       @moved_lr = true
  448.     end
  449.     self.cursor_rect = sets[item_id][0]
  450.     if Input.trigger?(Input::UP) or Input.repeat?(Input::UP)
  451.       self.item_set[item_id] += 1
  452.       if self.item_set[item_id] >= self.sets[item_id][1].size
  453.         self.item_set[item_id] -= self.sets[item_id][1].size
  454.       end
  455.       @moved_ud = true
  456.     end
  457.     if Input.trigger?(Input::DOWN) or Input.repeat?(Input::DOWN)
  458.       self.item_set[item_id] -= 1
  459.       if self.item_set[item_id] < 0
  460.         self.item_set[item_id] += self.sets[item_id][1].size
  461.       end
  462.       @moved_ud = true
  463.     end
  464.     return true if !@moved_ud
  465.     self.contents.clear
  466.     for i in 0...self.sets.size
  467.       rect = self.sets[i][0]
  468.       str = self.sets[i][1][self.item_set[i]]
  469.       self.contents.draw_text(rect, str)
  470.     end
  471.     self.cursor_rect = sets[self.item_id][0]
  472.     @moved_lr = false
  473.     @moved_ud = false
  474.     def dispose
  475.       super
  476.       $windows.delete_at($windows.size-1)
  477.     end
  478.   end
  479. end
  480. class Window_Input < Window_Setable
  481.   def initialize(x, y, width, height, sets)
  482.     super
  483.     @result_window = Window_Result.new(0, 96, 544, 416-96)
  484.     @compare_item_id = self.item_id
  485.     @compare_item_set = []
  486.     self.contents.draw_text(Rect.new(0, 0, 544-32, 32), "请设定4个数:(方向键操作)")
  487.     for i in 0...self.item_set.size
  488.       @compare_item_set[i] = self.item_set[i]
  489.     end
  490.   end
  491.   def update
  492.     super
  493.     return true if @compare_item_set == self.item_set
  494.     @result_window.update
  495.     @compare_item_set = []
  496.     for i in 0...self.item_set.size
  497.       @compare_item_set[i] = self.item_set[i]
  498.     end
  499.     self.contents.draw_text(Rect.new(0, 0, 544-32, 32), "请设定4个数:(方向键操作)")
  500.   end
  501. end
  502. class Window_Result < Window_Base
  503.   def author
  504.     return "lotsofone"
  505.   end
  506.   def initialize(x, y, width, height)
  507.     super
  508.     self.contents.draw_text(Rect.new(390, 250, 140, 24), "by "+author)
  509.   end
  510.   def update
  511.     super
  512.     self.contents.clear
  513.     number_a = $windows[0].sets[0][1][$windows[0].item_set[0]]
  514.     number_b = $windows[0].sets[1][1][$windows[0].item_set[1]]
  515.     number_c = $windows[0].sets[2][1][$windows[0].item_set[2]]
  516.     number_d = $windows[0].sets[3][1][$windows[0].item_set[3]]
  517.     problem = Problem.new(number_a.to_i, number_b.to_i, number_c.to_i, number_d.to_i)
  518.     array = problem.get_way
  519.     x = 0
  520.     n = 0
  521.     str_array = [""]
  522.     for i in 0...array.size
  523.       str_array[n] << "     " if x%3 != 0
  524.       str_array[n] << array[i]
  525.       x += 1
  526.       if x%3 == 0
  527.         n += 1
  528.         str_array[n] = ""
  529.       end
  530.     end
  531.     self.contents.draw_text(Rect.new(0, 0, 544-32, 32), "解法:")
  532.     for i in 0...str_array.size
  533.       self.contents.draw_text(Rect.new(0, 32*i+32, 544-32, 32), str_array[i])
  534.     end
  535.     if array.size == 0
  536.       self.contents.draw_text(Rect.new(0, 32, 544-32, 32), "无解")
  537.     end
  538.     self.contents.draw_text(Rect.new(390, 250, 140, 24), "by "+author)
  539.   end
  540. end
  541. #------------------------------------------------------
  542. #------------------------------------------------------
  543. def deepcopy(input)
  544.   begin Marshal.load Marshal.dump input rescue input.map { |i| i.is_a?(Array) ? deepcopy(i) : (begin i.clone rescue i end) } end
  545. end

RUBY 代码复制
  1. class Problem
  2.   private
  3.   def equal_value
  4.     return 24 #必须大于0
  5.   end
  6.   def break_24_2(a, b)#以字符串输入
  7.     returns = []
  8.     s1 = a+"+"+b
  9.     s2 = a+"-"+b
  10.     s3 = a+"*"+b
  11.     s4 = a+"/"+b
  12.     s5 = b+"-"+a
  13.     s6 = b+"/"+a
  14.     returns.push(s1) if (eval(s1) - equal_value).abs < 0.00001
  15.     returns.push(s2) if (eval(s2) - equal_value).abs < 0.00001
  16.     returns.push(s3) if (eval(s3) - equal_value).abs < 0.00001
  17.     returns.push(s4) if (eval(s4) - equal_value).abs < 0.00001
  18.     returns.push(s5) if (eval(s5) - equal_value).abs < 0.00001
  19.     returns.push(s6) if (eval(s6) - equal_value).abs < 0.00001
  20.     return returns
  21.   end
  22.   def break_24_3(a, b, c)#以字符串输入
  23.     string_array = [a, b, c]
  24.     returns = []
  25.     for x in 0..2
  26.       for y in (x+1)..2
  27.         for s in 0..2
  28.           next if s == x or s == y
  29.           string = string_array[s]
  30.         end
  31.         e_string1 = string_array[x]
  32.         e_string2 = string_array[y]
  33.         e1 = "("+e_string1+"+"+e_string2+")"
  34.         e2 = "("+e_string1+"-"+e_string2+")"
  35.         e3 = "("+e_string1+"*"+e_string2+")"
  36.         e4 = "("+e_string1+"/"+e_string2+")"
  37.         e5 = "("+e_string2+"-"+e_string1+")"
  38.         e6 = "("+e_string2+"/"+e_string1+")"
  39.         returns.concat(break_24_2(string, e1))
  40.         returns.concat(break_24_2(string, e2))
  41.         returns.concat(break_24_2(string, e3))
  42.         returns.concat(break_24_2(string, e4))
  43.         returns.concat(break_24_2(string, e5))
  44.         returns.concat(break_24_2(string, e6))
  45.       end
  46.     end
  47.     return returns
  48.   end
  49.   def break_24(a, b, c, d)#以整数输入
  50.     number_array = [a, b, c, d]
  51.     returns = []
  52.     for x in 0..3
  53.       for y in (x+1)..3
  54.         for n1 in 0..3
  55.           if n1 != x and n1 != y
  56.             number1 = number_array[n1].to_f.to_s
  57.             for n2 in 0..3
  58.               if n2 != x and n2 != y and n2 != n1
  59.                 number2 = number_array[n2].to_f.to_s
  60.                 break
  61.               end
  62.             end
  63.             break
  64.           end
  65.         end
  66.         e_number1 = number_array[x].to_f.to_s
  67.         e_number2 = number_array[y].to_f.to_s
  68.         e1 = "("+e_number1+"+"+e_number2+")"
  69.         e2 = "("+e_number1+"-"+e_number2+")"
  70.         e3 = "("+e_number1+"*"+e_number2+")"
  71.         e4 = "("+e_number1+"/"+e_number2+")"
  72.         e5 = "("+e_number2+"-"+e_number1+")"
  73.         e6 = "("+e_number2+"/"+e_number1+")"
  74.         returns += break_24_3(number1, number2, e1)
  75.         returns += break_24_3(number1, number2, e2)
  76.         returns += break_24_3(number1, number2, e3)
  77.         returns += break_24_3(number1, number2, e4)
  78.         returns += break_24_3(number1, number2, e5)
  79.         returns += break_24_3(number1, number2, e6)
  80.       end
  81.     end
  82.     return returns
  83.   end
  84.   def make_sure_operators_type(array, i)
  85.     if array[i] == "*" or array[i] == "/"
  86.       return 2
  87.     elsif array[i] == "+" or array[i] == "-"
  88.       return 1
  89.     else
  90.       return 0
  91.     end
  92.   end
  93.   def put_in_order_3(array, x, y, z)
  94.     deals = []
  95.     for i in 0...array.size
  96.       deals << array[i]
  97.     end
  98.     s0 = deals[x[0]]+deals[x[1]]
  99.     s1 = deals[y[0]]+deals[y[1]]
  100.     s2 = deals[z[0]]+deals[z[1]]
  101.     string_array = quick_soft([s0, s1, s2])
  102.     deals[x[0]] = string_array[0][0, 1]
  103.     deals[x[1]] = string_array[0][1, string_array[0].size-1]
  104.     deals[y[0]] = string_array[1][0, 1]
  105.     deals[y[1]] = string_array[1][1, string_array[1].size-1]
  106.     deals[z[0]] = string_array[2][0, 1]
  107.     deals[z[1]] = string_array[2][1, string_array[2].size-1]
  108.     return deals
  109.   end
  110.   def put_in_order_2(array, x, y)
  111.     deals = []
  112.     for i in 0...array.size
  113.       deals << array[i]
  114.     end
  115.     s0 = deals[x[0]]+deals[x[1]]
  116.     s1 = deals[y[0]]+deals[y[1]]
  117.     string_array = quick_soft([s0, s1])
  118.     deals[x[0]] = string_array[0][0, 1]
  119.     deals[x[1]] = string_array[0][1, string_array[0].size-1]
  120.     deals[y[0]] = string_array[1][0, 1]
  121.     deals[y[1]] = string_array[1][1, string_array[1].size-1]
  122.     return deals
  123.   end
  124.   def deal(way)
  125.     way = Math.clear_bracket(way)
  126.     way = Math.put_in_order(way)
  127.     for i in 0...way.size
  128.       case way[i,1]
  129.       when "*"
  130.         way[i,1] = "×"
  131.       when "/"
  132.         way[i,1] = "÷"
  133.       end
  134.     end
  135.     return way
  136.   end
  137.   public
  138.   def initialize(a, b, c, d)#abcd都必须大于0
  139.     way = break_24(a, b, c, d)
  140.     for i in 0...way.size
  141.       way[i] = deal(way[i])
  142.     end
  143.     i = 0
  144.     while i < way.size
  145.       ds = i+1
  146.       while ds < way.size
  147.         if way[i] == way[ds]
  148.           way.delete_at(ds)
  149.           ds -= 1
  150.         end
  151.         ds += 1
  152.       end
  153.       i += 1
  154.     end
  155.     @way = deepcopy(way)
  156.   end
  157.   def get_way
  158.     return @way
  159.   end
  160. end
  161. module Math
  162.   def self.clear_bracket_a(array_input)#去括号化简
  163.     array = []
  164.     for i in 0...array_input.size
  165.       array << array_input[i]
  166.     end
  167.     if array.include?("(") #带有括号
  168.       left = 0
  169.       while left < array.size
  170.         if array[left] == "("
  171.           right = left + 1
  172.           nop = 1
  173.           dop = 1
  174.           while right < array.size
  175.             if array[right] == "("
  176.               nop += 1
  177.               dop += 1
  178.             end
  179.             if array[right] == ")"
  180.               dop -= 1
  181.               if dop == 0#意思是两个括号在同一个层次
  182.                 re_calls = []
  183.                 for i in (left+1)...right
  184.                   re_calls << array[i]
  185.                 end
  186.                 gets = clear_bracket_a(re_calls)
  187.                 if gets.size == 1
  188.                   if array[left-1] == "*"
  189.                     array[left..right] = gets
  190.                   elsif array[left-1] == "/"
  191.                     deep = 0
  192.                     for i in 0...gets.size
  193.                       if gets[i] == "("
  194.                         deep += 1
  195.                       elsif gets[i] == ")"
  196.                         deep -= 1
  197.                       end
  198.                       if deep == 0
  199.                         if gets[i] == "*"
  200.                           gets[i] = "/"
  201.                         elsif gets[i] == "/"
  202.                           gets[i] = "*"
  203.                         end
  204.                       end
  205.                     end
  206.                   end
  207.                 else
  208.                   if array[right+1] != "*" and array[right+1] != "/"
  209.                     if array[left-1] == "+"
  210.                       array[left..right] = gets
  211.                     elsif array[left-1] == "-"
  212.                       for i in 0...gets.size
  213.                         if gets[i] == "+"
  214.                           gets[i] = "-"
  215.                         elsif gets[i] == "-"
  216.                           gets[i] = "+"
  217.                         end
  218.                       end
  219.                       array[left..right] = gets
  220.                     elsif left == 0 #此分支于2012-3-18添加,修正了
  221.                       array[left..right] = gets
  222.                     else
  223.                       str = "("
  224.                       for i in 0...gets.size
  225.                         str << gets[i]
  226.                       end
  227.                       str << ")"
  228.                       array[left..right] = str
  229.                     end
  230.                   else
  231.                     str = "("
  232.                     for i in 0...gets.size
  233.                       str << gets[i]
  234.                     end
  235.                     str << ")"
  236.                     array[left..right] = str
  237.                   end
  238.                 end
  239. #~                 array.faltten!
  240.                 break
  241.               end
  242.             end
  243.             right += 1
  244.           end
  245.         end
  246.         left += 1
  247.       end#合并成单项式+-单项式……的形式。
  248.       returns = []
  249.       i = 0
  250.       returns << ""
  251.       loop do
  252.         loop do
  253.           break if array[0] == "+" or array[0] == "-" or array.size <= 0
  254.           returns[i] << array[0]
  255.           array.delete_at(0)
  256.         end
  257.         break if array.size <= 0
  258.         if returns[i] != ""
  259.           i += 1
  260.           returns << ""
  261.         end
  262.         returns[i] << array[0]
  263.         array.delete_at(0)
  264.         i += 1
  265.         returns << ""
  266.       end
  267.       return returns
  268.     else#没有括号了,就合并成单项式+-单项式+-单项式……的形式
  269.       returns = []
  270.       i = 0
  271.       returns << ""
  272.       loop do
  273.         loop do
  274.           break if array[0] == "+" or array[0] == "-" or array.size <= 0
  275.           returns[i] << array[0]
  276.           array.delete_at(0)
  277.         end
  278.         break if array.size <= 0
  279.         if returns[i] != ""
  280.           i += 1
  281.           returns << ""
  282.         end
  283.         returns[i] << array[0]
  284.         array.delete_at(0)
  285.         i += 1
  286.         returns << ""
  287.       end
  288.       return returns
  289.     end
  290.   end
  291.   def self.clear_bracket(string_input)
  292.     array = split_math(string_input)
  293.     array = clear_bracket_a(array)
  294.     returns = ""
  295.     for i in 0...array.size
  296.       returns << array[i]
  297.     end
  298.     return returns
  299.   end
  300.   def self.put_in_order_array_1(array_input)#无括号的部分
  301. #~     array = array_input.clone
  302.     array=deepcopy(array_input)
  303.     times_array = Array.new
  304.     t = 0
  305.     times_array[t] = []
  306.     for i in 0...array.size
  307.       if array[i] == "+" or array[i] == "-"
  308.         t+=1
  309.         times_array[t] = [array[i]]
  310.         t+=1
  311.         times_array[t] = []
  312.       else
  313.         times_array[t] << array[i]
  314.       end
  315.     end
  316.     for i in 0...times_array.size
  317.       times_array[i] = put_in_order_array_1_1(times_array[i])
  318.     end
  319.     returns = put_in_order_array_1_2(times_array)
  320.     return returns
  321.   end
  322.   def self.put_in_order_array_1_1(input0)#以array输入   */计算排序(无括号)
  323.     input = input0.clone
  324.     if input.class != Array
  325.       return input
  326.     end
  327.     timers = [input[0]]
  328.     dividers = []
  329.     for i in 1..(input.size-1)/2
  330.       if input[i*2-1] == "*"
  331.         timers << input[i*2]
  332.       elsif input[i*2-1] == "/"
  333.         dividers << input[i*2]
  334.       end
  335.     end
  336.     dividers = quick_soft(dividers)
  337.     timers = quick_soft(timers)
  338.     returns = timers[0]
  339.  
  340.     for i in 1...timers.size
  341.       next unless timers[i]
  342.       returns << "*"
  343.       returns << timers[i]
  344.     end
  345.     for i in 0...dividers.size
  346.       next unless dividers[i]
  347.       returns << "/"
  348.       returns << dividers[i]
  349.     end
  350.     return returns
  351.   end
  352.   def self.put_in_order_array_1_2(input)#以array输入   +-计算排序(无括号)
  353.     addtions = [input[0]]
  354.     minus = []
  355.     for i in 1..(input.size-1)/2
  356.       if input[i*2-1] == "+"
  357.         addtions << input[i*2]
  358.       elsif input[i*2-1] == "-"
  359.         minus << input[i*2]
  360.       end
  361.     end
  362.     minus = quick_soft(minus)
  363.     addtions = quick_soft(addtions)
  364.     returns = addtions[0]
  365.     for i in 1...addtions.size
  366.       next unless addtions[i]
  367.       returns << "+"
  368.       returns << addtions[i]
  369.     end
  370.     for i in 0...minus.size
  371.       next unless minus[i]
  372.       returns << "-"
  373.       returns << minus[i]
  374.     end
  375.     return returns
  376.   end
  377.  
  378.  
  379.   def self.put_in_order_array(array_input)
  380.     array = deepcopy(array_input)
  381.     if array.include?("(")
  382.       left = 0
  383.       while left < array.size
  384.         if array[left] == "("
  385.           right = left+1
  386.           d = 1
  387.           while right < array.size
  388.             if array[right] == "("
  389.               d += 1
  390.             end
  391.             if array[right] == ")"
  392.               d -= 1
  393.               if d == 0
  394.                 tr = put_in_order_array(array[left+1..right-1])
  395.                 if tr
  396.                   array[left..right] = "(" + tr + ")"
  397.                 else
  398.                   array[left..right] = nil
  399.                   array.delete_at(left)
  400.                 end
  401.                 break
  402.               end
  403.             end
  404.             right += 1
  405.           end
  406.         end
  407.         left += 1
  408.       end
  409.     end
  410.     string = put_in_order_array_1(array)
  411.     return string
  412.   end
  413.  
  414.   def self.put_in_order(string)
  415.     array = split_math(string)
  416.     return put_in_order_array(array)
  417.   end
  418. end
  419. def split_math(string)
  420.   array = string.split(//)
  421.   i = 0
  422.   numbers = %w(0 1 2 3 4 5 6 7 8 9)
  423.   while i < array.size
  424.     if numbers.include?(array[i])
  425.       n = i+1
  426.       loop do
  427.         break unless numbers.include?(array[n])
  428.         array[i] << array[n]
  429.         array.delete_at(n)
  430.       end
  431.     end
  432.     i += 1
  433.   end
  434.   return array
  435. end
  436. def quick_soft(array)#快速排序法
  437.   x = array[0]
  438.   array_small = []
  439.   array_else = []
  440.   for i in 1...array.size
  441.     if array[i] < x
  442.       array_small << array[i]
  443.     else
  444.       array_else << array[i] #被分成array_small 、 x 和 array_else
  445.     end
  446.   end
  447.   if array_small.size == 0
  448.     returns1 = []
  449.   elsif array_small.size == 1
  450.     returns1 = [array_small[0]]
  451.   else
  452.     returns1 = quick_soft(array_small)
  453.   end
  454.   if array_else.size == 0
  455.     returns3 = []
  456.   elsif array_else.size == 1
  457.     returns3 = [array_else[0]]
  458.   else
  459.     returns3 = quick_soft(array_else)
  460.   end
  461.   returns2 = [x]
  462.   return returns1 + returns2 + returns3
  463. end
  464. #------------------------------------------------------
  465. #------------------------------------------------------
  466. Font.default_name = ["SimHei", "黑体", "DFKai-SB", "標楷體", "Verdana", "Arial Unicode MS"]
  467. $equal_value=24
  468. Graphics.freeze
  469. array = []
  470. for i in 0..12
  471.   array[i] = (i+1).to_s
  472. end
  473. sets = []
  474. set_now = 0
  475. for i in 0..3
  476.   sets[i] = [Rect.new(0+(i*272/3), 32, 32, 32), array, set_now]
  477. end
  478. $windows = [Window_Input.new(0, 0, 336, 96, sets)]
  479. Graphics.transition(30)
  480. loop do
  481.   Graphics.update
  482.   Input.update
  483.   $windows[$windows.size-1].update if $windows[0]
  484. end
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-15 18:18

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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