2017-08-10 121 views
1

我正在试图随机遇到一个基于%的怪物。MYSQL/PHP - 随机行%

我在MySQL数据库有一个名为 “monster_chancespawn” 列:

  • 怪兽1有50%
  • 怪物2得到30%
  • 怪物3得到20%

我想要做的是根据这些%在我的“怪物”数据库中随机执行MySQL SELECT

我已经得到了这个

$monsterspawn=$db->prepare('SELECT * FROM monster'); 
    $monsterspawn->execute(); 
    $monsterspawn->CloseCursor(); 


    foreach ($monsterspawn as $infospawn) 
     { 
     echo . $infospawn["monster_chanceloot"] . ; 
     } 

据此,通常回声 “50 30 20”,但没有真正有用的。 我想要做的是:

  • 获得每个怪物的战利品的机会。
  • 也许会做一些类似于“如果rand在0到50之间,产生怪物1.如果它在50到80之间,产生怪物3.如果它在80到100之间,产生怪物3.但是我希望这是灵活,并改变当我改变了monster_chanceloot

我可以做这样的事情我想

$randomspawn = rand(0, 100); 
if ($randomspawn >= 0 && $randomspawn <= $infospawn["monster_chanceloot"]) 
{ $monstername = "Monster1" } 

    elseif ($randomspawn >= $infospawn["monster_chanceloot"] && $randomspawn <= $infospawn["monster_chanceloot"](Monster 2's one)) 
    { $monstername = "Monster2" } 

而且同样的事情怪物3的主要问题是其不会让我改变可用的怪物的数量,另一个问题是我不知道如何在每个怪物之外获得每个怪物的怪物_魔兽世界e foreach。我不想做30个MYSQL连接,所以不要每次都使用它。

谢谢!

编辑:这里是“德国Drulyk”给出一个可能性:

Monster1Monster2Monster3。 我复制Monster1 2次在我的数据库和Monster2 1时间。

我现在3 有Monster1,2 Monster2和1 Monster3。 所以:有50%的几率选择一个怪物1,怪物2的怪物为33,3,怪物3的怪物为16,6。

为了获得更加准确的结果,可以将它们复制到100有1个怪物= 1%。为了得到一个怪物,只需做:

$query=$db->prepare('SELECT * FROM MONSTERDDB ORDER BY RAND() LIMIT 1'); 
    $query->execute(); 
+0

你会创造超过100个怪物吗?如果某些怪物在其类型/等级内具有相同的确切机会,该怎么办?想象一下这个场景; 50%的时间应该是怪物1或2,30%的时间应该是怪物3,而20%的时间应该是怪物4或5 – MonkeyZeus

+0

我看到了,我会写出答案 – MonkeyZeus

+0

(删除了我的最后一条评论,对不起,我不太了解)。首先,它会有5到20个怪物,而不是一个大数字。对于你的例子,通常没有人可以在我的数据库中拥有相同的百分比,但是如果是这样的话,那么我只是然后我不知道,因为我将它限制为100%,这意味着如果我放置另一个怪物,我会减少其他怪物的百分比相等。 (50至40%,30至24 ..) –

回答

0

IF你永远不会在一个区域超过100个怪物,那么你需要用3列的表格; zone_id,chance,monster_id

每个区域插入100条记录并将机会设置为1到100。

每条记录​​,分别添加一个monster_id,以表示它的通用性;所有100个记录每个区都要有monster_id

例如,ZONE1需要50条记录与monster1,30个记录monster2和20个记录monster3

在PHP中,你可以写你的查询,像这样

$sql = "select 
      monster_id 
     from 
      table_name 
     where 
      zone_id = $zoneId and 
      chance = ".rand(1, 100); 

此外,我还没有试过,但我想本土MySQL can achieve the same effect

$sql = "select 
      monster_id 
     from 
      table_name 
     where 
      zone_id = $zoneId and 
      chance = FLOOR(1 + RAND() * 100)"; 
+0

非常感谢,同一个怪物的副本是一个好主意!它需要更多的地方,但目前效果很好,因为我没有很多怪物,我猜这没关系。感谢您的想法! –