Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction "pour alterner"

4 février 2010 à 21:15:05

Bonjour bonjour! voilà je suis actuellement en train de suivre les (super ) cours de programmation C de ce site, et j'en suis au TP: plus ou moins votre premier jeux..et pour le complexifier un peu, j'ai fait un menu pour choisir le nombre de joueurs etc... mais voilà j'aimerais trouver une fonction qui permette de dire en gros "les joueurs jouent chacun leurs tours"
par ex: -joueur 1 a vous de jouer
-joueur 2 a vous
-joueur 1 a vous etc...
En gros une fonction qui permette d'alterner entre les joueurs! Si quelqu'un pouvait m'éclairer de ses lanternes...Merci d'avance de vos réponses!
  • Partager sur Facebook
  • Partager sur Twitter
4 février 2010 à 22:27:17

Bonjour,
voici un petit programme qui doit faire ce que tu demandes.
#include <stdio.h>

int turn (void)
{
    static int t = 2;

    return t = (t == 1)? 2 : 1;
}

int
main (void)
{
    int i = 0;

    do
    {
        printf ("C'est le tour du joueur %d\n", turn ());
    } while (++i != 10);

    return 0;
}

$ ./test 
C'est le tour du joueur 1
C'est le tour du joueur 2
C'est le tour du joueur 1
C'est le tour du joueur 2
C'est le tour du joueur 1
C'est le tour du joueur 2
C'est le tour du joueur 1
C'est le tour du joueur 2
C'est le tour du joueur 1
C'est le tour du joueur 2

voilà voilà.
  • Partager sur Facebook
  • Partager sur Twitter
4 février 2010 à 22:34:59

c'est parfait!!!! merci beaucoup! :)
  • Partager sur Facebook
  • Partager sur Twitter
4 février 2010 à 23:18:08

int turn (void)
{
    static int t = 1;
    t ^= 1;
    return t+1;
}


Je suis fan du XOR. Pour l'alternance c'est top.

Sinon il y a aussi
int turn (void)
{
    static int t = 1;
    t++;
    return (t%2)+1;
}

par contre ca joue sur le dépassement de capacité, qui est un comportement qui n'est peut etre pas spécifié en C, je ne me souviens plus...
  • Partager sur Facebook
  • Partager sur Twitter
64kB de mémoire, c'est tout ce dont j'ai besoin
4 février 2010 à 23:28:53

Citation : Nathalya

Sinon il y a aussi

int turn (void)
{
    static int t = 1;
    t++;
    return (t%2)+1;
}


par contre ca joue sur le dépassement de capacité, qui est un comportement qui n'est peut etre pas spécifié en C, je ne me souviens plus...


C'est bon, ton int fait 32 bits (? du moins plus que 2 bits) tu ne fais pas de dépassement de capacité ;)
  • Partager sur Facebook
  • Partager sur Twitter
5 février 2010 à 0:12:11

Citation : Pouet_forever

C'est bon, ton int fait 32 bits (? du moins plus que 2 bits) tu ne fais pas de dépassement de capacité ;)


while(1)
   turn();

Maintenant oui.
  • Partager sur Facebook
  • Partager sur Twitter
5 février 2010 à 0:29:25

int turn (void)
{
    static int t = 1;
    t ^= 1;
    return t+1;
}


ou comment rendre un truc très simple à la base, super chiant à lire au final.
  • Partager sur Facebook
  • Partager sur Twitter
5 février 2010 à 12:47:31

Merci beaucoup pour vos réponses! J'ai une petite question pour vous programmeur apparemment confirmé! Je suis en train d'apprendre le C pour ensuite basculer sur l'objective C car j'ai une sacré idée d'application iphone qui me trotte dans la tête....enfin vous avez mis beaucoup de temps pour ingurgiter tout le C? car je ne sais pas, j'ai l'impression que je n'arriverais jamais à comprendre tout...et ça me déprime.
  • Partager sur Facebook
  • Partager sur Twitter
5 février 2010 à 14:25:19

Citation : Pouet_forever

C'est bon, ton int fait 32 bits (? du moins plus que 2 bits) tu ne fais pas de dépassement de capacité


Bah au bout d'un moment, à cause de l'incrémentation, si :] Et un int peut faire 16 bits ou plus, sa taille n'est pas définie.

Citation : Shahor

ou comment rendre un truc très simple à la base, super chiant à lire au final.


Mais c'est powerful, on gagne une comparaison §
  • Partager sur Facebook
  • Partager sur Twitter
5 février 2010 à 14:57:26

Citation : Yno

Citation : Shahor

ou comment rendre un truc très simple à la base, super chiant à lire au final.


Mais c'est powerful, on gagne une comparaison §


Ouaip, je n'avais pas du tout trouvé cette intervention inutile. moi, je ne pense jamais a me servir de ces trucs, une lacune a combler dans un avenir proche sans doute.
bon, j'ai fait quelque tests pour illustrer un peu tout ça, mais je ne sais pas si ils sont super fiables, enfin les voici:
/*

resultats des tests avec gcc -o test test.c -O0

turn1: 0m3.481s, 0m3.714s, 0m3.427s
turn2: 0m4.470s, 0m4.403s, 0m4.445s

*/

int turn1 (void)
{
    static int t = 1;

    t ^= 1;

    return t+1;
}

int turn2 (void)
{
    static int t = 2;

    return t = (t == 1)? 2 : 1;
}

int
main (void)
{
    int i = 0;

    while (i++ != 999999999)
    {
        turn2(); /* turn1(); */
    }
}

ça montre bien que la méthode du ou exclusif est plus rapide
  • Partager sur Facebook
  • Partager sur Twitter
5 février 2010 à 15:12:13

Après, je dois bien admettre que ma solution est plutot bonne en embarqué sur de petits systèmes, parceque les gens ont l'habitude des opérateurs bit à bit et que le gain de temps peut etre important. Sur un pc, c'est discutable.
  • Partager sur Facebook
  • Partager sur Twitter
64kB de mémoire, c'est tout ce dont j'ai besoin
5 février 2010 à 16:24:49

Citation : Nathalya

Sur un pc, c'est discutable.


On est d'accord :]
  • Partager sur Facebook
  • Partager sur Twitter
5 février 2010 à 18:55:07

Oui j'avais pas vu le problème du '+1' ^^
  • Partager sur Facebook
  • Partager sur Twitter
23 février 2022 à 21:33:00

tu fais une déclaration et une initialisation 
type joueur = 1;
après là où tu veux que ton joueur 2 prend le relais 
tu fais 
joueur = (joueur%2)+1;
loin dans ta boucle et le tour est joué
  • Partager sur Facebook
  • Partager sur Twitter
23 février 2022 à 23:21:11

@allouche42 Bonsoir, merci de ne pas déterrer d'ancien sujet, celui-ci date de 2010.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter