Project1

标题: 如何设置随机失去玩家持有的某些道具 [打印本页]

作者: wingzeroplus    时间: 2013-2-24 13:05
标题: 如何设置随机失去玩家持有的某些道具
本帖最后由 wingzeroplus 于 2013-2-24 23:29 编辑

比如数据库设置了道具ID有1-100号
玩家在游戏过程中获得了一些道具(不一定每个ID的道具都有)
然后执行一个事件,随机失去已经持有的5个道具
要求:ID重复可以,但数量不为0才会失去,必须累计失去5个,如果少于5个则全部失去。另外还要显示失去了哪些道具

这个事件应该怎么用脚本写?求助
作者: 芯☆淡茹水    时间: 2013-2-24 14:22
本帖最后由 芯☆淡茹水 于 2013-2-24 15:44 编辑

  搞了个未完成的脚本,试验了一下,不知道脚本那儿有问题,物品是一个一个随机减少。由于这两天在搞一个角色随机生成系统,想问题想得头疼,不想再想了,把脚本发出来,也许LZ能根据这个思路解决  

使用方法:事件脚本:$game_party.lose_items
  1. class Game_Party
  2.   def lose_items
  3.     items = []
  4.     if @items.size > 0 and @items.size <= 5
  5.       for i in @items
  6.         items.push(i)
  7.       end
  8.     else
  9.       loop do
  10.         a = rand (@items.size)
  11.         if a > 0
  12.           items.push(@items[a])
  13.         end
  14.         if items.size == 5
  15.           break
  16.         end
  17.       end
  18.     end
  19.     n = -1
  20.     for j in items
  21.       @items[j] = [[item_number(j) + n, 0].max, 99].min
  22.     end
  23.   end
  24. end
复制代码

作者: 弗雷德    时间: 2013-2-24 17:27
本帖最后由 弗雷德 于 2013-2-24 17:28 编辑

精简了下。

调用方法$game_party.lose_item_rand(n) n为随机失去物品的最大个数。你测试下。
至于提示问题俺还没解决
  1. class Game_Party
  2. def lose_item_rand(n)
  3.     b = 0
  4.     loop do
  5.         a = rand(@items.size)
  6.         if a>0
  7.            b = (b+item_number(a))>n ? (n-b) : item_number(a)
  8.          end
  9.      gain_item(a, -b)
  10.       n -= b
  11.       if n < 1
  12.         break
  13.       end
  14.     end
  15.   end
  16. end
复制代码

作者: wingzeroplus    时间: 2013-2-24 20:21
弗雷德 发表于 2013-2-24 17:27
精简了下。

调用方法$game_party.lose_item_rand(n) n为随机失去物品的最大个数。你测试下。

能不能解释一下这句的原理,就这句没看不太明白
b = (b+item_number(a))>n ? (n-b) : item_number(a)
我理解如果是(b+item_number(a))>n 就给给B赋值N-B 如果小于就给B赋值item_number(a)  是这样吗?



作者: 弗雷德    时间: 2013-2-24 21:04
本帖最后由 弗雷德 于 2013-2-24 21:29 编辑

更新了一下,这下不会陷入死循环了
其实俺在想,关于获取角色身上持有物品的数组是不是有更简短的语句呃?
n的意思是随机丢弃物品的数量,比如N为10,那么会一直丢弃物品直到丢够10个,当然身上不够10件物品就会中断循环。
  1. class Game_Party
  2. def lose_item_rand(n)
  3.     items = []
  4.     for i in [email protected]
  5.       if $game_party.item_number(i) > 0
  6.         items.push($data_items[i]) #获取角色身上拥有的物品
  7.       end
  8.     end
  9.     b = 0
  10.     loop do
  11.         a = (rand(100) + 100) #只从ID为100-200之间的物品抽取随机数
  12.         if  item_number(a)>0
  13.           b += (b+item_number(a))>n ? (n-b) : item_number(a)   
  14.           gain_item(a, -b) if b > 0
  15.         end
  16.         n -= b
  17.       if n < 1 or items.size < 1 #当丢弃数量达到N或者包裹物品为0时中断循环
  18.         break
  19.       end
  20.     end
  21.   end
  22. end
复制代码

作者: wingzeroplus    时间: 2013-2-24 23:23
本帖最后由 wingzeroplus 于 2013-2-24 23:33 编辑
弗雷德 发表于 2013-2-24 21:04
更新了一下,这下不会陷入死循环了
其实俺在想,关于获取角色身上持有物品的数组是不是有更简短的 ...


参考弗雷德的内容 最后自己做了个公共事件
$game_variables[66] = 0
for i in 101...$data_items.size
$game_variables[66] += $game_party.item_number(i)
end

如变量66大于5则
变量68 = 0
LOOP
变量67 随机数100-200
if $game_party.item_number($game_variables[67]) > 0
if 变量68==4   (这位置IF必须反着来从4到0……)
失去ID为变量67的道具
将变量67值给其他变量A
给某变量68+1
end
然后if 变量67 ==3
将变量67值给其他变量B
给某变量68+1
…………end
最后if 变量68==5
跳出循环

小于就更简单了

最后根据取得的变量A,B,C……获得ID的NAME,来显示失去的名称
这样就OK了,再次感谢




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1