BattleShip en C (essai)

Présentation
Voici une version écrite en C permettant de faire une partie contre l'ordinateur.

C'est un essai, il y a peu ou pas du tout de commentaires (désolé je suis trop pourri), cependant (logiquement) vous devriez pouvoir mener une partie de bout en bout (soit vers la défaite, soit vers la victoire ^^).

Je voudrais bien trouver un moyen sous Linux de pouvoir apporter des modifications, notamment concernant l'affichage (prévu pour du 1920x1080 ou en 1280x800) je voudrais pouvoir développer une fonction qui permette d'afficher l'interface utilisateur de manière propre peu importe la résolution (attention ce programme est en mode terminal).

Pour compiler le code source:

gcc -pthread sda2013.c -o sda2013

Les répertoires maps doivent se trouver dans le même répertoire que l'exécutable.
Jusqu'à présent vous pouvez jouer sur des maps 12x12, 13x13, 14x14 (mais il est prévu de jouer sur d'autres maps, maximum 26x26 en fonction de la résolution de l'écran, mais c'est pas automatique)

Je pense à faire un serveur java pour pouvoir faire des parties réseau (toute aide pour le module réseau client serait la bienvenue, d'autant que la programmation réseau TCP en C n'est pas une sinécure).










Téléchargement
Compatibilité
Linux
0  0 
Téléchargé 115 fois Voir les 13 commentaires
Détails
Catégories : Codes sources C Jeux
Éditeur : CSSM Saint-Martin   +
Licence : Libre
Date de mise en ligne : 17 avril 2013




Avatar de Bktero Bktero - Modérateur https://www.developpez.com
le 17/04/2013 à 10:05
Salut,

Je suis sous Windows, je n'ai donc pas testé le programme. Les screenshots sont pas mal, ça m'a donné envie de regarder le code. J'ai eu un peu peur juste en ouvrant l'archive. Un seul fichier c de...... 2185 lignes ; un seul point contenant...... 350 lignes de code !

C'est dommage car il y a indéniablement énormément de travail mais c'est impossible de rentrer dedans. Tu as par exemple une fonction IntelligenceLevelTwo() qui fait 500 lignes avec quasiment aucun commentaire en cours de route et pas de description au début ! On trouve aussi une fonction start() qui fait 480 lignes !

Même pour toi, je me demande comment tu as pu te souvenir de tout ce que fait ton code avec si peu de commentaires et de découpage en fichiers ! Tu as une sacrée mémoire on dirait ^^

Petite remarque : tu ne compiles pas avec des flags tels que -Wall -Wextra ? Ou alors c'est que pour nous que tu les as enlevé ?

Encore une fois, on sent qu'il y a énormément de travail donc bravo à toi ! Le sources postées ces derniers n'étaient largement pas aussi conséquentes.
Avatar de hurukan hurukan - Membre régulier https://www.developpez.com
le 17/04/2013 à 16:13
Oui tu as raison, j'étais tellement content d'avoir obtenu quelque chose de valable que je me suis empressé de le poster.

Je savais qu'il n'y avait pas/peu d'explications, moi ça va je sais ce que je fais (plus ou moins) mais il est clair que si quelqu'un (par exemple une personne motivée pour porter le programme sous Windows) devait plonger dans mon code il aurait vite mal à la tête.

Ce que je vais faire c'est prendre le temps de relire le code et dans un fichier (pdf) à part "tenter" d'expliquer en grande ligne le fonctionnement du programme.
Dans le code source, je vais commenter beaucoup plus.

Je compile en ligne de commande (comme au bon vieux temps) ce qui fait que je ne voulais pas découper mon application en "modules" et commencer à jouer avec un Makefile, paresse encore une fois.

De plus, à la base, c'était un exercice récapitulatif pour mes étudiants, et à leur niveau la compilation de plusieurs fichiers "objets" en un seul exécutable c'est de l'inconnu. Ils débutent ne leur faisons pas trop peur ^^

Je modifierais les fichiers joints en conséquence.
Je sais c'est pas du tout professionnel et je vous demande déjà à tous d'accepter mes excuses. La précipitation n'est jamais gage de solutions.
Avatar de ternel ternel - Expert éminent sénior https://www.developpez.com
le 17/04/2013 à 16:27
Un makefile n'est pas forcément requis. Un simple gcc *.c -o battleship suffirait.

Je me pencherai plus longuement sur ton code ce soir.
Avatar de kwariz kwariz - Membre expert https://www.developpez.com
le 17/04/2013 à 17:37
Bonjour,

je serai un peu moins enthousiaste que bktero
C'est vrai que le screenshot et mes souvenirs issus du début des années 80 m'ont donnés envie de tester ton jeu. Un bon vieux «battaille navale» comme du temps de mes bidouilles sur mon cbm64 ... Enfin ... passons aux quelques points qui maintenant me chiffonnent pour un code fournit ici (je ne parlerai donc pas de jouabilité ou d'esthétique du jeu) :

  • pas de compilation séparée ????
  • Un header avec du code dedans !!! Heureusement que tu n'utilises pas la compilation séparée -> en général (sauf cas particuliers motivés) c'est à proscrire à tout prix.
  • Un code qui n'est pas maintenable au-delà de la semaine car trop long par endroit, copié/collé dangeureux, commentaires inégaux en qualité, aucune segmentation du code, et surtout couplage trop fort entre ton interface et ton moteur de jeu
  • Quelques erreurs potentielles (enfin repérées en diagonale ... c'est à approfondir), je ne les ai repérées que grâce aux options -Wall -Wextra (Bktero fait bien de soulever le point)

    • main doit renvoyer un int, ton prototype n'est pas conforme ; bon c'est pas super grave ...
    • Une grosse erreur : dans la fonction Start, tu déclares carLu un unsigned char (l265); ensuite tu lui donnes la valeur de retour d'un fgetc (qui renvoie un signed int); puis surtout ensuite tu l'utilises ainsi : atoi(&carLu) en l335.
      L'erreur est dans ce dernier appel car atoi attend une chaîne à 0 terminal pour transformer cette chaîne en int, tu dois avoir du bol que sur le stack l'alignement fait que l'octet suivant ton carLu soit nul ... cela peut provoquer des erreurs difficiles à débugguer (-> l'ajout d'une nouvelle variable locale ou même simplement une modification de leur ordre de déclaration peut faire planter ton programme sans raison apparente dans certains cas par exemple)
      Même erreur ensuite en l395.
      Là il s'agit d'une véritable erreur pouvant planter ton programme.
      Ce genre d'erreur est très difficile à repérer (coup de bol pour moi, tu mélanges les unsigned char avec des char et des int ...).
    • le reste des warning concerne souvent des variables non utilisées, des différences de signes lors de comparaison ou de passage de paramètres, ainsi que des petits problèmes de const.
  • Pourquoi ne pas avoir utilisé une bibliothèque «classique» comme ncurses pour ton interface ?
  • Contrairement à l'Éternel, je considère le Makefile comme presque indispensable. Petite remarque, pour ma configuration il s'avère indispensable de rajouter l'option -lm pour compiler.


Je considère ce source plus comme une belle réalisation «one shot» d'hobbyiste qu'une base de développement ou d'apprentissage pour des personnes désirant s'engager dans le développement.
En tout cas bravo pour l'effort, pour le résultat et les quelques minutes que j'ai passées à jouer ont été agréables quoique parfois laborieuses
Avatar de hurukan hurukan - Membre régulier https://www.developpez.com
le 17/04/2013 à 18:39
Je considère ce source plus comme une belle réalisation «one shot» d'hobbyiste qu'une base de développement ou d'apprentissage pour des personnes désirant s'engager dans le développement

...c'est en effet le cas, il s'agit d'un essai que j'ai fait en quelques jours... je n'ai aucune prétention...

Un header avec du code dedans !!! Heureusement que tu n'utilises pas la compilation séparée -> en général (sauf cas particuliers motivés) c'est à proscrire à tout prix

...je n'ai plus programmé en C depuis 1999 et j'ai sans doute oublié les bonnes attitudes... je tiendrais compte de cette remarque pour la communiquer à mes étudiants ^^

Un code qui n'est pas maintenable au-delà de la semaine car trop long par endroit, copié/collé dangeureux, commentaires inégaux en qualité, aucune segmentation du code, et surtout couplage trop fort entre ton interface et ton moteur de jeu

...pour les commentaires je ne reviens pas dessus... mais ceci montrera à mes étudiants aussi que c'est très important de commenter convenablement son code...
Je suis certain, une fois que j'aurais le temps, de pouvoir rendre ce code plus lisible, tes remarques sont très objectives et me sont très utiles.

Une grosse erreur : ...
Là il s'agit d'une véritable erreur pouvant planter ton programme.
Ce genre d'erreur est très difficile à repérer (coup de bol pour moi, tu mélanges les unsigned char avec des char et des int ...).

...c'est tout l'avantage de poster ce code aux yeux de véritables experts... je vais corriger cela dès que j'aurais un peu de temps...

Pourquoi ne pas avoir utilisé une bibliothèque «classique» comme ncurses pour ton interface ?

...excellente question... je suis tombé dessus par hasard dans mes recherches mais je n'avais "pas le temps" d'approfondir... si je trouve de la bonne documentation je m'y pencherais...

Je suis content des réactions et je vais sans doute en apprendre un peu plus sur les "bonnes" manières de programmer en C !!

D'ici peu vous aurez une toute autre version du code source, je ne dis pas que chaque ligne sera commentée mais à mon avis ce sera plus lisible pour les personnes "extérieures". Du moins c'est le minimum que je puisse faire.

Je vais corriger aussi les erreurs potentielles (je n'imaginais pas à quel point je risquais de voir mon application buggée), histoire de tirer bénéfice des avis des experts. Apporter plus de rigueur. J'ai trop tendance à penser que "c'est bon ça marche" sans doute l'influence de mes élèves ^^

Merci beaucoup en tous cas ^^
Avatar de dragonno dragonno - Membre confirmé https://www.developpez.com
le 17/04/2013 à 20:07
De plus, à la base, c'était un exercice récapitulatif pour mes étudiants, et à leur niveau la compilation de plusieurs fichiers "objets" en un seul exécutable c'est de l'inconnu. Ils débutent ne leur faisons pas trop peur ^^

Mon avis c'est qu'il vaut mieux leur donner une bonne habitude dés le départ, ils auraient plus peur selon moi d'un code de ce type que d'un code plus organisé
Pour l'affichage quelque soit la résolution, tu peux passer par l'API win32 aussi.
(si tu es sous windows).
Avatar de Bktero Bktero - Modérateur https://www.developpez.com
le 17/04/2013 à 21:19
c'est bon ça marche

Lol ! Règle d'or du code : "ça marche, je peux commencer les tests intensifs ; c'est testé avec succès, c'est bon"

De plus, à la base, c'était un exercice récapitulatif pour mes étudiants, et à leur niveau la compilation de plusieurs fichiers "objets" en un seul exécutable c'est de l'inconnu. Ils débutent ne leur faisons pas trop peur ^^

C'est pas un peu conséquent comme code pour des débutants justement ? Ils prennent cher tes élèves !

Mon avis c'est qu'il vaut mieux leur donner une bonne habitude dés le départ, ils auraient plus peur selon moi d'un code de ce type que d'un code plus organisé

Je suis tout à fait d'accord ! Il faut donner de bonnes habitudes et réflexes dés le début. J'ai pris trop de mauvaises habitudes en école que j'ai eu du mal à perdre...

D'ailleurs, le découpage en fichier par thèmes et modules doit se faire dés le début. Ça permet d'isoler les fonctionnalités et comme le dit kwariz, de faciliter un couplage plus faible. Si tout est dans le même fichier, la tentation est beaucoup trop grande d'imbriquer les éléments, les rendant inséparables. Typiquement ici, kwariz pointe le problème de couplage de l'interface graphique qui complique le portage de l'application vers une autre plateforme ou de passer en mode fenêtré.

je serai un peu moins enthousiaste que bktero

J'ai pourtant l'impression qu'on exprime un avis assez proche non ?
On est contents que des gens postent de vraies sources et non 3 lignes qui compilent pas (true story...). Mais dans le même temps, on a pas mal de reproches (constructives mais on est comme ça nous ) à faire.
Avatar de kwariz kwariz - Membre expert https://www.developpez.com
le 17/04/2013 à 22:47
Citation Envoyé par Bktero  Voir le message
[...]
J'ai pourtant l'impression qu'on exprime un avis assez proche non ?
On est contents que des gens postent de vraies sources et non 3 lignes qui compilent pas (true story...). Mais dans le même temps, on a pas mal de reproches (constructives mais on est comme ça nous ) à faire.

Oui on est du même avis, d'aileurs souvent je ne poste pas car tu m'as devancé et que je n'avais rien de plus constructif à ajouter
Je suis moins enthousiaste dans le sens que je trouve cet exemple inapproprié pour apprendre la programmation ni même le C. C'est pour cela que je parle de premier jet d'hobbyiste. Je pense que le public auquel s'adresse hurukan est plutôt jeune et constitue seulement une sorte d'introduction à la programmation sous un aspect ludique (cela est confirmé si tu googles un peu). Comme l'auteur le dit lui-même, la démarche n'a pas pour but de produire un code pro/propre/etc. mais plus pour donner une idée de ce que c'est et d'être content de soi pour l'avoir fait.
Ensuite on peut discuter des heures, troller ou lancer une flame war pour savoir si un environnement plus classique (style vs express) est plus adapté ou non ... c'est le genre de discussion qui se stérilise vite par elle-même malheureusement.
Nous verrons bien si nos remarques portent ou non, la motivation est là et c'est ce qui importe au final dans ce cas
Avatar de hurukan hurukan - Membre régulier https://www.developpez.com
le 18/04/2013 à 0:16
Oui ils prennent cher mes élèves mais attention: je ne me sers de ce programme fonctionnel (dans les grandes lignes) pour démontrer qu'il est possible de faire quelque chose de sympa avec ce que nous avons vu aux cours.

La compilation (console, IDE netbeans)

La syntaxe

Les variables <-> types de données (bon c'est vrai c'est pas top top l'exemple que je donne mais à ma décharge nous ne poussons pas l'analyse très loin, ils ont entre 17 et 19 ans ils ont du mal à se représenter les concepts)

Les tableaux (entiers et chaînes de caractères)

Les boucles

Les fonctions

Les entrées/sorties

...les trucs habituels quoi.

Je ne vais pas leur demander d'aller aussi loin que moi, les "algorithmes" pour "améliorer" la manière dont va tirer l'ordinateur je ne vais pas leur demander de le pondre.

Je veux juste qu'ils puissent se rendre compte qu'ils sont capables de faire une petite application avec ce qu'ils savent et savent faire. Si ils savent mener une partie de bout en bout d'ici début juin je serais déjà très satisfait.
Ils sont déjà capables d'utiliser les fonctions mises à leurs disposition pour l'affichage des informations, ils modifient le code pour afficher d'autres couleurs que l'horrible vert par défaut... non je pense que c'est une sorte d'émulation pour eux...

Autre exemple, ils ne géreront que des grilles 12x12, le côté "dynamique" c'est moi qui l'ai pondu pour "faire le malin" sans plus.

J'ai plus envie de partager ma passion, que de les torturer ^^
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.
Contacter le responsable de la rubrique C