2009-08-08 6 views
0

Voici mon problème. Dans mon jeu j'essaye de mettre en application ce système de nivellement où une fois que vous avez atteint une certaine quantité d'expérience que vous avancez à un niveau supérieur. J'utilise php 5.0 et le dernier MYSQL. Mon problème est que je n'arrive pas à exécuter mes scripts correctement.php problèmes de script de niveau de jeu mysql

Voici quelques statistiques factices suivies par mon code Toute information qui me aider à résoudre mes problèmes seraient grandement appréciés

 $playerNAME = "Bozo"; 
$playerClASS = "Warrior"; 
$playerLEVEL = 13; 
$playerSTR = 5; 
$playerDEF = 2; 
$playerDEX = 3; 
$playerMAG = 2; 
    $playerEXPERIENCE = 99999; 

quand je vais LevelUp 13 et 14 aucun des statistiques sont mises à jour avec une nouvelle valeur et le niveau mise à jour dosnt ... Oui, toutes mes connexions du connect.php au serveur DB fonctionnent correctement et oui je suis en utilisant les noms de table correct dans mon code

function levelUPSTATS() { 
     global $playerNAME; 
     global $playerClASS; 
     global $playerLEVEL; 
     global $playerSTR; 
     global $playerDEF; 
     global $playerDEX; 
     global $playerMAG; 

    if ($playerCLASS === "Warrior") { 
     $playerSTR = $playerSTR + 3; 
     $playerDEF = $playerDEF + 2; 
     $playerDEX = $playerDEX + 3; 
     $playerMAG = $playerMAG + 2; 
     $playerBASE_DAMAGE = ceil($playerSTR*$playerDEX); 
     $playerSPELL_BASE_DAMAGE = ceil($playerMAG * $playerDEX); 
     $playerMAX_HEALTH_POINTS = ceil($playerSTR * $playerDEF * $playerDEX); 
     $playerMAX_MANA_POINTS = ceil($playerMAG * $playerDEF * $playerDEX/$playerSTR); 
     $statusplayerSTR = "update players set strength=strength+'$playerSTR' where username='$playerNAME'"; 
     mysql_query($statusplayerSTR) or die("Could not update player"); 

     $statusplayerDEF = "update players set defence=defence+'$playerDEF' where username='$playerNAME'"; 
     mysql_query($statusplayerDEF) or die("Could not update player"); 

     $statusplayerDEX = "update players set dexterity=dexterity+'$playerDEX' where username='$playerNAME'"; 
     mysql_query($statusplayerDEX) or die("Could not update player"); 

     $statusplayerMAG = "update players set magic=magic+'$playerMAG' where username='$playerNAME'"; 
     mysql_query($statusplayerMAG) or die("Could not update player"); 

     $statusplayerBASE_DAMAGE = "update players set basedamage=basedamage+'$playerBASE_DAMAGE' where username='$playerNAME'"; 
     mysql_query($statusplayerBASE_DAMAGE) or die("Could not update player"); 

     $statusplayerSPELL_BASE_DAMAGE = "update players set spellbasedamage=spellbasedamage+'$playerSPELL_BASE_DAMAGE' where username='$playerNAME'"; 
     mysql_query($statusplayerSPELL_BASE_DAMAGE) or die("Could not update player"); 

     $statusplayerHealthPOINTS = "update players set healthpoints='$playerMAX_HEALTH_POINTS' where username='$playerNAME'"; 
     mysql_query($statusplayerHealthPOINTS) or die("Could not update player"); 

     $statusplayerMaxHealthPOINTS = "update players set maxhealthpoints='$playerMAX_HEALTH_POINTS' where username='$playerNAME'"; 
     mysql_query($statusplayerMaxHealthPOINTS) or die("Could not update player"); 

     $statusplayerManaPOINTS = "update players set manapoints='$playerMAX_MANA_POINTS' where username='$playerNAME'"; 
     mysql_query($statusplayerManaPOINTS) or die("Could not update player"); 

     $statusplayerMaxManaPOINTS = "update players set maxmanapoints='$playerMAX_MANA_POINTS' where username='$playerNAME'"; 
     mysql_query($statusplayerMaxManaPOINTS) or die("Could not update player"); 
    } elseif ($playerCLASS === "Mage") { 
     $playerSTR = $playerSTR + 2; 
     $playerDEF = $playerDEF + 2; 
     $playerDEX = $playerDEX + 3; 
     $playerMAG = $playerMAG + 3; 
     $playerBASE_DAMAGE = ceil($playerSTR * $playerDEF); 
     $playerSPELL_BASE_DAMAGE = ceil($playerMAG * $playerDEX); 
     $playerMAX_HEALTH_POINTS = ceil($playerDEF * $playerDEX * $playerMAG); 
     $playerMAX_MANA_POINTS = ceil($playerMAG * $playerDEF * $playerDEX/$playerSTR);   
    } else { 
    } 
} 

     if ($playerEXPERIENCE < 100) { 
      if (!$playerLEVEL ==1) { 
       $playerLEVEL = 1; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 

      } else { 
       $playerNEXT_LEVEL = 100; 
      } 
     } elseif ($playerEXPERIENCE >= 100 && $playerEXPERIENCE <= 200) { 
      if (!$playerLEVEL ==2) { 
           levelUPSTATS(); 
       $playerLEVEL = 2; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 200; 
      } 
     } elseif ($playerEXPERIENCE >= 200 && $playerEXPERIENCE <= 400) { 
      if (!$playerLEVEL ==3) { 
           levelUPSTATS(); 
       $playerLEVEL = 3; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 400; 
      } 
     } elseif ($playerEXPERIENCE >= 400 && $playerEXPERIENCE <= 800) { 
      if (!$playerLEVEL ==4) { 
           levelUPSTATS(); 
       $playerLEVEL = 4; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 800; 
      } 
     } elseif ($playerEXPERIENCE >= 800 && $playerEXPERIENCE <= 1600) { 
      if (!$playerLEVEL ==5) { 
           levelUPSTATS(); 
       $playerLEVEL = 5; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 1600; 
      } 
     } elseif ($playerEXPERIENCE >= 1600 && $playerEXPERIENCE <= 3200) { 
      if (!$playerLEVEL ==6) { 

           levelUPSTATS(); 
       $playerLEVEL = 6; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 3200; 
      } 
     } elseif ($playerEXPERIENCE >= 3200 && $playerEXPERIENCE <= 6400) { 
      if (!$playerLEVEL ==7) { 
           levelUPSTATS(); 
       $playerLEVEL = 7; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 6400; 
      } 
     } elseif ($playerEXPERIENCE >= 6400 && $playerEXPERIENCE <= 12800) { 
      if (!$playerLEVEL ==8) { 
           levelUPSTATS(); 
       $playerLEVEL = 8; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 12800; 
      } 
     } elseif ($playerEXPERIENCE >= 12800 && $playerEXPERIENCE <= 25000) { 
      if (!$playerLEVEL ==9) { 
           levelUPSTATS(); 
       $playerLEVEL = 9; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 25000; 
      } 
     } elseif ($playerEXPERIENCE >= 25000 && $playerEXPERIENCE <= 35000) { 
      if (!$playerLEVEL ==10) { 
           levelUPSTATS(); 
       $playerLEVEL = 10; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 

      } else { 
       $playerNEXT_LEVEL = 35000; 
      } 
     } elseif ($playerEXPERIENCE >= 35000 && $playerEXPERIENCE <= 50000) { 
      if (!$playerLEVEL ==11) { 
           levelUPSTATS(); 
       $playerLEVEL = 11; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 50000; 
      } 
     } elseif ($playerEXPERIENCE >= 50000 && $playerEXPERIENCE <= 75000) { 
      if (!$playerLEVEL ==12) { 
           levelUPSTATS(); 
       $playerLEVEL = 12; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 75000; 
      } 
     } elseif ($playerEXPERIENCE >= 75000 && $playerEXPERIENCE <= 100000) { 
      if (!$playerLEVEL ==13) { 
           levelUPSTATS(); 
       $playerLEVEL = 13; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 100000; 
      } 
     } elseif ($playerEXPERIENCE >= 100000 && $playerEXPERIENCE <= 135000) { 
      if (!$playerLEVEL == 14) { 
       levelUPSTATS(); 
       $playerLEVEL = 14; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 135000; 
      } 
     } elseif ($playerEXPERIENCE >= 135000 && $playerEXPERIENCE <= 200000) { 
      if (!$playerLEVEL ==15) { 
           levelUPSTATS(); 
       $playerLEVEL = 15; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 200000; 
       } 
     } elseif ($playerEXPERIENCE >= 200000 && $playerEXPERIENCE <= 300000) { 
      if (!$playerLEVEL ==16) { 

           levelUPSTATS(); 
       $playerLEVEL = 16; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 300000; 
       } 
     } elseif ($playerEXPERIENCE >= 300000 && $playerEXPERIENCE <= 420000) { 
      if (!$playerLEVEL ==17) { 
           levelUPSTATS(); 
       $playerLEVEL = 17; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 420000; 
       } 
     } elseif ($playerEXPERIENCE >= 420000 && $playerEXPERIENCE <= 600000) { 
      if (!$playerLEVEL ==18) { 
           levelUPSTATS(); 
       $playerLEVEL = 18; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 600000; 
       } 
     } elseif ($playerEXPERIENCE >= 600000 && $playerEXPERIENCE <= 800000) { 
      if (!$playerLEVEL ==19) { 
           levelUPSTATS(); 
       $playerLEVEL = 19; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 800000; 
       } 
     } elseif ($playerEXPERIENCE >= 800000 && $playerEXPERIENCE <= 1000000) { 
      if (!$playerLEVEL ==20) { 
           levelUPSTATS(); 
       $playerLEVEL = 20; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } else { 
       $playerNEXT_LEVEL = 1000000; 
       } 
     } elseif ($playerEXPERIENCE >= 1000000) { 
      if (!$playerLEVEL ==21) { 
           levelUPSTATS(); 
       $playerLEVEL = 21; 
           $statusplayerLEVELUPDATE = "update players set level='$playerLEVEL' where username='$playerNAME'"; 
     mysql_query($statusplayerLEVELUPDATE) or die("Could not update player"); 
      } 
     } else { 
      print "N/A"; 
     } 

problème est que n'affiche aucun message d'erreur.

Il ne mettra pas à jour les statistiques correctement le niveau ne se met pas à jour.

+3

TL; DR: s'il vous plaît modifier pour spécifier * comment * cela ne fonctionne pas, inclure tous les messages d'erreur produits (à la fois pour l'écran et les journaux Web), et dites-nous ce que vous avez déjà regardé. – derobert

+0

Pouvez-vous également formater votre code un peu mieux, c'est un peu difficile à lire. –

+0

Comment puis-je formater mon code à vos goûts? – Jesse

Répondre

3

Avez-vous testé les requêtes fonctionnent réellement avec les valeurs que vous leur donnez? c'est-à-dire utiliser phpMyAdmin ou similaire et essayer la requête manuellement?

J'ai eu des situations où je pensais que mon PHP était incorrect mais une petite erreur dans mon SQL était le problème.

Vous pouvez également définir le mode d'erreur de PHP sur E_ALL. Vous pouvez le faire dans php.ini ou via le code en ayant

ini_set("display_errors","2"); ERROR_REPORTING(E_ALL); 

au début de votre script. Il devrait [espérons] vous donner une erreur qui identifie votre problème.


EDIT

Je viens de remarquer quelque chose avec vos conditions qui peuvent être le problème ...

Vous avez:

if (!$playerLEVEL ==13) 
{ 
    levelUPSTATS(); 
    $playerLEVEL = 13; 
    //etc 
} 

Je préfère soupçonner que si BLOCK jamais exécuter et il n'y aura pas d'appel à levelUPSTATS().

Vous demandez si $ PAS playerLEVEL est égal à 13 quand vous voulez vraiment si $ playerLEVEL est pas égal à 13 qui rendrait la condition:

if($playerLEVEL != 13) 

Notez où le ! (PAS) va. En aparté, vous avez une situation avec vos inégalités où certains cas de bords signifieraient que le joueur a deux niveaux. Par exemple, pour le niveau 2, vous avez besoin d'entre 100 et 200 EXP inclus. Par exemple, pour le niveau 2, vous avez besoin de 100 à 200 EXP inclus. Mais le niveau 3 nécessite 200 et 400 EXP inclus. Si votre lecteur a 200EXP il est techniquement niveau 2 et 3. Lorsque le code est exécuté, il correspondra 200 dans le niveau 2 section de code et non la section Niveau 3 ...

Votre code:

if($playerEXPERIENCE >= 100 && $playerEXPERIENCE <= 200) 
//code to make them 2 
if($playerEXPERIENCE >= 200 $$ $playerEXPERIENCE <= 400) 
//code to make them 3 

Cela me semble faux - même si c'est peut-être ce que vous vouliez, je ne sais pas. Si elle n'a pas été prévu, vous devriez changer pour:

if($playerEXPERIENCE >= 100 && $playerEXPERIENCE < 200) 

Notez l'utilisation de < [MOINS] au lieu de < = [MOINS ou égal à].

J'espère que cela résout votre problème :)

+0

Merci pour la réponse, j'ai inf act testé toutes mes déclarations sql et tout semble fonctionner parfaitement. Je pense honnêtement que c'est une erreur de php que je suis en train de négliger mais je ne vois pas alors je cherchais des yeux favorables pour aider – Jesse

+0

J'ai commencé à regarder mon code juste avant de poster et je trouve le! =, Lol quoi stupide mais simple erreur. et je vous remercie pour votre contribution sur le contrôle de niveau, je vais certainement faire les ajustements nécessaires. Et enfin merci pour le code d'affichage d'erreur php qui m'a permis de trouver certaines de mes variables qui n'étaient pas définies correctement. – Jesse

+0

Il est très facile de faire de petites erreurs qui passent inaperçues! Fait moi-même quelques-uns: P Lorsque vous avez une grande quantité de code qui fait quelque chose de similaire, vous devriez écrire juste une petite partie de celui-ci et voir si cela fonctionne. Une fois que vous savez que cela fonctionne, ajoutez le reste. Par exemple, vous devriez probablement commencer avec les niveaux 1, 2 et 3. Une fois que vous savez que le code fonctionne, vous pouvez l'étendre pour couvrir plus de niveaux. C'est plus facile à tester et il y a moins de code à changer si/quand il y a une erreur;) – Etzeitet

0

Bozo et Guerrier ne sont pas entre guillemets dans le premier extrait de code,

0

regardant la coloration syntaxique de votre code, il est clair somethings mal autour du code de niveau 14. On dirait que vous avez ajouté 2 lignes supplémentaires pour aucune raison:

playerLEVEL' where username='$playerNAME'"; 
mysql_query($statusplayerSTR) or die("Could not update player"); 

Vous devriez vraiment essayer de vous assurer que le code n'est pas copier-coller autant, et aussi utiliser un éditeur avec coloration syntaxique si vous n'êtes pas déjà .

+0

je parviens à supprimer cela dans mon script personnel, mais cela n'affecte pas le code effectue. et j'utilise l'éditeur Crimson. – Jesse

+0

Méfiez-vous de l'injection SQL –

+0

À propos de l'injection SQL, il n'y a aucun moyen pour un joueur d'entrer des données, tout est fait avec php et les informations sont saisies dans le DB pour que le joueur ne connaisse pas les variables. une connexion même si nous connaissons tous leur: D – Jesse

0

Je suis désolé, mais votre code est complètement illisible et qui doit être la raison pour laquelle vous ne trouvez pas le problème.

Essayez la mise en œuvre de ces changements:

  • Vous n'avez pas besoin d'exécuter une requête MySQL différent pour chaque action de jeu. Votre toute la section 'guerrier' devrait ressembler à:
 
    $statusplayerSTR = "update players set strength=strength+'$playerSTR', 
      defence=defence+'$playerDEF', 
      dexterity=dexterity+'$playerDEX', 
      magic=magic+'$playerMAG', 
      basedamage=basedamage+'$playerBASE_DAMAGE', 
      spellbasedamage=spellbasedamage+'$playerSPELL_BASE_DAMAGE', 
      healthpoints='$playerMAX_HEALTH_POINTS', 
      ...... 
      WHERE username='$playerNAME'" 
    mysql_query($statusplayerSTR) or die("Could not update player"); 
  • Utilisez une instruction switch au lieu de tous ces IF ELSE:
 

    switch ($playerCLASS) { 
     case "Warrior": 
      .... 
      break; 
     case "Mage": 
      .... 
      break; 
     case default: 
      .... 
    } 

le playerEXPERIENCE $ SI bloc AUTRE

switch (true) { 
    case $playerEXPERIENCE < 100: 
     ... 
     break; 
    case $playerEXPERIENCE >= 100 && $playerEXPERIENCE <= 200: 
     .... 
} 

Vous pouvez ensuite imprimer le que et vérifiez-les correctement en utilisant un client MySQL.

+0

Que pour votre contribution, Ce que vous avez écrit je ne savais pas comment faire. Je ne suis pas familier avec les instructions de commutation et je ne savais pas que vous pouviez essayer d'envoyer plus d'une table de données par transaction. Dans mon éditeur de texte, mon code est en fait très lisible et je peux comprendre comment ce n'est pas grâce à votre commentaire/réponse. J'essaierai vos suggestions et qui sait, je pourrais obtenir un peu plus de code grâce à vos conseils. donc encore merci ... – Jesse

0

vous pouvez essayer ceci. $ x = utilisateur actuellement exp $ userlevel = "SELECT * FROM niveau où exp = (SELECT MAX (exp) de niveau où exp < = $ x)"; $ userlevel1 = requête mysql ($ userlevel); $ userlevelmax = mysql_fetch_array ($ userlevel1);

puis faites une table pour le niveau où vous stockez votre expérience nécessaire pour chaque niveau. Donc vous n'avez pas besoin de répéter autant de boucles sinon else et utilisez ceci à la place. remplacez vos numéros par les valeurs de la table que vous avez créée.

si (playerstats3 $ [ 'C_EXP']> = $ userlevelmax2 [ 'exp']) { if ($ Statistiques du joueur [ 'niveau']!= $ userlevelmax ['level']) { $ newlevel = $ userlevelmax ['niveau'];

     $updateuserlevel="update youruserinfotable set level=$newlevel, allurnewstatsforthatlevel where UID='$playerstats3[UID]'"; 
         mysql_query($updateuserlevel) or die("It just died"); 


     } 
Questions connexes