This commit is contained in:
Simoes Lukas
2025-11-06 11:57:30 +01:00
parent eda3aaf143
commit 9b1257f3da
9 changed files with 177 additions and 23 deletions

Binary file not shown.

View File

@@ -0,0 +1,32 @@
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.util.ArrayDeque;
public class ControleurClavier implements KeyListener {
private ArrayDeque<String> touches;
public ControleurClavier() {
this.touches = new ArrayDeque<>();
}
@Override
public void keyPressed(KeyEvent e) {
if (this.touches.isEmpty() || !this.touches.getLast().equals(KeyEvent.getKeyText(e.getKeyCode()))) {
this.touches.addLast(KeyEvent.getKeyText(e.getKeyCode()));
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
public ArrayDeque<String> getTouches() {
return this.touches;
}
}

Binary file not shown.

View File

@@ -13,7 +13,8 @@ public class Fenetre extends JFrame {
for (int i = 0; i != 5; i++) {
coordSnake.addLast(new Point(i+5, 5));
}
this.add(new JGrilleDeJeu(coordSnake));
JGrilleDeJeu grille = new JGrilleDeJeu(this, coordSnake);
this.add(grille);
}

View File

@@ -3,39 +3,39 @@ 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<Point> coordSnake;
private Point posPomme;
private ControleurClavier controleur;
private Fenetre fenetre;
private String directionActuelle;
private Timer timer;
private int intervalleTimer;
public JGrilleDeJeu(ArrayDeque<Point> coordSnake) {
public JGrilleDeJeu(Fenetre fenetre, ArrayDeque<Point> coordSnake) {
this.fenetre = fenetre;
this.grille = new char[TAILLE_GRILLE][TAILLE_GRILLE];
this.coordSnake = coordSnake;
for (int i = 0; i != TAILLE_GRILLE; i++) {
for (int j = 0; j != TAILLE_GRILLE; j++) {
this.grille[i][j] = 'g';
}
}
for (Point point : coordSnake) {
this.grille[point.x][point.y] = 'o';
}
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';
Timer timer = new Timer();
while (true) {
timer.wait(1000L);
this.avancerSnake();
}
this.timer = new Timer();
timer.scheduleAtFixedRate(new TacheTimer(this), 0, intervalleTimer);
}
@Override
@@ -61,17 +61,114 @@ public class JGrilleDeJeu extends JComponent {
}
secondPinceau.fillRect(
this.getWidth()/TAILLE_GRILLE*i,
this.getHeight()/TAILLE_GRILLE*j,
this.getWidth()/TAILLE_GRILLE,
this.getHeight()/TAILLE_GRILLE
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();
}
}

View File

@@ -0,0 +1,8 @@
JGrilleDeJeu.class TacheTimer.class Fenetre.class ControleurClavier.class Main.class : JGrilleDeJeu.java TacheTimer.java Fenetre.java ControleurClavier.java Main.java
javac *.java
run: Main.class
java Main
clean:
rm *.class

Binary file not shown.

View File

@@ -0,0 +1,16 @@
import java.util.Timer;
import java.util.TimerTask;
public class TacheTimer extends TimerTask {
private JGrilleDeJeu grille;
public TacheTimer(JGrilleDeJeu grille) {
this.grille = grille;
}
@Override
public void run() {
this.grille.avancerSnake();
}
}