import java.awt.*; import javax.swing.*; import java.util.Random; import java.util.ArrayDeque; import java.util.Timer; import java.util.TimerTask; public class JGrilleDeJeu extends JComponent { private static final int TAILLE_GRILLE = 25; private char[][] grille; private ArrayDeque coordSnake; private Point posPomme; private ControleurClavier controleur; private Fenetre fenetre; private String directionActuelle; private Timer timer; private int intervalleTimer; public JGrilleDeJeu(Fenetre fenetre, ArrayDeque coordSnake) { this.fenetre = fenetre; this.grille = new char[TAILLE_GRILLE][TAILLE_GRILLE]; this.coordSnake = coordSnake; this.controleur = new ControleurClavier(); this.fenetre.addKeyListener(controleur); this.directionActuelle = "Right"; this.intervalleTimer = 500; Random r = new Random(); int coordXPomme = Math.abs(r.nextInt() % TAILLE_GRILLE); int coordYPomme = Math.abs(r.nextInt() % TAILLE_GRILLE); this.posPomme = new Point(coordXPomme, coordYPomme); this.grille[coordXPomme][coordYPomme] = 'r'; this.timer = new Timer(); timer.scheduleAtFixedRate(new TacheTimer(this), 0, intervalleTimer); } @Override public void paintComponent(Graphics pinceau) { Graphics secondPinceau = pinceau.create(); if (this.isOpaque()) { secondPinceau.setColor(this.getBackground()); secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); } for (int i = 0; i != TAILLE_GRILLE; i++) { for (int j = 0; j != TAILLE_GRILLE; j++) { switch (grille[i][j]) { case 'g': secondPinceau.setColor(Color.GREEN); break; case 'r': secondPinceau.setColor(Color.RED); break; case 'o': secondPinceau.setColor(Color.ORANGE); } secondPinceau.fillRect( this.getWidth()/TAILLE_GRILLE*i+1, this.getHeight()/TAILLE_GRILLE*j+1, this.getWidth()/TAILLE_GRILLE-2, this.getHeight()/TAILLE_GRILLE-2 ); } } } public void avancerSnake() { this.coordSnake.removeFirst(); if (!this.controleur.getTouches().isEmpty()) { String toucheAModifier = this.controleur.getTouches().removeFirst(); switch (this.directionActuelle) { case "Right": if (!toucheAModifier.equals("Left")) { this.directionActuelle = toucheAModifier; } break; case "Left": if (!toucheAModifier.equals("Right")) { this.directionActuelle = toucheAModifier; } break; case "Up": if (!toucheAModifier.equals("Down")) { this.directionActuelle = toucheAModifier; } break; case "Down": if (!toucheAModifier.equals("Up")) { this.directionActuelle = toucheAModifier; } break; } } switch (this.directionActuelle) { case "Right": this.coordSnake.addLast(new Point(this.coordSnake.getLast().x+1, this.coordSnake.getLast().y)); break; case "Left": this.coordSnake.addLast(new Point(this.coordSnake.getLast().x-1, this.coordSnake.getLast().y)); break; case "Up": this.coordSnake.addLast(new Point(this.coordSnake.getLast().x, this.coordSnake.getLast().y-1)); break; case "Down": this.coordSnake.addLast(new Point(this.coordSnake.getLast().x, this.coordSnake.getLast().y+1)); break; } for (int i = 0; i != TAILLE_GRILLE; i++) { for (int j = 0; j != TAILLE_GRILLE; j++) { this.grille[i][j] = 'g'; } } if (this.coordSnake.getLast().equals(this.posPomme)) { Random r = new Random(); int coordXPomme = Math.abs(r.nextInt() % TAILLE_GRILLE); int coordYPomme = Math.abs(r.nextInt() % TAILLE_GRILLE); this.posPomme = new Point(coordXPomme, coordYPomme); Point coordQueue = this.coordSnake.removeFirst(); Point coordAvantQueue = this.coordSnake.getFirst(); Point aAjouter; if (coordAvantQueue.equals(new Point(coordQueue.x+1, coordQueue.y))) { aAjouter = new Point(coordQueue.x-1, coordQueue.y); } else if (coordAvantQueue.equals(new Point(coordQueue.x-1, coordQueue.y))) { aAjouter = new Point(coordQueue.x+1, coordQueue.y); } else if (coordAvantQueue.equals(new Point(coordQueue.x, coordQueue.y+1))) { aAjouter = new Point(coordQueue.x, coordQueue.y-1); } else { aAjouter = new Point(coordQueue.x, coordQueue.y+1); } this.coordSnake.addFirst(aAjouter); this.coordSnake.addFirst(coordQueue); if (this.intervalleTimer != 200) { this.intervalleTimer -= 50; this.timer.cancel(); this.timer = new Timer(); this.timer.scheduleAtFixedRate(new TacheTimer(this), 0, this.intervalleTimer); } } try { int compteur = this.coordSnake.size(); for (Point point : this.coordSnake) { if ((point.equals(this.coordSnake.getLast()) && compteur > 1)) { System.exit(0); } this.grille[point.x][point.y] = 'o'; compteur--; } } catch (ArrayIndexOutOfBoundsException e) { System.exit(0); } this.grille[posPomme.x][posPomme.y] = 'r'; this.repaint(); } }