import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.MatteBorder; /** * Gabarit d'une interface usager pour un test de la classe Série.java * Pourrait servir d'inspiration pour le programme complet avec un tableau * * @author Guy Lapalme, 2014 * */ public class TestSerie extends JPanel implements KeyListener{ private static final int SIZE=100; // grandeur d'une cellule en pixel Vecteur vals; // valeurs à compresser private JLabel points; // affichage des points // couleurs des tuiles et du fond du jeu qui approxime celles du jeu original private Color fond = new Color(0xC3,0xB4,0xA3); private Color bordure = new Color(0xAE,0x9D,0x8D); private Color tuile = new Color(0x64,0x5A,0x51); private Color[] couleurs; private MatteBorder mBorder=new MatteBorder(5,5,5,5,bordure); private static Font fonte = new Font("Arial",Font.BOLD,40); // police pour les nombres // cellules du vecteur private JLabel[] places; // afficher le contenu des cellules private void repaintPlaces(){ for(int i=0;i<4;i++){ int tij=vals.getI(i); JLabel lij=places[i]; // afficher la couleur correspondante (log2(contenu)) lij.setBackground(tij==0?fond:couleurs[tij]); lij.setText(tij==0?"":(""+tij)); } } private void creerObjets(){ // initialisation des couleurs des fonds des tuiles couleurs = new Color[2049]; couleurs[0] = Color.BLACK; couleurs[2] = new Color(0xEB,0xDD,0xD0); couleurs[4] = new Color(0xEA,0xDA,0xB9); couleurs[8] = new Color(0xFA,0x9E,0x5E); couleurs[16] = new Color(0xFC,0x7B,0x44); couleurs[32] = new Color(0xFC,0x58,0x40); couleurs[64] = new Color(0xFB,0x2D,0x11); couleurs[128] = new Color(0xEB,0xC9,0x57); couleurs[256] = new Color(0xEB,0xC6,0x45); couleurs[512] = new Color(0xEC,0xC1,0x32); couleurs[1024] = new Color(0xED,0xBE,0x1F); couleurs[2048] = Color.MAGENTA ; //2048 je ne me suis jamais rendu à ce niveau pour connaitre la couleur... vals=new Vecteur(); places=new JLabel[4]; points=new JLabel(); points.setFont(fonte); points.setHorizontalAlignment(JLabel.CENTER); points.setText("0"); } private void disposerObjets(Container c){ c.add(BorderLayout.NORTH,points); c.add(BorderLayout.CENTER,this); setLayout(new GridLayout(1,4)); for(int i=0;i<4;i++){ JLabel l=new JLabel(); l.setFont(fonte); l.setForeground(tuile); l.setHorizontalAlignment(JLabel.CENTER); l.setBorder(mBorder); l.setOpaque(true); places[i]=l; this.add(l); } repaintPlaces(); } public void keyPressed(KeyEvent key) { // pratique pour vérifier qu'on a bien détecté la frappe de la clé // à mettre en commentaire quand tout semble fonctionner... System.out.println("keyPressed:"+key.getKeyCode()+":"+key.getKeyChar()); switch (key.getKeyCode()){ // ici on ne traite que la flèche à gauche case KeyEvent.VK_LEFT: vals.shiftLeft(); points.setText(""+vals.getPts()); repaintPlaces(); break; case KeyEvent.VK_RIGHT: // à compléter... } } @Override public void keyReleased(KeyEvent arg0) {} @Override public void keyTyped(KeyEvent arg0) {} private void ecouterObjets(JFrame frame){ frame.addKeyListener(this); } public static void main(String[] args) { JFrame f = new JFrame(); f.setTitle("Série 2048 en Java"); Container c=f.getContentPane(); c.setLayout(new BorderLayout()); TestSerie jeu = new TestSerie(); jeu.creerObjets(); jeu.disposerObjets(c); jeu.ecouterObjets(f); f.setSize(4*SIZE+10,SIZE+10+50); f.setLocation(100,100); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }