2017-02-14 74 views
0

我想要做一些導入使用不同骰子滾動文本的數據。例如,你會有2-4,2-12,5-8,2-5。我想寫一個翻譯器,將它們轉換成適當的骰子。到目前爲止,我所擁有的將會翻譯它,但最終我會得到一些奇怪的結果。例如在5-8上它會出現5d1 + 3。有了2-8等其他的東西,它會給我一個合理的2d4。我試圖找出如何使它總是使用「真正的」骰子。Perl:骰子滾動「修復」來翻譯2-8,5-8,到2d4,1d4 + 3

目前我正在使用這個Perl腳本。您只需將它想要修復的骰子字符串傳遞給它,並返回它認爲正確的卷。我的問題是我想不出如何將骰子「雙方」限制在這些2,3,4,6,8,12,20兩側。

# turn 2-7 into 1d6+1 or 2-8 into 2d4 
sub fix_DiceRolls { 
my($diceRoll) = @_; 
use POSIX; 

if ($diceRoll =~ /^(\d+)(\-)(\d+)\b/i) { 
    # 2-5 
    #Group 1.  0-1  `2` 
    #Group 2.  1-2  `-` 
    #Group 3.  2-3  `5` 

    my($count) = $1; 
    my($size) = $3; 

    if ($count == 1) { 
    $diceRoll = "$1d$3"; 
    } else { 
    my ($newSize) = $size/$count; 
    my ($remainder) = $size % $count; 
    my ($round_remainder) = ceil($remainder); 
    my ($round_newSize) = floor($newSize); 
    if ($remainder == 0) { 
    $diceRoll = $count."d".$newSize; 
    } else { 
    $diceRoll = $count."d".$round_newSize."+".$round_remainder; 
    } 

    } 

} 

return $diceRoll; 
} 
+0

您確定此轉換更正確嗎?在2-8範圍內滾動2d4會得到不均勻的分佈 - 2或8的滾動比5或6的滾動要少。 – duskwuff

+0

我只能說在原文中當他們使用「2-8」時,他們的意思是擲2個有4個邊的骰子。即2d4。當我在腳本中推2-8時,結果會返回2d4。 – ucemike

+0

如果原稿中的「2-8」表示2d4,「5-8」是什麼意思?五個骰子?雙方? – Marty

回答

1

以下內容可能對您有所幫助。它不知道怎麼做1d6/2,但它正確翻譯4-193d6+1 | 5d4-1

#!/usr/bin/perl 
use warnings; 
use strict; 
use feature qw{ say }; 

my @valid_dice = (4, 6, 8, 10, 12, 20); 

sub fix_dice_roll { 
    my ($dice_roll) = @_; 

    my ($from, $to) = split /-/, $dice_roll; 
    my $range = $to - $from + 1; 

    my @translations; 
    for my $dice (@valid_dice) { 
     if (0 == ($range - 1) % ($dice - 1)) { 
      my $times = ($range - 1)/($dice - 1); 
      my $plus = sprintf '%+d', $to - $times * $dice; 
      $plus = q() if '+0' eq $plus; 
      push @translations, [ $dice, $times, $plus ]; 
     } 
    } 

    @translations = sort { $a->[1] <=> $b->[1] } @translations; 
    return map "$_->[1]d$_->[0]$_->[2]", @translations; 
} 

say join ' | ', fix_dice_roll($_) while <>; 
+0

我在允許的骰子上添加了2個和3個,投入了一些檢查來挑選某些骰子(> = 4尺寸,沒有修飾符/等等)。 感謝您的幫助! – ucemike

+0

如果您有其他標準,您可以刪除該排序。我剛剛按「時間」排序,所以骰子數量最少的解決方案總是第一。 – choroba