JeuWeb (JeuPHP) - Crée ton jeu par navigateur

Version complète : Cherche comment développer jeu de cartes
Vous consultez actuellement la version basse qualité d'un document. Voir la version complète avec le bon formatage.
Salut à tous !

Voilà je voulais savoir si certains avaient déjà développé un jeu de rôle en carte (style Munchkin ou autres pour ceux qui connaissent). Je serais super motivé pour faire mais le truc c'est que c'est mon premier jeu en php. Donc niveau idée pour comment procéder, comment stocker les cartes, les joueurs enfin un peu tout me vient pas encore même si je sens que ma base mysql me servira bien lol.

Donc voilà si certains d'entre vous ont des idées voir de l'expérience et peuvent me conseiller, j'adorerai les écouter et leur répondre.

Merci d'avance !
Moi je pense que le secret pour débuter c'est deux choses (à condition d'avoir les bases styles du siteduzéro) :
- Ne pas se lancer direct dans le jeu sans avoir essayé de faire des scripts divers et varié pour l'entraînement (news, système de membres etc...) C'est dur de faire des trucs pour rien, mais en réalité, y'a pas mieux pour acquérir le logique d'un langage...
- Avant de lancer le logiciel de progra, prendre papier et crayon et mettre à plat toutes ses idées. Puis sélectionner celle qui sont compatibles entre elles (rien ne sert d'essayer de tout mettre...). Si l'étape 1 a bien été faite, à partir de là les mécanisme du jeux devrai apparaître tout seul... La plupart du temps, on définit entre autres les tables SQL, en partant souvent d'une banal tables de système de membre : d'où l'intéret d'avoir essayer d'en faire un...

Et surtout, se préparer à être patient 10
Après, d'autres questions plus précises te viendront, et ce sera plus facile de te répondre, parce que là, c'est tellement vaste !
Bon courage 16

Mysterarts
C'est un bon exercice de s'amuser à coder un système de jeu de société. Je pense que personnellement, je commencerais par bosser sur un éditeur de cartes de jeu relativement générique (exemple, sur Munchkin, pouvoir sélectionner le type de la carte, le bonus, etc.) permettant d'enregistrer les cartes dans une ou plusieurs tables de la BDD.

Ensuite, je pense que je travaillerais sur un système très orienté objet (vu que les éléments peuvent être manipulés physiquement) avec des classes de type carte, main, etc.

Essaie de bosser sur un jeu aux règles très simples avant (ex : la bataille) pour mettre au point un modèle qui fonctionne. Par contre, le plus adapté à ce genre de truc est une interface flash et un serveur socket parce que tu risques de galérer pour la synchronisation.

Dans tous les cas, tu es obligé d'utiliser une mémoire tampon (un fichier) pour la main en cours. Par exemple, si la méthode jouer() de l'objet joueur envoie la carte jouée au serveur, il faut que la référence de la carte soit enregistrée dans un fichier. Quand le deuxième joueur joue également sa carte, le serveur peut enfin résoudre le
pli en allant chercher la carte du premier joueur dans le fichier. Les sockets sont vraiment adaptées à cette configuration mais tu peux simuler une synchronisation en effectuant des refresh réguliers avec Ajax.
@+ 16
Merci déjà pour vos conseils. Il est clair que poser sur papier le projet et utiliser la POO s'impose. J'avoue que j'hésite encore entre faire ce jeu en php ou en C#, voir les deux hé hé...

Je travaillerais sur ce projet avec un collègue probablement donc ce sera pas mal de comparer nos idées. En tout cas je suis pas mal motivé.

Niveau synchronisation, c'est vrai que ça pourrait poser problème. J'ai pensé à l'AJAX mais n'y ayant pas encore touché je vais tester ça. D'ailleurs si jamais quelqu'un a un tuto ou un pas-à-pas, je suis pleinement preneur !

En tout cas merci déjà
Ajax s'impose, je pense. Regarde du côté du framework jQuery qui permet d'utiliser Ajax de façon simplifiée.
Des petites pistes pour les insomniaques pour la bataille et jQuery

=> http://www.anthor.net/test/batailleJS/index.htm

Code PHP :
(function($) {
    $.
PlayCards = {};
    
    $.
PlayCards.defaults = {
        
Cards: [
            { 
"card":"2 de Coeur""value":},
            { 
"card":"3 de Coeur""value":},
            { 
"card":"4 de Coeur""value":},
            { 
"card":"5 de Coeur""value":},
            { 
"card":"6 de Coeur""value":},
            { 
"card":"7 de Coeur""value":},
            { 
"card":"8 de Coeur""value":},
            { 
"card":"9 de Coeur""value":},
            { 
"card":"10 de Coeur""value":10 },
            { 
"card":"Valet de Coeur""value":11 },
            { 
"card":"Dame de Coeur""value":12 },
            { 
"card":"Roi de Coeur""value":13 },
            { 
"card":"As de Coeur""value":15 },
            { 
"card":"2 de Carreau""value":},
            { 
"card":"3 de Carreau""value":},
            { 
"card":"4 de Carreau""value":},
            { 
"card":"5 de Carreau""value":},
            { 
"card":"6 de Carreau""value":},
            { 
"card":"7 de Carreau""value":},
            { 
"card":"8 de Carreau""value":},
            { 
"card":"9 de Carreau""value":},
            { 
"card":"10 de Carreau""value":10 },
            { 
"card":"Valet de Carreau""value":11 },
            { 
"card":"Dame de Carreau""value":12 },
            { 
"card":"Roi de Carreau""value":13 },
            { 
"card":"As de Carreau""value":15 },
            { 
"card":"2 de Trèfle""value":},
            { 
"card":"3 de Trèfle""value":},
            { 
"card":"4 de Trèfle""value":},
            { 
"card":"5 de Trèfle""value":},
            { 
"card":"6 de Trèfle""value":},
            { 
"card":"7 de Trèfle""value":},
            { 
"card":"8 de Trèfle""value":},
            { 
"card":"9 de Trèfle""value":},
            { 
"card":"10 de Trèfle""value":10 },
            { 
"card":"Valet de Trèfle""value":11 },
            { 
"card":"Dame de Trèfle""value":12 },
            { 
"card":"Roi de Trèfle""value":13 },
            { 
"card":"As de Trèfle""value":15 },
            { 
"card":"2 de Pique""value":},
            { 
"card":"3 de Pique""value":},
            { 
"card":"4 de Pique""value":},
            { 
"card":"5 de Pique""value":},
            { 
"card":"6 de Pique""value":},
            { 
"card":"7 de Pique""value":},
            { 
"card":"8 de Pique""value":},
            { 
"card":"9 de Pique""value":},
            { 
"card":"10 de Pique""value":10 },
            { 
"card":"Valet de Pique""value":11 },
            { 
"card":"Dame de Pique""value":12 },
            { 
"card":"Roi de Pique""value":13 },
            { 
"card":"As de Pique""value":15 },
            { 
"card":"Joker""value":20 },
            { 
"card":"Joker""value":20 }
        ]
    };
    
    $.
fn.extend({
        
PlayCards: function($settings) {
            
// Ajout défauts et options passées    
            
$settings = $.extend({}, $.PlayCards.defaults$settings);

            return 
this.each(function() {
                var 
$this = $(this);
                
                
createPlayField($settings$this);
                
                
// Number of card submitted
                
$('.debug ul'$this).prepend('<li>Nombre de Cartes : ' $settings.Cards.length '</li>');
    
                
// Bind a trigger on begin game
                
$('.ControlDeck .newgame'$this).click(function(){
                    
BeginGame($settings$this);
                });
            });
        }
    });
    
    function 
createPlayField($settings$this) {
        if( 
$this.children().length )
            return;
            
        
// Create Command Menu
        
$this.append('<div class="ControlDeck">\
                <input type="button" class="newgame" value="Commencer une partie" />\
                <input type="button" class="resolveturn" value="Jouer le tour" disabled="true" />\
                </div>
');

        
// create the players Decks
        
$this.append('<div class="P1Deck"><ul></ul></div><div class="P2Deck"><ul></ul></div>');

        
// Create Debug     
        
$this.append('<div class="debug"><ul><li>PlayField initialisé</li></ul></div>');
    }
    
    function 
BeginGame($settings$this) {
        
$settings = $.extend({ "Turn"0"Stack": [], "P1Cards": [], "P2Cards": [] }, $settings);
        
        
// On vide le terrain de jeu.
        
$('.P1Deck ul'$this).html('<li><h5>Bienvenue Joueur 1</h5></li>');
        $(
'.P2Deck ul'$this).html('<li><h5>Bienvenue Joueur 2</h5></li>');
        
        
// On mélange les cartes
        
RandomizeCards($settings.Cards);
        
        
// On distribue les cartes entre les 2 joueurs
        
for(var i=0$settings.Cards.lengthi++)
        {
            if (
i%== 1)
                
$settings.P1Cards.push($settings.Cards[i]);
            else
                
$settings.P2Cards.push($settings.Cards[i]);                
        }
        
        
// On recherche si le bouton de résolution des tours est présent.
        // Supression et recréation plus rapide que bind/unbind
        
if($('.ControlDeck .resolveturn'$this).length 0)
            $(
'.ControlDeck .resolveturn'$this).remove();
        
        
// On récréé un nouveau bouton avec les bons $settings en click
        
$('.ControlDeck'$this).append('<input type="button" class="resolveturn" value="Jouer le tour" />')
            .
find('.resolveturn')
            .
click(function(){
                
ResolveTurn($settings$this);
            });
        
        $(
'.debug ul'$this).html('<li>Démarrage d\'une nouvelle partie</li>');
    }
    
    function 
ResolveTurn($settings$this) {
        
$settings.Turn++;
        
        
// Tirage carte du joueur 1
        
var P1card $settings.P1Cards.shift();
        $(
'.P1Deck ul'$this).html('<li>Vous tirez : <b>'P1card.card +'</b></li>');
        
        
// Tirage carte du joueur 2
        
var P2card $settings.P2Cards.shift();
        $(
'.P2Deck ul'$this).html('<li>Vous tirez : <b>'P2card.card +'</b></li>');
        
        if(
$settings.Stack.length == 0)
        {
            
// Joueur 1 a une plus grande carte
            
if ( P1card.value P2card.value )
            {
                
$settings.P1Cards.push(P1cardP2card);
                $(
'.P1Deck ul'$this).append('<li>Vous gagnez : \
                    <b>
'+ P2card.card +'</b> grace à <b>'P1card.card +'</b></li>');
                $(
'.P2Deck ul'$this).append('<li>Vous perdez : \
                    <b>
'+ P2card.card +'</b> face à <b>'P1card.card +'</b></li>');    
            }
            
// Joueur 2 a une plus grande carte
            
else if ( P1card.value P2card.value )
            {
                
$settings.P2Cards.push(P1cardP2card);
                $(
'.P1Deck ul'$this).append('<li>Vous perdez : \
                    <b>
'+ P1card.card +'</b> face à <b>'P2card.card +'</b></li>');
                $(
'.P2Deck ul'$this).append('<li>Vous gagnez : \
                    <b>
'+ P1card.card +'</b> grâce à <b>'P2card.card +'</b></li>');
            }
            
// Joueur ont tous les deux la même carte
            
else
            {
                
$settings.Stack.push(P1cardP2card);
                
ResolveTurn($settings$this);
                return;
            }
        }
        
// Descartes sont déjàs placées dans le pot...
        
if($settings.Stack.length 0)
        {
            
// Joueur 1 a une plus grande carte
            
if ( P1card.value P2card.value )
            {
                
$settings.P1Cards.push(P1cardP2card);
                for(var 
i=0$settings.Stack.lengthi++)
                    
$settings.P1Cards.push($settings.Stack.shift());

                $(
'.P1Deck ul'$this).append('<li>Vous gagnez : \
                    <b>
'+ P2card.card +'</b> grace à <b>'P1card.card +'</b>, \
                    plus 
'+ $settings.Stack.length +' cartes d\'égalitées.</li>');
                $(
'.P2Deck ul'$this).append('<li>Vous perdez : \
                    <b>
'+ P2card.card +'</b> face à <b>'P1card.card +'</b>, \
                    plus 
'+ $settings.Stack.length +' cartes d\'égalitées.</li>');
                    
                
$settings.Stack = [];    
            }
            
// Joueur 2 a une plus grande carte
            
else if ( P1card.value P2card.value )
            {
                
$settings.P2Cards.push(P1cardP2card);
                for(var 
i=0$settings.Stack.lengthi++)
                    
$settings.P1Cards.push($settings.Stack.shift());

                $(
'.P1Deck ul'$this).append('<li>Vous perdez : \
                    <b>
'+ P1card.card +'</b> face à <b>'P2card.card +'</b>, \
                    plus 
'+ $settings.Stack.length +' cartes d\'égalitées.</li>');
                $(
'.P2Deck ul'$this).append('<li>Vous gagnez : \
                    <b>
'+ P1card.card +'</b> grâce à <b>'P2card.card +'</b>, \
                    plus 
'+ $settings.Stack.length +' cartes d\'égalitées.</li>');
                    
                
$settings.Stack = [];
            }
            
// Joueur ont tous les deux la même carte
            
else
            {
                
$settings.Stack.push(P1cardP2card);
                
ResolveTurn($settings$this);
                return;
            }
        }
        
        $(
'.P1Deck ul'$this).append('<li>Il vous reste <b>'$settings.P1Cards.length +'</b> cartes</li>');
        $(
'.P2Deck ul'$this).append('<li>Il vous reste <b>'$settings.P2Cards.length +'</b> cartes</li>');
        
        
// Un joueur a t-il perdu ?
        
if( $settings.P1Cards.length == || $settings.P2Cards.length == )
        {
            
GameOver($settings$this);
        }
        
        var 
debug_return '<li>Tour '+$settings.Turn+'\
            [ P1 => ( 
'+ $settings.P1Cards.length +' cartes /\
            
'+GetPlayerPoints($settings.P1Cards)+' points ) | \
            P2 => ( 
'+ $settings.P2Cards.length +' cartes / \
            
'+GetPlayerPoints($settings.P2Cards)+' points ) ]</li>';
        
        $(
'.debug ul'$this).prepend(debug_return);
        
    }
    
    function 
GameOver($settings$this) {
        
// Suppression du bouton de resolution du tour.
        
$('.ControlDeck .resolveturn'$this).attr('disabled'true);
        
        
// Joueur 1 a perdu
        
if( $settings.P1Cards.length == )
        {
            $(
'.P1Deck ul'$this).append('<li><h5>Vous avez perdu en '+$settings.Turn+' tours</h5></li>');
            $(
'.P2Deck ul'$this).append('<li><h5>Vous avez gagné en '+$settings.Turn+' tours</h5></li>');                
        }
        
// Joueur 2 a perdu
        
if( $settings.P2Cards.length == )
        {
            $(
'.P1Deck ul'$this).append('<li><h5>Vous avez gagné en '+$settings.Turn+' tours</h5></li>');
            $(
'.P2Deck ul'$this).append('<li><h5>Vous avez perdu en '+$settings.Turn+' tours</h5></li>');                
        }            
        
        $(
'.debug ul'$this).prepend('<li>Partie Terminée</li>');
    }
    
    function 
GetPlayerPoints($PlayerCards) {
        var 
points 0;
        
        for(var 
i=0$PlayerCards.lengthi++)
            
points += $PlayerCards[i].value;
        
        return 
points;
    }
    
    function 
RandomizeCards myArray ) {
        
// http://sedition.com/perl/javascript-fy.html
        
var myArray.length;
        if ( 
== ) return false;
          while ( --
) {
            var 
Math.floorMath.random() * ( ) );
            var 
tempi myArray[i];
            var 
tempj myArray[j];
            
myArray[i] = tempj;
            
myArray[j] = tempi;
       }
    }
})(
jQuery);

$(
document).ready(function(){
    $(
'#Game').PlayCards();
});

<
div id="Game"></div

Qui dors pas...
URLs de référence