Projet IMA3 P6, 2016/2017, TD1 : Différence entre versions

De Wiki de Projets IMA
(Séance 3)
(Partie électronique)
 
(4 révisions intermédiaires par 3 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
= Projet IMA3-SC 2016/2017 : <TITRE> = Jeux de Morpions
+
= Projet IMA3-SC 2016/2017 : Jeu du Morpion =
 
 
= Projet IMA3-SC 2016/2017 : Jeux du Morpion =
 
 
== Cahier des charges ==
 
== Cahier des charges ==
  
Ligne 133 : Ligne 131 :
 
dont cette fonction de test:
 
dont cette fonction de test:
  
void color_test()
+
void color_test()
{
+
{
 
   
 
   
 
   color_buffer[0]=BLACK;
 
   color_buffer[0]=BLACK;
Ligne 154 : Ligne 152 :
 
Arduino:  
 
Arduino:  
  
-Programmation de la matrice et pour l'instant l'initialisation éteint toutes les leds.
+
*Programmation de la matrice et pour l'instant l'initialisation éteint toutes les leds.
  
//définies les adresses des couleurs
+
//définies les adresses des couleurs
 +
 +
#define BLACK  0x00
 +
#define RED    0xE0
 +
#define GREEN  0x1C
 +
#define BLUE    0x03
 +
#define YELLOW  RED|GREEN
 +
#define ORANGE  0xFC
 +
#define MAGENTA RED|BLUE
 +
#define TEAL    BLUE|GREEN
 +
#define WHITE  (RED|GREEN|BLUE)-0xA0
 +
 +
//définis les ports
 +
 +
#define SLAVESELECT 10
 +
#define DATAOUT    11
 +
#define DATAIN      12
 +
#define SPICLOCK    13
 +
 +
const int num_matrix = 1;
 +
char color_buffer[64*num_matrix];
 +
char spi_transfer(volatile char data){
 +
  SPDR = data;                   
 +
  while (!(SPSR & (1<<SPIF)))
 +
  {   
 +
  };
 +
  return SPDR;         
 +
}
  
#define BLACK  0x00
+
  //Pour éteindre toutes les leds
#define RED    0xE0
 
#define GREEN  0x1C
 
#define BLUE    0x03
 
#define YELLOW RED|GREEN
 
#define ORANGE  0xFC
 
#define MAGENTA RED|BLUE
 
#define TEAL    BLUE|GREEN
 
#define WHITE  (RED|GREEN|BLUE)-0xA0
 
  
//définis les ports
+
char blank[]={
 +
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 +
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 +
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 +
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 +
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 +
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 +
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
 +
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK
 +
};
  
#define SLAVESELECT 10
+
void set_matrix()
#define DATAOUT    11
+
{
#define DATAIN     12
+
  digitalWrite(SLAVESELECT, LOW);
#define SPICLOCK   13
+
  spi_transfer(0x25);
 +
  spi_transfer(0x02);
 +
  digitalWrite(SLAVESELECT, HIGH);
 +
}
 +
 +
int p = 0;
 +
int xMAX = 8;
 +
int yMAX = 8;
 +
 +
//Fonction qui réinitialise le plateau de jeux
 +
 +
void clear_buffer()
 +
{
 +
  for(int y=0; y<yMAX; y++)
 +
  {
 +
    for(int i=num_matrix; i>0; i--)
 +
    {
 +
      for(int x=0; x<xMAX; x++)
 +
      {
 +
        p = (yMAX*y) + (x + (i-1)*(xMAX*yMAX));
 +
        color_buffer[p] = blank[x];
 +
      }
 +
    }
 +
  }
 +
  matrix_write();
 +
  delay(10);
 +
}
 +
 +
//Fonction d'activation d'écriture ou lecture de la matrice
 +
 +
void matrix_write()
 +
{
 +
  digitalWrite(SLAVESELECT, LOW); //Active la matrice RGB
 +
  spi_transfer(0x26); //command char to reset frame index
 +
  digitalWrite(SLAVESELECT, HIGH); //Desactive la matrice RGB
 +
  digitalWrite(SLAVESELECT, LOW); //Active la matrice RGB
 +
  delayMicroseconds(500);
 +
  //Envois la couleur à la matrice
 +
 
 +
  for(int LED=0; LED<(64*num_matrix); LED++){
 +
     spi_transfer(color_buffer[LED]);//Envois le buffer à la matrice
 +
  }
 +
  delayMicroseconds(500); //laisse un temps
 +
   digitalWrite(SLAVESELECT, HIGH); //Désactive la Matrix RGB
 +
}
  
  
const int num_matrix = 1;
+
*Programmation de l'affichage du plateau de jeux ainsi que les pions. Ayant 2 leds différentes pour les afficher j'ai préféré allumer les deux d'une couleur différente pour une meilleure visibilité
char color_buffer[64*num_matrix];
 
char spi_transfer(volatile char data)
 
{
 
  SPDR = data;                   
 
  while (!(SPSR & (1<<SPIF)))
 
  {   
 
  };
 
  return SPDR;         
 
}
 
  
//Pour éteindre toutes les leds
+
//Initialisation du plateau de jeux du Morpion
 
+
char blank[]={
+
void Morpion_panel()
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
+
{
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
+
  int i;
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
+
    for(i=0;i<=7;i++)
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
+
    {
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
+
        color_buffer[2+8*i]=BLUE;
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
+
        color_buffer[5+8*i]=BLUE;
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
+
        color_buffer[16+i]=BLUE;
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK
+
        color_buffer[40+i]=BLUE;
};
+
    }
 
+
  matrix_write();
void set_matrix()
+
  delay(100) ;
{
+
}
  digitalWrite(SLAVESELECT, LOW);
 
  spi_transfer(0x25);
 
  spi_transfer(0x02);
 
  digitalWrite(SLAVESELECT, HIGH);
 
}
 
 
 
int p = 0;
 
int xMAX = 8;
 
int yMAX = 8;
 
 
 
//Fonction qui réinitialise le plateau de jeux
 
 
 
void clear_buffer()
 
{
 
  for(int y=0; y<yMAX; y++)
 
  {
 
    for(int i=num_matrix; i>0; i--)
 
    {
 
      for(int x=0; x<xMAX; x++)
 
      {
 
        p = (yMAX*y) + (x + (i-1)*(xMAX*yMAX));
 
        color_buffer[p] = blank[x];
 
      }
 
    }
 
  }
 
  matrix_write();
 
  delay(10);
 
}
 
 
 
//Fonction d'activation d'écriture ou lecture de la matrice
 
 
 
void matrix_write()
 
{
 
  digitalWrite(SLAVESELECT, LOW); //Active la matrice RGB
 
  spi_transfer(0x26); //command char to reset frame index
 
  digitalWrite(SLAVESELECT, HIGH); //Desactive la matrice RGB
 
  digitalWrite(SLAVESELECT, LOW); //Active la matrice RGB
 
  delayMicroseconds(500);
 
  //Envois la couleur à la matrice
 
 
 
 
 
  for(int LED=0; LED<(64*num_matrix); LED++){
 
    spi_transfer(color_buffer[LED]);//Envois le buffer à la matrice
 
  }
 
  delayMicroseconds(500); //laisse un temps
 
  digitalWrite(SLAVESELECT, HIGH); //Désactive la Matrix RGB
 
}
 
 
 
 
 
-Programmation de l'affichage du plateau de jeux ainsi que les pions. Ayant 2 leds différentes pour les afficher j'ai préféré allumer les deux d'une couleur différente pour une meilleure visibilité
 
 
 
//Initialisation du plateau de jeux du Morpion
 
 
 
void Morpion_panel()
 
{
 
  int i;
 
    for(i=0;i<=7;i++)
 
    {
 
        color_buffer[2+8*i]=BLUE;
 
        color_buffer[5+8*i]=BLUE;
 
        color_buffer[16+i]=BLUE;
 
        color_buffer[40+i]=BLUE;
 
    }
 
   
 
  matrix_write();
 
  delay(100) ;
 
}
 
 
 
 
 
// Fonction du placement des pions du joueur 2
 
 
 
void Pion_J2(int placement)
 
{
 
int i;
 
int pion=0;
 
if (placement>=6)
 
{pion=6}
 
else
 
{
 
if (3<=placement<=6)
 
{pion=3}
 
}
 
 
 
 
 
 
 
for(i=0;i<=1;i++)
 
{
 
color_buffer[pion+placement*24+i*8]= RED;
 
color_buffer[pion+placement*24+1+i*8]= RED;
 
}
 
 
 
 
 
 
 
matrix_write();
 
delay(100) ;
 
}
 
  
 
== Séance 3 supplémentaire ==
 
== Séance 3 supplémentaire ==

Version actuelle datée du 20 mars 2018 à 11:48

Projet IMA3-SC 2016/2017 : Jeu du Morpion

Cahier des charges

Description du système

Pour mon projet, j'ai décidé de réaliser un jeu de morpion commandé par ordinateur, et affiché par un système de leds (2 matrice 3x3 de couleur différentes). Les joueurs pourront lancer une partie et en profiter jusqu’à ce que l’un d’eux gagne ou abandonne. Lorsqu’une partie se termine les statistiques de celles-ci seront affichés.

Ordinateur et interface de commande

L’ordinateur jouera le rôle d’interface, permettant aux utilisateurs de lancer une partie, de jouer et d’arrêter la partie quand ils le souhaitent. Plusieurs boutons seront disponibles sur l’interface : un bouton pour lancer une nouvelle partie, un pour déclarer forfait (affiché uniquement pendant la partie). Si un joueur réussi à aligne 3 signes un message de félicitation sera visible sur l’écran. Lorsqu’une partie se termine un tableau donnant les statistiques des deux joueurs s’affichera.

Règle du jeux

Les règles du morpions sont simples : -Le jeux contient 9 cases -Il y a 2 équipes (par exemple l'un choisis la croix, l'autre le rond) -Pour gagner aligner 3 même signe de votre équipe -Fin de la partie si un des joueurs cliquent sur "abandonner".

Le matériel

Ici nous utiliserons une matrice 8*8 connecter à un Arduino. Les leds seront groupés par 2 pour une case (pour 2 les signes différents),avec le câblage requis ainsi qu'une Raspberry pi pour faire le lien machine matrice. Le plateau pourra être fait au Fab'Lab de tel manière à ce que les cases soient bien distinctes. Un plateau de jeu de morpions contient 9 cases.

Séance 1

Partie électronique

Partie informatique

Début d'écriture du programme du jeux

En début de séance 2 on a:


Le joueur choisis un nombres pour pseudo et la partie commence:

__Bienvenue sur Morpion.led!__

choisissez votre numéro de joueur (1 ou 2):

Joueur numero: 1

Joueur numero : 2


L'affichage qui se fait parfaitement sur le terminal avec pour chaque case sa coordonnée.

               |               |       X       | 
       O       |       O       |               | 
               |       X       |               | 


Manque: La condition gagnante et ne pas pouvoir rejouer sur la même case.

Séance 2

Partie électronique

Partie informatique

Tout le programme en C fonctionne, le jeux se joue à 2. Pour la partie électronique les placements se font par coordonnées des cases avec (0;0) pour la première en haut à gauche. Le programme prend en compte toutes les conditions gagnantes et si un joueur veut replacer son pion sur une case déjà joué il lui renvoit un message d'erreur et lui demande de jouer ailleurs. Il y a aussi la possibilité de relancer une partie.

Voici une partie de l'affichage d'une fin de partie !


               == TOUR 2 == 
               Au joueur 1! 

00


       O       |       O       |               |                Ici les cases ont pour coordonnées (0;0)  | (0;1)  |  (0;2)
               |               |               | 
       X       |               |               | 


               Au joueur 2! 

22


       O       |       O       |               |              
               |               |               | 
       X       |               |       X       | 


                == TOUR 3 == 
               Au joueur 1! 

22


       O       |       O       |               | 
               |               |               | 
       X       |               |       X       | 
        Veuillez jouer sur une case libre!


       O       |       O       |       O       | 
               |               |               | 
       X       |               |       X       | 


        La partie est finie!
        Pour refaire une nouvelle partie taper 1!

Séance 3

Partie électronique

Arduino: Dans cette séance le câblage de l'Arduino avec la matrice a été effectué. Ainsi j'ai pu testé toutes les possibilités de cette matrice en y affichant diverse couleurs et formes grâce à la partie informatique. dont cette fonction de test:

void color_test()
{

 color_buffer[0]=BLACK;
 color_buffer[1]=RED;
 color_buffer[2]=GREEN;
 color_buffer[5]=BLUE;
 color_buffer[4]=YELLOW;
 color_buffer[5]=MAGENTA;
 color_buffer[6]=TEAL;
 color_buffer[7]=WHITE;

 matrix_write();
 delay(100) ;

}

Qui m'a ainsi affiché:

Partie informatique

Arduino:

  • Programmation de la matrice et pour l'instant l'initialisation éteint toutes les leds.
//définies les adresses des couleurs

#define BLACK   0x00
#define RED     0xE0
#define GREEN   0x1C
#define BLUE    0x03
#define YELLOW  RED|GREEN
#define ORANGE  0xFC
#define MAGENTA RED|BLUE
#define TEAL    BLUE|GREEN
#define WHITE   (RED|GREEN|BLUE)-0xA0

//définis les ports

#define SLAVESELECT 10
#define DATAOUT     11
#define DATAIN      12
#define SPICLOCK    13

const int num_matrix = 1;
char color_buffer[64*num_matrix];
char spi_transfer(volatile char data){
  SPDR = data;                    
  while (!(SPSR & (1<<SPIF)))
  {     
  };
  return SPDR;           
}
//Pour éteindre toutes les leds
char blank[]={
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK
};
void set_matrix()
{
  digitalWrite(SLAVESELECT, LOW);
  spi_transfer(0x25);
  spi_transfer(0x02);
  digitalWrite(SLAVESELECT, HIGH);
}

int p = 0;
int xMAX = 8;
int yMAX = 8;

//Fonction qui réinitialise le plateau de jeux

void clear_buffer()
{
  for(int y=0; y<yMAX; y++)
  {
    for(int i=num_matrix; i>0; i--)
    {
      for(int x=0; x<xMAX; x++)
      {
        p = (yMAX*y) + (x + (i-1)*(xMAX*yMAX));
        color_buffer[p] = blank[x];
      }
    }
  }
  matrix_write();
  delay(10);
}

//Fonction d'activation d'écriture ou lecture de la matrice

void matrix_write()
{
  digitalWrite(SLAVESELECT, LOW); //Active la matrice RGB
  spi_transfer(0x26); //command char to reset frame index
  digitalWrite(SLAVESELECT, HIGH); //Desactive la matrice RGB
  digitalWrite(SLAVESELECT, LOW); //Active la matrice RGB
  delayMicroseconds(500);
  //Envois la couleur à la matrice
  
  for(int LED=0; LED<(64*num_matrix); LED++){
    spi_transfer(color_buffer[LED]);//Envois le buffer à la matrice
  }
  delayMicroseconds(500); //laisse un temps
  digitalWrite(SLAVESELECT, HIGH); //Désactive la Matrix RGB
}


  • Programmation de l'affichage du plateau de jeux ainsi que les pions. Ayant 2 leds différentes pour les afficher j'ai préféré allumer les deux d'une couleur différente pour une meilleure visibilité
//Initialisation du plateau de jeux du Morpion

void Morpion_panel()
{
  int i;
    for(i=0;i<=7;i++)
    {
        color_buffer[2+8*i]=BLUE;
        color_buffer[5+8*i]=BLUE;
        color_buffer[16+i]=BLUE;
        color_buffer[40+i]=BLUE;
    }  
  matrix_write();
  delay(100) ;
}

Séance 3 supplémentaire

Partie électronique

Partie informatique

Arduino:

-Programmation du placement des pions en fonction du joueur et des coordonnées du pion à placer à partir du programme en c (à tester)

Conclusion