mercredi 29 avril 2009

Vous avez toujours envie de développer votre premier jeu en C#, je vous avez promis « La bataille navale »,faisons le ensemble :D



Du nouveau, Oui, je reviens à vous avec du neuf, concernant quoi ?, … n’allez pas chercher bien loin, je vous l’avez promis … ouvrez bien vos oreilles : « The Navale Ballte : design , conception & codage en C# » Eh oui , on y est , ceci est donc le premier Tuto d’une série d’articles que je présenterai au fur et a mesure que je les préparerai.

Je ne vais pas non plus m’attarder à vous expliquer la philosophie de mon développement, donc, je vais essayer de faire le plus simple et le plus directe possible :D ,

A vos clavier donc, je vais commencer par introduire les couches que j’ai implémenté dans mon projet , ne soyez pas impressionné par ce mot , développer en couche ou en module vous offre plus de facilité ,une meilleure organisation de votre code et une plus grande efficacité d’intervention face aux bugs et aux éventuels problèmes.

Donc, en gros il y a mon application, c'est à dire mon jeu qui peut être lancé par n’importe quel utilisateur en vue de faire une partie et il y a le serveur qui se charge de synchroniser mon mode multi-joueurs, et pour que vous suiviez mon raisonnement je vais commencer par la partie serveur, les variables qui y sont définie et les fonctions de synchronisation que j’ai implémentée.

J’essayerai de détailler au maximum mon code, donc vous aurez des fois l’impression que
Je prendrai mon temps à expliquer les parties disons les plus compliquer même s’il n’y a rien de compliquer dans tout cela :D

Voici les variables que j’ai définie dans ma classe service, juste une petite remarque, les variables que j’ai définie en private ne sont accessible qu’a partir des fonctions de la même classe donc, pas a partir de mon applicatif coté client, ceux en static auront la particularité de
De rester statiquement modifiable par mes fonctions serveur , je sais ce que vous vous dite , mais c’est quoi ce truc de « statiquement modifiable » logiquement ; on ne peux modifié le statique et le modifiable ne peut pas être statique o_O ! , en réalité un objet statiquement modifiable restera statique jusqu'à sa prochaine modification pour ceux qui connaissent les principes du bistable par rapport au mono stable comprendront beaucoup plus facilement

private bool P1_play = false;

private bool P2_play = false;

private string P1_coup = "";

private string P2_coup = "";

static private bool P1_connection = false;

static private bool P2_connection = false;

static private bool P1_update = false;

static private bool P2_update = false;

static private string[] P1_B1 = new string[4];

static private string[] P1_B2 = new string[3];

static private string[] P1_B3 = new string[3];

static private string[] P1_B4 = new string[2];

static private string[] P2_B1 = new string[4];

static private string[] P2_B2 = new string[3];

static private string[] P2_B3 = new string[3];

static private string[] P2_B4 = new string[2];



Et comme vous voyez dans cette première potion de code j’ai définie six variables logiques. Les deux premières me permettrons de définir l’état ou disons rôle de chaque joueur, s’il a déjà joué, ou s’il a la main pour joué.les deux autres P1 & P2 connexion servent à définir le statut de chaque joueur (connecté ou non connecté) par rapport a la partie en cours. Et enfin les deux dernières celles de l’update qui permettent de connaitre si le joueurs a fournis ou pas toutes les informations nécessaire au lancement de la partie.

La question qui se pose maintenant, c’est comment faire pour animer tout cas, la je vous dirai « FONCTION » et je vais vous illustrer les quelques fonctions que j’ai développé coté serveur et qui me permettent de synchroniser ma partie.



public string allow_player()

public void play(string nb_player,string coup)

public string[] upload_position(string nb_player)

public void player_update(string nb_player,string pos1,string pos2,string pos3,string pos4)




Donc pour ce premier Tuto je vais faire tout simple et je vais commencer par ces 5 fonctions que je commenterai au fur et à mesure que je montre mon code.

Update_player , tout est dans sa définition :D , chaque joueurs sollicitera cette fonction avant de se mettre en état « je suis prêt a lancer ma partie » et cela permet d’updater les positions de ces quartes bateaux sur cette classe coté serveur , donc , après lancement de la partie chaque joueurs aura une grille caché , et elle n’aura qu’un seul truc a cacher cette grille , les positions des bateaux de son adversaire.

public void player_update(string nb_player,string pos1,string pos2,string pos3,string pos4)

{

if (nb_player=="P1")

{

P1_B1[0]=pos1.Substring(0,2);

P1_B1[1]=pos1.Substring(2,2);

P1_B1[2]=pos1.Substring(4,2);

P1_B1[3]=pos1.Substring(6,2);

P1_B2[0]=pos2.Substring(0,2);

P1_B2[1]=pos2.Substring(2,2);

P1_B2[2]=pos2.Substring(4,2);

P1_B3[0]=pos3.Substring(0,2);

P1_B3[1]=pos3.Substring(2,2);

P1_B3[2]=pos3.Substring(4,2);

P2_B4[0]=pos4.Substring(0,2);

P2_B4[1] = pos4.Substring(2, 2);

P1_update = true;

}

else

{

P2_B1[0]=pos1.Substring(0,2);

P2_B1[1]=pos1.Substring(2,2);

P2_B1[2]=pos1.Substring(4,2);

P2_B1[3]=pos1.Substring(6,2);

P2_B2[0]=pos2.Substring(0,2);

P2_B2[1]=pos2.Substring(2,2);

P2_B2[2]=pos2.Substring(4,2);

P2_B3[0]=pos3.Substring(0,2);

P2_B3[1]=pos3.Substring(2,2);

P2_B3[2]=pos3.Substring(4,2);

P2_B4[0]=pos4.Substring(0,2);

P2_B4[1]=pos4.Substring(2,2);

P2_update = true;

}

}



Je vous disais que la fonction update sert à faire parvenir les positions a ma classe coté serveur Pour que chaque joueurs puisse les updater, une deuxième fonction a été élaborer la fonction upload_posision , et la vous remarquez que les position sont retourner sur un tableau de string , donc , je les envoie en chaine de caractère et pour les exploiter coté joueur j’effectue une dé-concaténation et cela m’évitera bien sur d’entrer à chaque fois dans l’exécution de plusieurs boucles for(…) if()….else….





public string[] upload_position(string nb_player)

{

string[] Positions = new string[4];

if (nb_player == "P1")

{

Positions[0] = P2_B1[0] + P2_B1[1] + P2_B1[2] + P2_B1[3];

Positions[1] = P2_B2[0] + P2_B2[1] + P2_B2[2];

Positions[2] = P2_B3[0] + P2_B3[1] + P2_B3[2];

Positions[3] = P2_B4[0] + P2_B4[1];

return Positions;

}

else

{

Positions[0] = P1_B1[0] + P1_B1[1] + P1_B1[2] + P1_B1[3];

Positions[1] = P1_B2[0] + P1_B2[1] + P1_B2[2];

Positions[2] = P1_B3[0] + P1_B3[1] + P1_B3[2];

Positions[3] = P1_B4[0] + P1_B4[1];

return Positions;

}

}



Je continue alors avec mes fonctions, il en reste deux pour ce premier tuto , les fonctions , play et Allow_player, la fonction Play est sollicité a chaque coup dans la partie , elle informe chaque joueur sur son tour, s’il doit jouer ou s’il doit attendre le cout de son adversaire.
Et cela a travers les deux variables que j’ai définie précédemment, P1_play et P2_play

public void play(string nb_player,string coup)

{

if (nb_player == "P1")

{

P1_play = true;

P2_play = false;

}

else if (nb_player == "P2")

{

P2_play = true;

P1_play = false;

}

}



Et pour finir une dernière fonction, que n’était présente dans mon code, mais que j’ai préféré implémenté pour que ca fasse plus propre et que mon code soit bien compréhensible
Une fonction de ce genre vous sera surtout utilise si vous travailler sur une plus grosse application serveur , genre un serveur qui supporte 5,10 voir plus de 20 joueurs , la vous devrai allouer un état a chaque joueur , or , dans mon code la , je ne fais que fournir deux information , quel joueur s’est connecté et quel est son statue par rapport à la partie qui vas se lancer « P1 » ou « P 2 » imaginez un peu ce que cela risquerai de donner comme fonction dans le cas ou je travaille avec 10 joueurs en même temps. Je sais que ca vous excite tout ca ,ben , ne vous en faite pas , aussitôt que je terminerai ces premier tutos ou je vais montrer le plus gros de mon code on redéveloppera ensemble ce même algorithme pour une charge minimale de 10 utilisateurs :D , j’ai ma petite idée sur la manière la plus optimale de le faire ;)

Et si vous vous encore une fois revoir à quoi ça va ressembler à la fin , c'est ICI que ça se passe :)













dimanche 26 avril 2009

.NET vs JAVA en 7 rounds : Au plaisir des développeurs :)



Ah enfin un débat qui fait rage, deux mondes qui se bousculent celui de Microsoft et des technologies NET d’une part et celui de JAVA/J2EE d’autre part. Étant développeur plutôt orienté plutot vers le monde Microsoft et les langages NET, je m’intéresse ces dernier temps a ce vaste monde de l'Open Source qu’est le monde JAVA, quel en sont les avantages et quel choix serai-il astucieux de faire, nous allons comparer ses deux mondes sur plusieurs points : …

Avant de commencer quelques éclaircissements s’imposent, n’oublions pas que le monde .NET tourne autour du Framework .NET .Il se voulait être un support multi langages unique en son genre, ce qui offrait la possibilité a tout type de développeurs quel que soit son langages d’adapter ses portions de code à ses futurs solutions élaborées sous .NET et cela grâce à la CLR (Commun Langage Runtime). Java reste plutôt conservateur par rapport à ce point et Microsoft utilise souvent cet argument pour venter les mérites du .NET :D c’est pour dire que c’est de bonne guerre …


Particularités :

J2EE, le chouchou de la communauté Open Source offre un très large éventail en termes de possibilité dans le développement pour les entreprises. Grace à sa légèreté et à sa portabilité, JAVA est très présent dans les applications mobiles. Les outils JAVA sont aussi présent dans toutes les plateformes ce qui laisse aux développeurs une certaine flexibilité de travail…

Coté serveur j’estime que le JAVA à atteint une certaine maturité qui lui donne un certain avantage, je m’explique ; Linux et Unix détiennent plus de 2/3 des installations de serveurs dans le monde, et .NET est maintenant accueillable sur des serveurs Linux (Projet Mono)
Coté client, la balance pencherai plutôt pour le .NET, et cela grâce à l’OS WINDOWS qui
Est présent sur la plupart des PC et qui inclut dans ses dernières version le Framework .NET.

Dépendance :


Certain dirons que MS DOS, Win 3.11 et Win95 n’offrent aucun support pour les applications fonctionnant dans un environnement .NET, je répondrai alors en disant ; aurai-t-on vraiment besoin de faire tourner nos applications sur les Systèmes d’exploitation qui date du moyen âge o_O ! hein ! …

Portabilité :

. NET n ‘est généralement pas directement portable sur PDA ce qui donne à JAVA un point de plus par rapport à ca. Je dirai aussi que Microsoft .NET à une tendance à s’orienter vers le développement Web avec l’ASP.NET , Silverlight …ect , et que le JAVA se chargera plutôt de l’élaboration d’applications distribuées pour les entreprises (JSP, Serlets, EJB)
.NET offre aussi aux developpeurs une plus grande facilité de developpement


Originalité :

Vous avez surement entendu parler de la smart navigation possible à travers ASP.NET et qui consiste à ne pas télécharger les pages complètement mais à ne télécharger que les portions de page modifié ce qui vas donner lieu à une navigation disons plus optimisée.
JAVA est le roi de l’Open source avec open Office et Apache, en plus du serveur d’applications J2EE le JBOSS.
Pour créer un web service en .NET, on ajoute simplement un attribut, et pour appeler notre web service on n’a plus qu’a le référencer comme web référence ; un objet proxy est généré utilisable du coté client.

Ce qui est drôle dans cette histoire c’est qu’IBM et Microsoft se font une guerre des web services, et Windows cherche toujours à avoir le monopole.

Application multiutilisateurs :

.NET et à travers l’apparition du .NET Remoting, duWCF, des web services a percé dans le domaine des applications distribuées ce qui lui donne une grande capacité à être utilisé dans l’élaboration de solutions multiutilisateurs. Il dispose aussi pour cela de dizaine de milliers de classes
Pour ce qui est de Java, à travers le serveur d’application JBOSS on peut concevoir des solutions allons jusqu'à plus de 10.000 clients.

Sécurité :

Je pense que l’avenir du .NET sera plutôt dans les applications bureau et que Le java grâce au J2EE s’orientera plutôt vers le développement réseau sécurisé .sa maturité l’impose ^^ !.
Java s’est imposé sur ce point à travers la sécurité de ses architectures, Java/CORBA en est l’exemple
Microsoft a dernièrement doté sa plateforme de modules de sécurité intégrée

Autres particularités :

IBM à une plus grande expérience dans le domaine de l’informatique repartie (COBRA,Encina,…ect) , SUN offre aussi à travers le Websphere studio , la création de web services en plus des options de gestion de la montée en charge.
Alors que .NET palie à ce problème à travers sa possibilité à travailler en mode déconnecté, par exemple, en utilisant les Data set.


Pour finir, j’ai décidé de me lancer à la conquête de ce vaste monde qu’est le monde Java , ayant été développeur .NET pendant deux ans, je bascule dans l’autre monde celui de l’open source de la portabilité et de la sécurité.

samedi 25 avril 2009

WCF : La magie des applications distribuées…


Windows Comunication Fundation est une extension du framework .NET 3.0 Vous pouvez à travers WCF concevoir et élaborer des applications distribuées fonctionnant dans un environnement réseaux , et la , vous vous dites que cela n’apport rien de plus par rapport à ce qu’on avait l’habitude de faire avec .NET Remoting , les Web Services SOAP , le MSMQ ou encore le COM+ !

Détrompez vous, car WCF représente aussi un support pour toutes ses procédures de communications, donc quand vous opter pour WCF , vous n’aurai pas à changé votre code
pour adapté une solution fonctionnant en SOAP/HTML pour l’adapter à votre solution déployée. Par exemple, beaucoup d’entre vous utilise le http comme protocole de communication dans leurs applications webs , si vous décider demain de faire migrer ces même solutions et de les faire fonctionner sous TCP , aucune modification dans votre code ne sera nécessaire.

La partie code et la configuration de vos technologies de communication se font d’une manière indépendante.

Pour que vous puissiez avoir une idée sur la porté réelle de WCF , je vous conseille de suivre le Tutoriel suivant , il vous montre la conception et la réalisation d’un service de données en WCF.

Aussi pour bénéficier des extensions WCF dans votre framwork , je vous conseille dés maintenant de basculer vers la version 3.5 . Téléchargeable ICI.

Silverlight 2 : L’avenir du web…



Microsoft a lancé dernièrement Silverlight dans sa version 2, en voyant ce qu’elle apporte de plus on se rend vite compte que la version 1 n’été qu’un simple test en vue de préparer le terrain à celle la.

Selon Microsoft le lancement de cette nouvelle version est un succès totale Silverlight serai donc présent dans plus d’un PC sur quatre, son conçurent directe Adobe flash monopolise le plus grande du marché dans le domaine.


Néanmoins, de nombreux partenaires de Microsoft, de grands diffuseurs ont opté pour silverlight. Quelles sont alors les nouveautés apporté par silverlight 2 :

  • La technologie Deep Zoom ; ce qui offre une plus grande résolution d’image et fluidité des données.
  • Plus de contrôles intégrés, ce qui donne une plus grande simplicité de personnalisation vos applications
  • offre aux développeurs .NET plus de facilité d’implémentation car elle supporte les langages .NET notamment, le C#.
La protection DRM des contenues basée sur playReady de microsoft.

Silverligt a aussi été intégré dans l’environnement Eclipse ce qui donne aux développeurs une plus grande compatibilité avec leur environnement.

Silverlight est disponible pour Windows notamment pour les navigateurs Internet Explorer dans ses version 6,7 et 8, FireFox , pour Linux , et aussi pour Safari de MAC OS .

Enfin, et les développeurs en seront plus que content , pour intégrer Silverlight dans vos prochains solution vous devez d’abord télécharger et installer le Silverlight Tools for Visual Studio 2008 SP1 ensuite , vous devez passer au SP1 de Visual studio disponible ICI

Et pour plus d’information sur ces procédure , rendez vous au site www.silverlight.net

jeudi 23 avril 2009

hey , venez developper votre premier jeu en C# ...


Hey , Ça risque d’être un peu chaud pour ce post , Eh oui , je vous en avez déjà parler , la conception et le développement complet d’un jeu , et encore , quel jeu , la fameuse bataille navale , aussi compliquer que peuvent vous paraitre les algorithme à mettre en place pour positionner vos bateaux , pour updater ceux de votre adversaire ,pour synchroniser votre serveur , et pour mettre en place votre espace multi-joueurs , je vous dirai que cela reste largement à votre porté.


Si vous êtes passionné de programmation, que vous pouvez passer une nuit entière à coder, à compiler et à debugger, que vous vous dite, Je m’en fou royalement de ma réunion de demain matin, il peuvent bien attendre, l’essentiel c’est que je puisse faire ma petite partie avant de dormir , ne vous inquiétez , vous n’êtes ni fou ni malade , vous venez simplement d’entre dans une autre dimension celle des développeurs ,


ca vous arrive souvent de penser en code, de concevoir des applications quand vous marcher dans la rue, ce qu’il vous faut alors c’est de vous repolarisé, comment ? Ben en commençant à taper du code, qu’une idée vous viennent a l’esprit c’est bien, que vous la transformez en code c’est encore beaucoup mieux !


Aller , un petit avant gout de ce qui vous attend dans ce post en attendant qu’on parle CODE :D





Alors , Je sais ce que vous vous dites , Waw , je veux le faire , je veux coder ma bataille , je vous comprend … :D


Je pense que vous êtes assez motivé J , je vais commencer alors par introduire mon Tutoriel , il n’y a pas si longtemps de cela , je me suis lancer dans la conception puis le développement de ce jeu, je voulais le faire en C#, j’avais donc la possibilité de travailler avec Visual Studio 2008 , j’ai opté aussi pour le XAML pour concevoir mes interfaces, Au début je voulais mettre en place un serveur supportant au maximum une charge de 10 joueurs , mais vue que j’étais impatient de faire ma première partie , je me suis contenté d’en faire un à deux joueurs,

Comment ? je vous explique …


.NET REMOTING , vous connaissez ? ca sera l’équivalant du RMI pour les développeurs JAVA.

Si oui , je vous conseil alors de commencer à élaborer vos interface , à programmer les classes qui vont les implémenter de configurer vos Channel , je vous conseil de les faire en TCP .


Et si vous êtes amateur et que vous n’avez jamais conçu d’applications fonctionnant sous le principe Client / Serveur, je vous conseille de jeter un petit coup d’œil sur un autre article « débuter avec .NET REMOTING en C# » cliquer ICI pour en savoir plus..


Je consacrerai dans mes prochains postes un tutoriel complet sur le codage de ma partie serveur, ca va vous permettre d’avoir une idée, et de laisser libre court à votre imagination,

Je sais que vous y avez déjà pensé, pourquoi n’essayerai-je pas de coder mon Titris , mon domino , et pour les plus balèze d’entre vous , mon jeu d’échec , je ne vous cache pas qu’aussitôt que je serai en vac, je me lancerai dans la conception d’algorithme intelligents générateur de solutions pour mon jeu d’échec.


Je reviens à mon truc, Donc , je disais que , Ah oui , Pour les amateurs de Xbox , il est possible de développer des jeu à travers le moteur XNA , c’est assez simple , quelques notions en C#, le module XNA ,et vous vous lancez … donc, je vous propose pour ceci un autre Tutoriel histoire de vous familiarisez avec le module XNA cliquez ICI pour en savoir plus.


En attendant que vous vous documentez, je préparerai mon prochain post , je montrerai alors , la conception complète des interface du jeu ,le control des contrôles sous visual Studio et une partie du code nécessaire au repérage et au positionnement des bateaux .