2009-11-03 7 views
0

J'ai un problème délicat et semble être coincé. J'ai une idée de la façon de procéder mais je ne sais pas comment le faire en pratique. Ce que je veux faire est de convertir une chaîne dans le fichier .txt dans un autre format (en utilisant regex et variables?). Le problème principal est quand j'ai besoin de convertir ces lignes marquées avec // commentaires.PHP regex et comparer les variables dans une chaîne

REMARQUE: "... villainx calls $ x" est calculé différemment dans l'original et dans le format dans lequel il doit être converti. Et c'est le problème que j'ai besoin d'aide sérieuse.

Exemple: Il doit être converti ...

HERO posts small blind $0.50. 
villain4 posts big blind $1.00.  
** Dealing down cards ** 
Dealt to HERO [ 7s 8c 5d 8d ] 
villain1 calls $1.00 
villain2 raises to $3.00 // total sum a player raises to 
villain3 calls $3.00 
HERO calls $3.00 
villain4 calls $3.00 
villain1 calls $3.00  // total sum a player calls whether he has put money in to the pot before (as he has -- $1 call, first to act) 
** Dealing Flop ** [ 9c, Ah, Jh ] 

... à ceci:

HERO posts small blind [$0.50 USD]. 
villain4 posts big blind [$1.00 USD].  
** Dealing down cards ** 
Dealt to HERO [ 7s 8c 5d 8d ] 
villain1 calls [$1.00 USD] 
villain2 raises [$3.00 USD] // total sum a player raises to 
villain3 calls [$3.00 USD] 
HERO calls [$2.50 USD]  // a sum player calls = last raise ($3) - money put in (=$0.50 small blind) 
villain4 calls [$2.00 USD] // $3 - $1 (big blind) 
villain1 calls [$2.00 USD] // $3 - $1 (the call first to act) 
** Dealing Flop ** [ 9c, Ah, Jh ] 

Un autre exemple:

HERO posts small blind $0.50. 
villain4 posts big blind $1.00.  
** Dealing down cards ** 
Dealt to HERO [ 7s 8c 5d 8d ] 
villain1 bets $5.50 
villain2 raises to $20.00 
villain3 raises to $40.00 
villain1 calls $40.00 //THIS NEEDS TO BE "calls $34.50" 
villain2 calls $40.00 //THIS NEEDS TO BE "calls $20.00" 
** Dealing Flop ** [ 9c, Ah, Jh ] 

et voici l'exemple complet à quoi devrait ressembler toute la main. Le fichier txt pourrait contenir des centaines de mains. J'ai réussi à préparer tous les autres problèmes, sauf celui ci-dessus. Je suis perdu. Aidez-moi, s'il vous plaît! : D

***** Hand History for Game 335502358 ***** (Full Tilt) 
$100.00 USD PL Omaha - Thursday, October 15, 01:32:21 ET 2009 
Table Foxtrot (Real Money) 
Seat 3 is the button 
Seat 1: villain1 ($38.50 USD) 
Seat 2: villain2 ($99.65 USD) 
Seat 3: villain3 ($415.55 USD) 
Seat 4: HERO ($99.00 USD) 
Seat 6: villain4 ($171.20 USD) 
HERO posts small blind [$0.50 USD]. 
villain4 posts big blind [$1.00 USD]. 
** Dealing down cards ** 
Dealt to HERO [ 7s 8c 5d 8d ] 
villain1 calls [$1.00 USD] 
villain2 raises [$3.00 USD] 
villain3 calls [$3.00 USD] 
HERO calls [$2.50 USD] 
villain4 calls [$2.00 USD] 
villain1 calls [$2.00 USD] 
** Dealing Flop ** [ 9c, Ah, Jh ] 
HERO checks 
villain4 checks 
villain1 checks 
villain2 bets [$8.00 USD] 
villain3 folds 
HERO folds 
villain4 calls [$8.00 USD] 
villain1 folds 
** Dealing Turn ** [ Th ] 
villain4 checks 
villain2 bets [$13.00 USD] 
villain4 calls [$13.00 USD] 
** Dealing River ** [ 3c ] 
villain4 checks 
villain2 checks 
villain2 shows [Qc, Js 8s Qd ] 
villain4 shows [Kh, Tc 7h Kd ] 
villain4 wins $54.15 USD from main pot 

modifier 1: Ajout d'une note pour clarifier ma vraie question

modifier 2: ajouté un autre exemple

+0

Je pense que vous devez être un peu plus précis sur ce que vous voulez réaliser. Comment sont calculées les nouvelles valeurs? Comment savez-vous, par exemple, que l'appel de villain3 reste à 3,00 $, mais que les appels suivants sont modifiés? – Ben

Répondre

1

Pouvez-vous utiliser un preg_match pour retirer la valeur du dollar et réarranger la chaîne avec un preg_replace?

$regex = '/(\$[0-9.]+)/'; 

$matched = preg_match($regex, $stringToMatch, $matches); 

if($matched > 0) 
{ 
    $output string = preg_replace($regex, '['.$matches[0].' USD]', $stringToMatch); 
} 

La seule chose que ce ne sera pas faire est d'ignorer les lignes au début où vous déclarez chaque « siège » de sorte que vous pourriez avoir besoin de filtrer les premiers [sur strpos simples (stringToMatch $, « siège ») pourrait être assez là, pas merveilleusement élégant cependant].

+0

Vous vouliez probablement échapper à '$': '/ (\ $ [0-9.] +) /' –

+0

doh! merci Bart, je reçois toujours des caractères d'échappement dans le mauvais sens! – MalphasWats

+0

non non non ... :) le signe dollar "USD" et ces trucs n'est pas le problème .. le problème est de savoir comment un appel des joueurs est calculé. "paris Player1 1 $ player2 élève à 3 $ player1 appelle $ 3" ​​ --- doit être converti --- "paris Player1 1 $ player2 élève à 3 $ player1 appelle $ 2" // la dernière relance moins le dernier pari/relance/appelle un joueur1 fait avant la dernière relance = $ 2 – mika

0

OK, je vais faire un autre tour. Cela sera écrit dans une sorte de chose php/psuedocode.

while($line = get the next line) 
{ 
    if($line contains 'seat') 
    { 
     $player = get player from $line 
     $pool = get player pool from $line 

     $bettingMatrix[$player]['pool'] = $pool; 
    } 
    else if($line contains 'blind') 
    { 
     $player = get player from $line 
     $betValue = get blind value from $line 

     $bettingMatrix[$player]['betTotal'] = $betValue 
     $bettingMatrix['pot'] += $betValue //keep a sum of the pot 
    } 
    else if($line contains 'raises') 
    { 
     $player = get player from $line 
     $betValue = get value from $line 
     $betMade = $betValue - $bettingMatrix[$player]['betTotal']; //actual amount raised by 
     $bettingMatrix[$player]['betTotal'] = $betValue //$line contains total bet this hand (shortcut) 
     $bettingMatrix['raiseValue'] = $betMade 
     $bettingMatrix['pot'] += $betMade //keep a sum of the pot 
    } 
    else if($line contains 'calls') 
    { 
     $player = get player from $line 
     //if player has called, can work out bet from raiseValue 
     $betMade = $bettingMatrix['raiseValue'] 
     $bettingMatrix[$player]['betTotal'] += $betMade 
     $bettingMatrix['pot'] += $betMade //keep a sum of the pot 
    } 
    else if(substr($line, 0, 3) == ' Wins ') //probably do something about players named Wins :) 
    { 
     //assume all bets resolved 
     foreach($bettingMatrix[$player]) 
     { 
      update pool. 
      zero betTotal 
     } 
     zero pot, zero raiseValue 
    } 
} 

erm, il est assez rugueux et prêt, et je ne serais probablement pas la classe comme un Parser en tant que tel, mais il ne fonctionne tout simplement sur le travail sur toutes les valeurs dont vous avez besoin, je pense que de toute façon. Les 2 $ betMade variables devraient se retrouver avec les valeurs que vous voulez. Edit: Je viens de remarquer que ça ne marche pas si personne ne lève et que tout le monde appelle ou se plie (et meurt probablement horriblement si tout le monde se plie juste). Il faut un peu plus de travail, mais c'est l'essentiel - appelez ça une demi-réponse. Pardon.

+0

Merci d'avoir pensé à cela. Potsize et les piles des joueurs ne sont pas les choses que j'ai besoin de calculer car elles sont toujours correctes dans l'original et dans celui dont j'ai besoin pour me convertir. Seules les choses à calculer sont ces "appels/paris" contre "blinds" vs "soulève" contre "appels" supplémentaires. Serait-il sage de vérifier d'abord les lignes entre "*** Dealing Down Cards ***" et "*** Dealing Flop ***" et de lancer une sorte de blind/bet/raise/call loop que vous avez déjà posté et puis "Flop-Turn" et enfin "River-xxx Shows". – mika

+0

Si vous n'avez pas besoin de la pile et du pot, vous pouvez ignorer ces lignes en toute sécurité. Les lignes avec ** en eux ne sont pas trop utiles, ils ne changent pas l'état, les lignes importantes sont celles où un joueur parie, etc. parce que ces lignes changent l'état du système. Les bits que vous essayez de calculer devraient être les lignes où la variable $ betMade est définie. Chaque fois que la variable $ betMade est calculée, vous pouvez éditer une ligne reformatée comme vous le souhaitez, sinon vous pouvez simplement passer la ligne directement. Ce n'est pas LA réponse, mais cela vous donne un algorithme approximatif pour travailler :) – MalphasWats