begin process at 2012 05 27 20:14:20
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Jeux

 > LE JEU DE LA VIE EN C++

LE JEU DE LA VIE EN C++


 Information sur la source

Note :
Aucune note
Catégorie :Jeux Niveau :Initié Date de création :22/02/2005 Vu :5 334

Auteur : mage08

Ecrire un message privé
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

Ce source simule le jeu de la vie. Il a été édité et tester sous linux ( fedora core 2 ). L'utilisteur indique le nombre de ligne et le nombre de colonnes du quadrillage. Pour exécuter le programme une fois compilé, il suffit de taper
    ./nom_programme nb_lignes nb_colonnes
Les phases se déroulent succesivement. Veuillez m excuser je n ai pas programmé de fonction d arret du programme, pour le stopper faite simplemen controle + c

Source

  • #include <iostream>
  • #include <vector>
  • #include <cmath>
  • #include <unistd.h>
  • #include <sstream>
  • using namespace std;
  • void vect (vector<bool> v)
  • {
  • for (int i=0;i<v.size();i++)
  • {
  • if (i == v.size()-1)
  • {
  • if (v[i]) cout << '*'<< endl;
  • else cout << ' ' << endl;
  • }
  • else
  • {
  • if (v[i]) cout << "*";
  • else cout << " ";
  • }
  • }
  • }
  • void affiche_vect(vector <vector <bool> > v)
  • {
  • for (int i=0;i<v.size();i++)
  • vect(v[i]);
  • }
  • int nbvie (unsigned int li, unsigned int co, vector <vector <bool> > &tab)
  • {
  • int nb=0;
  • int x=tab[0].size();
  • int y=tab.size();
  • for (int i=-1;i<=1;i++)
  • for (int j=-1;j<=1;j++)
  • if (tab[(li+i+y)%y][(co+j+x)%x]) ++nb;
  • if (tab[li][co]) --nb;
  • return (nb);
  • }
  • vector <vector <bool> > init (unsigned int li, unsigned int co)
  • {
  • srand(time(NULL));
  • vector <vector <bool> > tab (li, vector <bool> (co, false));
  • for (int i=0;i<li;i++)
  • for (int j=0;j<co;j++)
  • if (rand()%2==1) tab[i][j]=true;
  • return (tab);
  • }
  • bool evo (unsigned int li, unsigned int co, vector <vector <bool> > &tab)
  • {
  • bool etat = tab[li][co];
  • int vie = nbvie(li,co,tab);
  • if (!etat) {
  • if (vie == 3)
  • etat = true;
  • }
  • else {
  • if (!(vie == 3 || vie == 2))
  • etat=false;
  • }
  • return(etat);
  • }
  • vector<int> compte(vector <vector <bool> > tab)
  • {
  • vector<int> stock;
  • for(int i = 0; i < tab.size(); ++i)
  • for(int j = 0; j < tab[0].size(); ++j) {
  • bool a = evo(i, j, tab);
  • if(tab[i][j] != a) {
  • stock.push_back(i);
  • stock.push_back(j);
  • }
  • }
  • return stock;
  • }
  • int main (int argc, char *argv[])
  • {
  • system("clear");
  • int li,co;
  • istringstream iss(argv[1]);
  • iss >> li;
  • istringstream iss1(argv[2]);
  • iss1 >> co;
  • vector <vector <bool> > tab = init(li,co);
  • system("clear");
  • affiche_vect(tab);
  • int n = 1;
  • while (n)
  • {
  • usleep(100);
  • system("clear");
  • vector<int> coord_modif = compte(tab);
  • for(int a = 0; a < coord_modif.size(); a+=2)
  • {
  • int i = coord_modif[a];
  • int j = coord_modif[a + 1];
  • tab[i][j] = ! tab[i][j];
  • }
  • affiche_vect(tab);
  • cout << "phase " << n << endl;
  • ++n;
  • }
  • return (0);
  • }
#include <iostream>
#include <vector>
#include <cmath>
#include <unistd.h>
#include <sstream>
using namespace std;

void vect (vector<bool> v)
{
  for (int i=0;i<v.size();i++)
    {
      if (i == v.size()-1)
	{
          if (v[i]) cout << '*'<< endl; 
          else cout << ' ' << endl;
        }
      else 
      {
        if (v[i]) cout << "*";
        else cout << " ";
      }
    }
}

void affiche_vect(vector <vector <bool> > v)
{
  for (int i=0;i<v.size();i++)
    vect(v[i]);
}

int nbvie (unsigned int li, unsigned int co, vector <vector <bool> > &tab)
{
  int nb=0;
  int x=tab[0].size();
  int y=tab.size();
  for (int i=-1;i<=1;i++)
    for (int j=-1;j<=1;j++)
      if (tab[(li+i+y)%y][(co+j+x)%x]) ++nb;
	if (tab[li][co]) --nb;
  return (nb);
}

vector <vector <bool> > init (unsigned int li, unsigned int co)
{
  srand(time(NULL));
  vector <vector <bool> > tab (li, vector <bool> (co, false));
  for (int i=0;i<li;i++)
    for (int j=0;j<co;j++)
      if (rand()%2==1) tab[i][j]=true;
  return (tab);
}

bool evo (unsigned int li, unsigned int co, vector <vector <bool> > &tab)
{
  bool etat = tab[li][co];
  int vie = nbvie(li,co,tab);
  if (!etat) {
    if (vie == 3) 
      etat = true;
  }
  else {
    if (!(vie == 3 || vie == 2)) 
      etat=false;
  }
  return(etat);
}

vector<int> compte(vector <vector <bool> > tab)
{
  vector<int> stock;
  for(int i = 0; i < tab.size(); ++i)
    for(int j = 0; j < tab[0].size(); ++j) {
      bool a = evo(i, j, tab);
      if(tab[i][j] != a) {
	stock.push_back(i);
	stock.push_back(j);
      }
    }
   return stock;
}	

int main (int argc, char *argv[])
{
	system("clear");
	int li,co;
	istringstream iss(argv[1]);
	iss >> li;
	istringstream iss1(argv[2]);
	iss1 >> co;
	vector <vector <bool> > tab = init(li,co);
                system("clear");
	affiche_vect(tab);
	int n = 1;
	while (n)
	{
                                usleep(100);
		system("clear");  
		vector<int> coord_modif = compte(tab);
		for(int a = 0; a < coord_modif.size(); a+=2)
		  {
		  int i = coord_modif[a];
		  int j = coord_modif[a + 1];
		  tab[i][j] = ! tab[i][j];
		  }
		    
		affiche_vect(tab);
		cout << "phase " << n << endl;
		++n;
	}
	return (0);
}

 Conclusion

Voila si vous voyez des choses à améliorer ou si vous voulez des explications sur certains bout de code, vous pouvez me contacter


 Sources du même auteur

LE CARRÉ MAGIQUE

 Sources de la même categorie

Source avec Zip Source avec une capture JEU DES CARTES par eapaceinfo
PROGRAMME DE JEU DE MPT par KerizGarmm
Source avec Zip Source avec une capture JEUX SERPENT par antho974
Source avec Zip Source avec une capture PENDU EN SDL par Damsou91
Source avec Zip STATE MACHINE MODIFICATION MATH BUCKHAM par billybones79

Commentaires et avis

Commentaire de Hylvenir le 22/02/2005 23:57:31

Salut,
pour rendre la chose plus rigolote,
je me demande si tu pourrais écrire ça
en utilisant le moins possible de 'if' et de 'for' ?

Commentaire de dletozeun le 24/02/2005 13:21:07

C'est qoui la fonction usleep(100); ?

Je n'arrive pas a compiler justement a cause d'elle

Commentaire de pmbala le 25/02/2005 16:57:02

usleep(100),hum... il me semble que c'est pr instaurer une pause de 100 millisecondes ds le progr,mais je crois avec risque de me tromper que ça fonctionne avec des systemes 32 bits.Moi j'ai souvent utilisé les fonctions _Sleep ou encore delay,mais tt depend des compilateurs par exple _Sleep ne marche pas sous linux(redhat)... Essayes donc de changer usleep par l'une des fctions ci dessus et vois si ça va... @++

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,390 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales