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é 79 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 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 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 dragonno dragonno - Membre confirmé https://www.developpez.com
le 01/05/2013 à 14:17
Je sens que ça va être très excitant ^^
Tout a fait
Vive la programmation
Avatar de forum forum - Robot Forum https://www.developpez.com
le 17/04/2013 à 4:52
Bonjour,

Je vous propose un nouvel élément à utiliser : BattleShip en C (essai)

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).

Qu'en pensez-vous ?
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 habitué 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 hurukan hurukan - Membre habitué 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 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
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

Partenaire : Hébergement Web