IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Jeux par navigateur tour par tour


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    IBM Application Development Programmer Specialist
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : IBM Application Development Programmer Specialist

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Jeux par navigateur tour par tour
    Bonjour à Tous
    Je reprend actuellement le développement d'un de mes ancien site de jeux par navigateur web,
    et je suis actuellement bloqué sur l'implémentation du système de combat.
    J'ai donc commencer une partie du script qui gére aléatoirement la rencontre d'un "Monstre" inscrit dans la DB suivit de 2 options : Combattre ou fuir.
    Une fois l'options combattre chosi, le combat se lance, je récupere l'"atk" de l'attaquant et la "def" du defenseur selon le tours et applique les dommages, et ce jusqu'à ce que l'un des deux aient des points de vie <= 0. seulement avec le temps j'ai changé d'avis et je souhaite maintenant du tours par tours. je m'explique :
    Je souhaite choisir l'option combattre ou fuir. une fois l'options combattre chosie alors :
    1er tours Le joueur attaque le monstre,le monstre attaque le joueur.
    si 1 des deux pdv <= 0 alors END,
    Sinon 2eme tours le joueur choisi son attaque, le monstre attaque.
    etc..
    voici le code actuelle :
    (petite précision je travaille avec l'outil de template Smarty.)

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    {if $combat eq ''}
    	<p>You've encountered a {$monster}!</p>
    	<form action='forest.php' method='post'>
    		<input type='submit' name='action' value='Attack' /> or 
    		<input type='submit' name='action' value='Run Away' />
    		<input type='hidden' name='monster' value='{$monster}' />
    	</form>
    {else}
    	<ul>
    	{foreach from=$combat key=id item=i}
    		<li><strong>{$i.attacker}</strong> attacks {$i.defender} for {$i.damage} damage!</li>
    	{/foreach}
    	</ul>
    	{if $won eq 1}
    		<p>You killed <strong>{$smarty.post.monster}</strong>! You gained <strong>{$earngold}</strong> gold.</p>
    		<p><a href='forest.php'>Explore Again</a></p>
    	{/if}
    	{if $lost eq 1}
    		<p>You were killed by <strong>{$smarty.post.monster}</strong>.</p>
    	{/if}		
    		<p><a href='index.php'>Back to main</a></p>
    {/if}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    if($_POST) {
    	if($_POST['action'] == 'Attack') {
     
    		$query = sprintf("SELECT id FROM users WHERE UPPER(username) = UPPER('%s')",
    					mysql_real_escape_string($_SESSION['username']));
    		$result = mysql_query($query);
    		list($userID) = mysql_fetch_row($result);
    		$player = array (
    			name		=>	$_SESSION['username'],
    			attack 		=>	getStat('atk',$userID),
    			defence		=>	getStat('def',$userID),
    			curhp		=>	getStat('curhp',$userID)
    		);
    		$query = sprintf("SELECT id FROM monsters WHERE name = '%s'",
    					mysql_real_escape_string($_POST['monster']));
    		$result = mysql_query($query);
    		list($monsterID) = mysql_fetch_row($result);
    		$monster = array (
    			name		=>	$_POST['monster'],
    			attack		=>	getMonsterStat('atk',$monsterID),
    			defence		=>	getMonsterStat('def',$monsterID),
    			curhp		=>	getMonsterStat('maxhp',$monsterID)
    		);
    		$combat = array();
    		$turns = 0;		
    		while($player['curhp'] > 0 && $monster['curhp'] > 0) {
    			if($turns % 2 != 0) {
    				$attacker = &$monster;
    				$defender = &$player;	
    			} else {
    				$attacker = &$player;
    				$defender = &$monster;
    			}
    			$damage = 0;
    			if($attacker['attack'] > $defender['defence']) {
    				$damage = $attacker['attack'] - $defender['defence'];	
    			}
    			$defender['curhp'] -= $damage;
    			$combat[$turns] = array(
    				attacker	=>	$attacker['name'],
    				defender	=>	$defender['name'],
    				damage		=>	$damage
    			);
    			$turns++;
    		}
    		setStat('curhp',$userID,$player['curhp']);
    		if($player['curhp'] > 0) {
    			// player won
    			setStat('gc',$userID,getStat('gc',$userID)+getMonsterStat('gc',$monsterID));	
    			$smarty->assign('won',1);
    			$smarty->assign('earngold',getMonsterStat('gc',$monsterID));
    			$smarty->assign('gold',getStat('gc',$userID));
    		} else {
    			// monster won
    			$smarty->assign('lost',1);	
    		}
    		$smarty->assign('combat',$combat);
    	} else {
    		// Running away!
    		header('Location: index.php');	
    	}
    } else {
    	$query = sprintf("SELECT name FROM monsters ORDER BY RAND() LIMIT 1");
    	$result = mysql_query($query);
    	list($monster) = mysql_fetch_row($result);
    	$smarty->assign('monster',$monster);
    }

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Quel est ton problème exactement ? Quelque chose ne fonctionne pas ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    IBM Application Development Programmer Specialist
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : IBM Application Development Programmer Specialist

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Plus clairement,
    J'ai réussi à faire tourner le systeme de combat (avec le code du premier post)
    cependant la page s'affiche, l'utilisateur choisi 'attaque' ou 'fuir' une fois fait, le combat se calcule en une fois et affiche la fin du combat exemple concret :
    Toi (100 points de vie) - Monstre (10pdv)
    Attaque ? fuir ? (action de l'utilisateur)
    et puis cette page s'affiche ( le resultat du combat )
    Toi attaque monstre pour 5 degats,
    Monstre attaque toi pour 2 degats,
    Toi attaque Monstre pour 5 degats,
    Monstre est mort, tu a gagner.

    or je voudrais qu'à chaque fin de 'round' l'utilisateur re-choisi d'attaquer ou fuir :/
    un peut comme ça :

    Toi (100 points de vie) - Monstre (10pdv)
    Attaque ? fuir ? (action de l'utilisateur)
    Toi attaque monstre pour 5 degats,
    Monstre attaque toi pour 2 degats,

    Attaque ? fuir ? (action de l'utilisateur)
    Toi attaque Monstre pour 2 degats,
    Monstre attaque toi pour 1 degat,

    Attaque ? fuir ? (action de l'utilisateur)
    Toi attaque Monstre pour 3 degats,
    Monstre est mort, tu a gagner.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 72
    Points : 68
    Points
    68
    Par défaut
    Je n'ai fais que survolé ton code mais il me semble qu'il te faudrait tout simplement shooter ton while qui les fait se réattaquer jusqu'à ce que l'un des deux meurt.

    Par contre, quand tu questionnes un forum sur autant de code, je te conseil de le commenter avant car tu vas en décourager plus d'un (même si le nom de tes variables est plutôt intuitif)..

    Jurta

  5. #5
    Membre à l'essai
    Homme Profil pro
    IBM Application Development Programmer Specialist
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : IBM Application Development Programmer Specialist

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    D'accord merci,
    Je vais commenté tout ça et continuer de bosser dessus.
    Pour le while j'avais déja essayer de le retirer mais je n'arrivé plus ensuite à afficher le formulaire de choix (Attaque / Fuir)
    Puisque l'idée était justement "Tant que l'un des deux n'est pas mort, alors on affiche le formulaire et affiche les tours" :/
    En tout cas merci de vos conseils.
    Bonne journée.

    EDIT: Après réflexion je penser faire une table 'fight' dans ma BDD, qui recenserais les combats en cours (avec bien sur une 'purge' des combats terminer chaques jours)
    Et alors il ne me resterais qu'a faire une classe combat avec deux fonctions : get et set (mettre a jours quand on attaque et recuperer lorsqu'on affiche les resultats)
    Cependant je pense que c'est pas "top" pour ma BDD et la perfomance, je veut dire par la, qu'a chaque actions d'un joueur X il y auras une connection a la BDD avec soit un SELECT soit un ALTER,
    Donc si 10 joueurs lance un combat ça fait 20 requetes au minimum .. ce qui risque de plomber le systemes non ?

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 72
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par didawin Voir le message
    Pour le while j'avais déja essayer de le retirer mais je n'arrivé plus ensuite à afficher le formulaire de choix (Attaque / Fuir)
    Pour tes éléments qui ne s'affichent plus, commence par virer toutes tes conditions de smarty que t'as autour pour voir si ça vient de là. M'est avis que ce sont ces {if} qui te les cachent.. (ne pourrait pas être grand chose d'autre à moins que t'aies un autre code type javascript à côté qui les cible)

    Citation Envoyé par didawin Voir le message
    EDIT: Après réflexion je penser faire une table 'fight' dans ma BDD, qui recenserais les combats en cours (avec bien sur une 'purge' des combats terminer chaques jours)
    Et alors il ne me resterais qu'a faire une classe combat avec deux fonctions : get et set (mettre a jours quand on attaque et recuperer lorsqu'on affiche les resultats)
    Cependant je pense que c'est pas "top" pour ma BDD et la perfomance, je veut dire par la, qu'a chaque actions d'un joueur X il y auras une connection a la BDD avec soit un SELECT soit un ALTER,
    Donc si 10 joueurs lance un combat ça fait 20 requetes au minimum .. ce qui risque de plomber le systemes non ?
    Beuh non 20 requête simultanées c'est rien (on parle en millions pour faire crasher un serveur^^). Pour la table combat, ça me semble pas mal si tu veux corser un peu les combats par la suite (plusieurs ennemis par combat). Sinon tu mets des champs monster_name , monster_hp, monster_def et monster_attk pour l'ennemi dans la table user ou encore l'option de créer une variable de session. Mais en tout cas ton système actuel ne peut pas marcher étant donné que ton code sera rechargé à chaque étape du combat et que ton tableau $monster sera donc réinitialisé avec les vies max.

    PS: Tu peux toujours poster le MCD ou MLD de ta base histoire qu'on te l'analyse.. ça fait un moment que je n'y ai pas mis les pattes mais peut être que j'aurais un ou deux conseils à te fournir

    Jurta

  7. #7
    Membre à l'essai
    Homme Profil pro
    IBM Application Development Programmer Specialist
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : IBM Application Development Programmer Specialist

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Encore merci de ton aide, je vais continuer de bosser la dessus et vous tiendrez informé, voici un esquisse rapide du MCD (désolé c'est mon premier donc il n'est surement pas parfait ^^ )
    Nom : MCDbeta1.png
Affichages : 594
Taille : 63,0 Ko
    Par contre, j'ai un autre souci avec le systeme de "Point d'actions", je m'explique chaque joueurs aurais par exemple 10 Points d'actions. Chaque actions coûte 1 PA, et les PA s'incrémentent chaques heures. Jusque la pas de souci, pour faire cela, une simple query :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE DB.`entity_stats` SET `value` = `value`+1 WHERE `entity_stats`.`entity_type` = 'User' And `entity_stats`.`stat_id` = '16' And `value` < 10
    Ce qui ajoute 1 a tous les utilisateurs sur le stat_id=16 (Points d'actions) si bien sur la stats est <10.
    Le problème est que je suis chez un hébergeur un peut strict, je n'ai pas accès a crontab, j'ai donc utilisé webcron jusqu'a maintenant mais me rend compte d'une faille de sécurité : n'importe qui peut trouver ce script ( exemple : increment.php ) et en accedant à cette url ... tada le petit mâlin as incrementer de 1 les PA de tous le monde

  8. #8
    Membre à l'essai
    Homme Profil pro
    IBM Application Development Programmer Specialist
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : IBM Application Development Programmer Specialist

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Update :
    Pour le système de combat, j'ai résolu mon problème grâce au variables de session,
    Je ne met pas le code car il est assez lourd mais si quelqu'un le veut ou désire de l'aide sur ce sujet vous pouvez me MP.
    Si par la même occasion quelqu'un souhaite voir mon code afin de me donner quelques conseil : je suis preneur ! (On peut toujours améliorer son code avec une vision exterieur)
    Il me reste un souci sur les Points d'Actions mais étant donnée que le titre n'est pas conforme à ce problème je clos ce topic en résolu, merci à tous de votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Poser sa tour par terre
    Par Lorenzox dans le forum Ordinateurs
    Réponses: 9
    Dernier message: 13/04/2007, 15h35
  2. AGame : Jeux par Navigateur
    Par wikipierre dans le forum Projets
    Réponses: 9
    Dernier message: 10/03/2007, 14h30
  3. One Piece: jeux par navigateur
    Par D.Luffy dans le forum Projets
    Réponses: 3
    Dernier message: 21/10/2006, 13h50
  4. [recherche] combat au tour par tour
    Par Satch dans le forum PC
    Réponses: 4
    Dernier message: 24/08/2006, 10h32
  5. IA d'un wargame tour par tour
    Par Nyx dans le forum Intelligence artificielle
    Réponses: 5
    Dernier message: 20/02/2005, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo