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

 C Discussion :

Programme Puissance 4


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Programme Puissance 4
    Bonjour les experts !

    Me mettant à la programmation ces temps-ci, je cherche à coder un puissance 4 en C, qui je crois est un exercice de TP assez fréquent.

    Pour moi c'est compliqué, j'ai besoin de pratiquer.

    Pour le moment, j'affiche la grille et je la remplis avec les jetons de chaque joueur, à tour de rôle.

    Cependant, j'ai un bug que je ne comprends pas :

    - quand un joueur place un jeton en colonne 0 cela place également un jeton à la (colonne 6) (ligne -1)
    - et quand un joueur place un jeton en colonne 6 cela place un jeton aussi en (colonne 0)(ligne-1)

    C'est très bizarre. Merci pour votre aide

    Voici le code :
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    #include <stdio.h>
    #include <stdlib.h>
     
    #define HAUTEUR 6
    #define LARGEUR 7
    char damier [LARGEUR][HAUTEUR];
    int joueur = 1;
    int nbtokens = HAUTEUR*LARGEUR;
    char symbols[2];
    //symbols[0] = 'X';
    //symbols[1] = 'O';
     
    void initdamier()
    {
    	int i;
    	int j;
    	for (i = 0; i < HAUTEUR; i++)
    	{
    		for (j = 0; j < LARGEUR; j++)
    		{
    			damier[i][j] = ' ';
    		}
    	}
    }
     
    int askcolonne(int joueur)
    {
    	int col;
    	do
    	{
    		printf("Joueur %i, à vous de jouer !\n", joueur);
    		printf("Entrez un numéro de colonne entre 0 et 6\n");	
    		scanf("%d", &col); 
    	}
    	while (col<0 || col>6);
    	printf("Le numéro de colonne choisi est %i\n", col);
    	return col; 
    }	
     
    void displaydamier()
    {
    	int i;
    	int j;
    	printf("Tableau Puissance 4 :\n");
    	printf("---------------------\n");
    	for (i = 0; i < HAUTEUR; i++)
    	{
    		printf("+---+---+---+---+---+---+---+\n");
    		printf("|");
    		for (j = 0; j < LARGEUR; j++)
    		{
    			printf(" %c |", damier[i][j]);
    		}
    		printf("\n");
    		}
    	printf("+---+---+---+---+---+---+---+\n");
    	printf("  0   1   2   3   4   5   6 \n");
    	//printf("Le nombre de jetons restant dans le tableau est : %i\n", nbtokens);
     
    }
     
    void affichedamier()
    {
    	int m;
    	int n;
    	for (m = 0; m < 6; m++)
    	{
    		for (n = 0; n < 7; n++)
    		{
    			printf("Damier[%i][%i]=%c",m,n,damier[m][n]);
    		}
    		putchar('\n');
    	}
     
    }
     
     
    int calcule_position(int col)
    {
     
    	int i = 6;
    	int lig;
    	do
    	{
    		i--;
    	}
    	while (damier[i][col] != ' ');
     
    	//if (i >= 0 && i <= 5)
    	//{
    	lig = i;
     
    	//damier[lig][col] = symbol;
    //	printf("la valeur en ligne %i colonne %i vaut %c\n", lig, col, damier[lig][col]);
    	return lig;
    	//}
    }
     
    int searchp4(int col,int ligne)
    {
    	return 0; 
    }
     
    void displayresult(int winner, int joueur)
    {
     
    }
     
    int main (int argc, char ** argv)
    {
    	int winner = 0;
    	char symbol;
    	initdamier();
    	displaydamier();
    	do {
    		joueur = (joueur + 1)%2;
    		int colonne = askcolonne(joueur);
    		printf("Colonne vaut %i\n", colonne);
    		int ligne = calcule_position(colonne);
    		printf("Ligne vaut %i\n", ligne);
     
    		if (joueur == 0)
    		{
    			symbol = 'X';
    		}	
    		else
    		{
    			symbol = 'O';
    		}
    		damier[ligne][colonne] = symbol;
    		printf("symbol = %c\n", symbol);
     
    		winner = searchp4(colonne,ligne);
    		nbtokens--;
    		displaydamier();
    		printf("Winner vaut %i\n", winner);
    	}
    	while ( winner!=1 || nbtokens );
     
    }

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Si tu veux apprendre correctement le C , il faut alors deja apprendre a ne pas utiliser de variable global !

  3. #3
    Candidat au Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta remarque. Je ne savais pas. Ca explique peut être pourquoi mon char damier [LARGEUR][HAUTEUR], qui est déclaré en variable globale, est rempli avec n'importe quoi en colonne 0 et 6 ...

    J'ai lu qu'il fallait mieux déclarer les variables dans le main, et les passer par adresse aux différentes fonctions qui utilisent ces variables.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 677
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Bilen Voir le message
    Merci pour ta remarque. Je ne savais pas.
    Disons que ce n'est pas aussi simple que "il faut/il ne faut pas". Les globales existent donc on peut s'en servir. Simplement elles sont un outil et comme tout outil, elles ne sont efficaces que si elles sont bien utilisées car le but de leur existence n'est pas de s'éviter d'avoir à réfléchir à son code parce que dans la majorité des cas, elles posent 10 fois plus de problèmes qu'elles n'en résolvent et que justement il faut super réfléchir à son code quand on décide de les utiliser.
    En fait, le problème principal des globales c'est que si elles sont modifiées accidentellement il est difficile de repérer l'endroit ; et que si on leur donne un nom super con (ex int i), on prend le risque de masquer la globale par une locale du même nom au moment où on en aurait besoin.
    Dans ton cas, ces deux soucis sont moindres car le nom de tes globales est assez intelligent et ton code est assez bien découpé pour qu'on puisse repérer quand une globale est modifiée accidentellement.
    Mais cela ne t'empêche pas bien entendu de t'abstenir de globales autant que faire se peut.

    Citation Envoyé par Bilen Voir le message
    Ca explique peut être pourquoi mon char damier [LARGEUR][HAUTEUR], qui est déclaré en variable globale, est rempli avec n'importe quoi en colonne 0 et 6 ...
    Non, cela n'est pas la raison. Déjà une globale est toujours initialisée par défaut à 0 ; et toi tu as créé une belle fonction d'initialisation qui est nickel.
    Non, le principal souci (et j'ai mis au moins 15mn à le trouver) se situe ici char damier [LARGEUR][HAUTEUR]. Tu as inversé les dimensions du tableau. Or un tableau même 2D ne possède qu'une seule dimension en mémoire (qui n'est qu'une longue suite de cases). Et les positions i et j sont alors calculées par rapport à la largeur annoncée. Bref en ayant une largeur en mémoire différente de celle que tu utilisais pour tes calculs ça a donné ça. Et ce n'est même pas un "comportement indéterminé" (qui est la pire des choses qui puisse arriver en C[*]) car ce comportement est parfaitement déterminable et calculable.

    En fait chaque case [x][y] d'un tableau [H][L] est alors converti en mémoire de la façon suivante: case2D [x][y] = caseMémoire[x * L + y]. Et on peut étendre ça aux tableaux 3D [P][H][L] où case3D[x][y][z] = caseMémoire[x * H*L + y * L + z] et ainsi de suite (4D, 5D, etc).
    Si on applique cette formule à la case2D [x][0] (qui est la case dans laquelle tombe le pion quand tu demandes "colonne 0") et la case2D[x-1][6] (qui est la case qui affiche un 'X' parasite) avec L=HAUTEUR (donc 6 dans ton code initial) on se rend compte que c'est la même chose car 6x+0 = 6(x-1) + 6.
    Ainsi ça affiche deux fois certaines cases du tableau tandis que d'autres ne sont pas affichées.

    Citation Envoyé par Bilen Voir le message
    J'ai lu qu'il fallait mieux déclarer les variables dans le main, et les passer par adresse aux différentes fonctions qui utilisent ces variables.
    On ne passe les adresses des variables qu'aux fonctions qui ont besoin de modifier ces variables (comme par exemple avec scanf()). Les fonctions qui ont besoin de juste utiliser la valeur de la variable n'ont besoin que de la valeur elle-même, pas de l'adresse. Ca fonctionnera aussi avec l'adresse bien entendu mais c'est se compliquer la vie. D'ailleurs, tes fonctions askcolonne() et calculeposition() reçoivent juste la valeur de la variable et fonctionnent parfaitement.
    (PS: on utilise aussi les adresse quand on veut passer une structure à une fonction. En effet, une structure pouvant être très grosse, il est alors avantageux de passer juste une adresse de 8 octets à une fonction que lui passer la structure pouvant atteindre plusieurs dizaines/centaines d'octets)

    J'ai bien aimé ton code. Tu essaye de découper tes soucis et c'est bien. Tu peux juste améliorer quelques détails par exemple en utilisant LARGEUR et HAUTEUR au lieu de tes valeurs écrites en dur dans les fonctions ou en supprimant cette variable "i" totalement inutile dans ta fonction calculeposition(). Tu peux aussi séparer "calcul" de "affichage". Par exemple tu utilises " ", "X" et "O" à la fois comme repère et à la fois pour l'affichage. Or même si ça fonctionne ainsi, ce n'est pas la même chose. Quand moi j'ai voulu remplir ton tableau de "." pour essayer de voir le pourquoi de ton souci, j'ai eu un memory fault parce que ta fonction calculeposition() cherchait des espaces pour se repérer.

    Tu pourrais par exemple utiliser du numérique pur (ex 0, 1 et 2) pour tes calculs et à l'affichage, afficher " " quand c'est 0, "X" ou "O" quand c'est 1 ou 2. Cela te permettra plus tard de dissocier les fonctions dédiées aux calculs d'un côté et à l'affichage de l'autre pour par exemple remplacer tes printf() par une belle IHM graphique. C'est ce qu'on nomme la programmation "MVC" (Modèle/Vue/Contrôleur). Le modèle c'est le stockage des données, la vue c'est la saisie et l'affichage et le contrôleur sont les calculs. En séparant ces 3 entités, tu peux alors remplacer une technologie par une autre plus facilement. Tu devais d'ailleurs le sentir assez intuitivement car tu as créé une fonction affichedamier() probablement parce que tu sentais que "ce qu'il y a en mémoire" et "ce que je veux afficher" ne sont pas toujours la même chose. Mais t'as pas poussé l'idée assez loin.

    (*) Le comportement indéterminé est un comportement erratique issu d'un code contenant des instructions illicites mais syntaxiquement correctes (ex damier[123][-42]='X' => parfaitement autorisé par le langage mais s'adressant à une case clairement hors des limites du tableau). Le C est par essence totalement permissif car sa philosophie est "pour être le plus rapide possible je ne vérifie rien car le programmeur sait ce qu'il fait". Malheureusement l'inconvénient qui en résulte est que celui qui ne fait pas attention, qui va par exemple jusqu'à n inclus pour initialiser un tableau de n cases (les cases vont de 0 à n-1) obtient alors un code qui compile mais qui fait n'importe quoi, et ce n'importe quoi n'est absolument pas prévisible => comportement indéterminé. Dans l'absolu, ça pourrait même aller jusqu'à éteindre ta bécane ou te reformater ton disque dur => comportement réellement indéterminé pris au sens propre du terme.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Candidat au Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Salut,

    merci pour ton super message et ton analyse !

    merci d'avoir trouvé l'erreur, l'inversion entre LARGEUR et HAUTEUR ! Ca parait toujours bête une erreur mais en soi c'est si facile de se tromper si on fait pas gaffe.

    Je vais relire ton message plus en détail un peu plus tard pour bien saisir les principes et les concepts dont tu parles (variables globales, MVC, etc..)

    EDIT : en fait, si je comprends les précisions que tu as apporté à ton message, quand un joueur rentre un jeton en case (x,0), le X est renseigné en mémoire 1 fois. Le bug vient à l'affichage où quand on demande l'affichage de la case (x,0) on trouve bien le X en mémoire, mais quand on demande l'affichage de la case (x-1,6), et bien on va chercher la même case mémoire que pour case (x,0), et donc on affiche aussi le X qui est présent à cette adresse. Donc il faut bien gérer son truc pour ne pas se planter. Et le mieux c'est de bien comprendre le sens à utiliser pour déclarer un tableau 2D.... d'abord HAUTEUR, le nb de lignes, puis LARGEUR, le nb de colonnes.
    Merci pour ta démonstration.

  6. #6
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    Je ne vais pas la ramener, mais j'ai l'habitude de conseiller à mes élèves d'utiliser des noms de "variables parlants", ça aide à la relecture du code, quand on "inverse" les lignes et les colonnes d'un tableau à deux dimensions...

    i,i,k ça ne veut rien dire, sauf peut-être pour les matheux, cptLignes, cptColonnes, ... ça indique directement à quoi sert la variable (ce qu'elle contient)... et même si tu as la flemme il y a l'auto-completion qui "tape à ta place au clavier" ^^

    Sinon Sve@r a donné beaucoup d'infos... bonne continuation, je l'ai fait avec mes élèves, ils ont eu du mal mais c'est un programme super intéressant à faire pour apprendre à programmer en C ^^

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 677
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hurukan Voir le message
    Je ne vais pas la ramener, mais j'ai l'habitude de conseiller à mes élèves d'utiliser des noms de "variables parlants", ça aide à la relecture du code, quand on "inverse" les lignes et les colonnes d'un tableau à deux dimensions...
    D'accord avec toi mais uniquement pour les variables "importantes" (celles qui servent de support à l'algorithme). Pour les indices de boucle, un bon for (i=0; i < n; i++) c'est à la fois simple à écrire et à la fois ne portant pas vraiment à confusion. Bon évidemment quand on commence à écrire 4 ou 5 boucles imbriquées on commence alors à se trouver à court de lettres mais généralement celui qui a 5 boucles imbriquées c'est qu'il n'a pas assez bien découpé son code.

    Citation Envoyé par hurukan Voir le message
    je l'ai fait avec mes élèves, ils ont eu du mal mais c'est un programme super intéressant à faire pour apprendre à programmer en C ^^
    Oui, ça m'intéresse aussi. Faudrait que je me trouve le temps de le coder...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Candidat au Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bon voilà ... le Puissance 4 est terminé et fonctionne

    Je mets pas le code pour laisser ceux qui veulent s'y mettre faire par eux-mêmes

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 677
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bilen Voir le message
    Bon voilà ... le Puissance 4 est terminé et fonctionne
    Hum... vu la rapidité de la résolution je pense que ce n'est pas un jeu contre l'ordinateur..

    Citation Envoyé par Bilen Voir le message
    Je mets pas le code pour laisser ceux qui veulent s'y mettre faire par eux-mêmes
    Très louable. Mais inversement si tu mets le code on pourra t'aider à l'améliorer...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Candidat au Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Hum... vu la rapidité de la résolution je pense que ce n'est pas un jeu contre l'ordinateur..
    Exact. c'est Joueur 0 contre joueur 1. C'est déjà pas mal.


    Citation Envoyé par Sve@r Voir le message
    Très louable. Mais inversement si tu mets le code on pourra t'aider à l'améliorer...
    Je vais y réfléchir. Y a des choses à améliorer là-dedans.

  11. #11
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 621
    Points : 1 551
    Points
    1 551
    Par défaut
    Hello,

    J'ai écrit ce programme il y a un bon moment.

    J'y avais écrit une fonction canPlayerWin(....) qui permettait à l'ia de savoir si elle pouvait gagner en jouant à tel endroit, mais, tout aussi important, qui lui permettait de savoir si, en jouant à un endoit, l'adversaire pouvait gagner au tour suivant.

    Le principe était:
    • puis-je gagner maintenant ?
    • puisque je ne peux pas gagner, où vais-je jouer pour retourner le maximum de pion ?
    • si je joue à cet endroit-là, mon adversaire peut-il gagner au tour suivant ?

    Ça donnait de bons résultats.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  12. #12
    Candidat au Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    tu ne confondrais pas avec les jeux de Nim pour ce qui est du codage de la stratégie gagnante ? ou bien avec les jeux de Go ou Othello parce que ici il n'y pas de pions "à retourner" ...

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 677
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bilen Voir le message
    tu ne confondrais pas avec les jeux de Nim pour ce qui est du codage de la stratégie gagnante ? ou bien avec les jeux de Go ou Othello parce que ici il n'y pas de pions "à retourner" ...
    Ni à Go

    Citation Envoyé par edgarjacobs Voir le message
    puisque je ne peux pas gagner, où vais-je jouer pour retourner le maximum de pion ?
    Ça donnait de bons résultats.
    Certainement pas à Othello. Dans ce jeu, la stratégie "je retourne un maximum de pions" est la pire qui soit. Parce que plus on a de pions, plus on offre de possibilités à l'adversaire. Gagner à Othello ce n'est pas "avoir un maximum de pions durant la partie" mais "avoir un maximum de pions au dernier coup de la partie" et ça fait une très grosse nuance.
    Ainsi, pour gagner à Othello il faut essayer de retourner le moins de pions possibles durant la partie et aussi le moins possible en frontière du jeu pour arriver à bloquer l'adversaire à le faire jouer des coups mauvais (comme des cases "X" qui donnent le coin). Plus une petite connaissance de la notion de "parité" (si on ne sait pas trop quoi jouer on peut alors tenter de jouer dans une zone impaire ce qui amènera généralement à y jouer le dernier et à transformer les pions qui s'y trouvent en pions définitifs). Bref la stratégie à Othello n'est pas aussi simpe qu'il n'y parait...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 621
    Points : 1 551
    Points
    1 551
    Par défaut
    Oouups ! Pourtant je n'arrose pas mon café.

    Exact: ce n'est pas retourner des pions, il faut lire: pour aligner un maximum de jetons. Mea culpa.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  15. #15
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    En ce qui concerne le go il n'y a que très récemment qu'un programme est
    arrivé à battre le champion du monde ; c'est à mon avis l'un des jeux les plus
    difficile point de vue IA ,cent fois pire que le jeu d'échecs .

Discussions similaires

  1. [C] Programme de puissance
    Par CechD dans le forum Langages
    Réponses: 1
    Dernier message: 20/01/2016, 19h17
  2. Réponses: 1
    Dernier message: 20/08/2014, 22h36
  3. programme pour calculer les puissances
    Par zakariaforever dans le forum C#
    Réponses: 2
    Dernier message: 07/03/2010, 19h13
  4. Aide sur le programme Puissance 4
    Par A0080 dans le forum Langage
    Réponses: 13
    Dernier message: 01/06/2009, 20h12
  5. Réponses: 1
    Dernier message: 13/05/2007, 13h54

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