From 9b1257f3da9d142cb631a36b8d42f65ba76ef7ec Mon Sep 17 00:00:00 2001 From: Simoes Lukas Date: Thu, 6 Nov 2025 11:57:30 +0100 Subject: [PATCH] snake --- .../TP05/04_Serpent/ControleurClavier.class | Bin 0 -> 1098 bytes DEV3.2/TP05/04_Serpent/ControleurClavier.java | 32 ++++ DEV3.2/TP05/04_Serpent/Fenetre.class | Bin 756 -> 772 bytes DEV3.2/TP05/04_Serpent/Fenetre.java | 3 +- DEV3.2/TP05/04_Serpent/JGrilleDeJeu.class | Bin 1769 -> 4234 bytes DEV3.2/TP05/04_Serpent/JGrilleDeJeu.java | 141 +++++++++++++++--- DEV3.2/TP05/04_Serpent/Makefile | 8 + DEV3.2/TP05/04_Serpent/TacheTimer.class | Bin 0 -> 373 bytes DEV3.2/TP05/04_Serpent/TacheTimer.java | 16 ++ 9 files changed, 177 insertions(+), 23 deletions(-) create mode 100644 DEV3.2/TP05/04_Serpent/ControleurClavier.class create mode 100644 DEV3.2/TP05/04_Serpent/ControleurClavier.java create mode 100644 DEV3.2/TP05/04_Serpent/Makefile create mode 100644 DEV3.2/TP05/04_Serpent/TacheTimer.class create mode 100644 DEV3.2/TP05/04_Serpent/TacheTimer.java diff --git a/DEV3.2/TP05/04_Serpent/ControleurClavier.class b/DEV3.2/TP05/04_Serpent/ControleurClavier.class new file mode 100644 index 0000000000000000000000000000000000000000..8d180ef412fbaafee020b688b0c5d5213a6dbbca GIT binary patch literal 1098 zcmX^0Z`VEs1_pBm8!iT321RxTB`yXg21QN=9tLF)O9e!zvNNc0F{m?WfCx=426hH5 zkgzs8gAO}`E<1xBBLjO$era+>YB3{&m`_$>S)zVvNoJ0|V^L9JrAumIX{t3N17~n% zdR}5lX;CU8gBDgrHW1OA#JqI<;F6-uymV_jYeoh(o6Nk-5<5l)W)00SMg|t={FGEi z27aH+yi~u^+@#c^ki?{%R7M7_?9|GDqSWHz)D%Vr84ZYGiRC5wsb#5oCHmf}m98L$ zHOLU&;F84TY~REJs9x^u)XJdLoYX|HW{&LC%8<$ekU3oGsU;yWze#9lLQKWo&Mz%WPIb!!Ib6&+Kd+=HKPR=c$T=smEHkx84-|$x48jZ|j0_?mHhOsSFz_=7 z@G$5z81OI{G8i#32!K@~1sywsF%N?YgDDS#8G|_wg9U>n4}%qhH6w!{hHWUi{gbj% zlS>#Gq`(HE1fNf4aY<@kY7rv?duFj~Zb3;UI8LG%8Q9ZPOMDWGOBfkMVBr9E3dAsL zMh0%nS?+oD3`s zTnzjS+zgBi;tUc{-BAoo3``(Xw6-v?Y-3=Z#UKS?u^nJw*WSj!v4eqg8w1xY20@T8 zT!0&7IunxV{0xc=0u1^LLJX1&3=Av`Oo|}aOTp~{iGu851Zjjgiw*2-aRx>PX~N2+ o85kL47-Sikz 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 getTouches() { + return this.touches; + } +} \ No newline at end of file diff --git a/DEV3.2/TP05/04_Serpent/Fenetre.class b/DEV3.2/TP05/04_Serpent/Fenetre.class index bc7ffcd7f146ba2d60ee102080df8b4f27dc44cb..6796bdf919b8d06f4ff502a9033b8d65fd2b0bf3 100644 GIT binary patch delta 83 zcmeyu+QPQs0wcGQhL2lnUTR5Es`cbcj47PE7+4vY85kI1C)+dm$nIv~i`3HI&cN@h orL&DeAbcYO0|OI-C<6n75d+WUrA(UaVGM!{F$}_!FES|u0I_uwr2qf` delta 67 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 coordSnake; + private Point posPomme; + private ControleurClavier controleur; + private Fenetre fenetre; + private String directionActuelle; + private Timer timer; + private int intervalleTimer; - public JGrilleDeJeu(ArrayDeque coordSnake) { + public JGrilleDeJeu(Fenetre fenetre, ArrayDeque 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(); - this.coordSnake.addLast(new Point(this.coordSnake.getLast().x+1, this.coordSnake.getLast().y)); + 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(); } } \ No newline at end of file diff --git a/DEV3.2/TP05/04_Serpent/Makefile b/DEV3.2/TP05/04_Serpent/Makefile new file mode 100644 index 0000000..c4187a5 --- /dev/null +++ b/DEV3.2/TP05/04_Serpent/Makefile @@ -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 \ No newline at end of file diff --git a/DEV3.2/TP05/04_Serpent/TacheTimer.class b/DEV3.2/TP05/04_Serpent/TacheTimer.class new file mode 100644 index 0000000000000000000000000000000000000000..17eb25dbc1bdbabef6f656ee16a43f089434dee1 GIT binary patch literal 373 zcmX^0Z`VEs1_pBm2`&a!1_4e676w5s1|bGvb_Nl422n-^w)CRRoSalf20kAzcQDf> z)ho5snvsFcCNnRy#Ey|cPyGFE3qt*hk=8EmxqCkft{T}jE6y-ftQhi z3!#RQK^UY;zqBMXM<1*!B(XS~k%0%Cs88{d?85kM37#J9|7?>EC7#JA1w6-%aYH4p}VA=>)&CS5Tz{kMMz`(%4 zz{0@Ez{$YHz{tSEzzfx!oakRff=ET3v3=A13Lph10w?;*hYQ;aH&F# literal 0 HcmV?d00001 diff --git a/DEV3.2/TP05/04_Serpent/TacheTimer.java b/DEV3.2/TP05/04_Serpent/TacheTimer.java new file mode 100644 index 0000000..3d2d8c5 --- /dev/null +++ b/DEV3.2/TP05/04_Serpent/TacheTimer.java @@ -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(); + } +} \ No newline at end of file