From f6860d8ae64d2c9db5d7580ce001221b31eb09d1 Mon Sep 17 00:00:00 2001 From: Oscar Bauer <oscar.bauer@etu.univ-amu.fr> Date: Mon, 16 Dec 2024 14:48:01 +0100 Subject: [PATCH] working snake game --- CCI_Java/CCI_Java/src/TestTd16.java | 14 ++++ CCI_Java/CCI_Java/src/td14/exo6/Addition.java | 14 ++++ .../src/td14/exo6/BinaryOperation.java | 14 ++++ CCI_Java/CCI_Java/src/td14/exo6/Constant.java | 14 ++++ CCI_Java/CCI_Java/src/td14/exo6/Cos.java | 14 ++++ CCI_Java/CCI_Java/src/td14/exo6/Division.java | 16 +++++ CCI_Java/CCI_Java/src/td14/exo6/Exp.java | 14 ++++ .../CCI_Java/src/td14/exo6/Expression.java | 6 ++ CCI_Java/CCI_Java/src/td14/exo6/Log.java | 14 ++++ .../src/td14/exo6/Multiplication.java | 14 ++++ CCI_Java/CCI_Java/src/td14/exo6/Sin.java | 14 ++++ .../CCI_Java/src/td14/exo6/Subtraction.java | 14 ++++ CCI_Java/CCI_Java/src/td14/exo6/Testing.java | 16 +++++ .../src/td14/exo6/UnaryOperation.java | 13 ++++ CCI_Java/CCI_Java/src/td14/exo6/Variable.java | 11 +++ CCI_Java/CCI_Java/src/td16.java | 36 ++++++++++ CCI_Java/CCI_Java/src/version3/Direction.java | 3 + CCI_Java/CCI_Java/src/version3/Position.java | 29 +++++--- CCI_Java/CCI_Java/src/version3/SnakeGame.java | 71 ++++++++++++++----- .../CCI_Java/src/version3/TestPosition.java | 2 + 20 files changed, 318 insertions(+), 25 deletions(-) create mode 100644 CCI_Java/CCI_Java/src/TestTd16.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/Addition.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/BinaryOperation.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/Constant.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/Cos.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/Division.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/Exp.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/Expression.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/Log.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/Multiplication.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/Sin.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/Subtraction.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/Testing.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/UnaryOperation.java create mode 100644 CCI_Java/CCI_Java/src/td14/exo6/Variable.java create mode 100644 CCI_Java/CCI_Java/src/td16.java diff --git a/CCI_Java/CCI_Java/src/TestTd16.java b/CCI_Java/CCI_Java/src/TestTd16.java new file mode 100644 index 0000000..4f964eb --- /dev/null +++ b/CCI_Java/CCI_Java/src/TestTd16.java @@ -0,0 +1,14 @@ + +public class TestTd16 { + + public static void main(String[] args) { + int num = td16.expoFor(3,3); + System.out.println(num); + + double numRec = td16.expoRec(3,3); + System.out.println(numRec); + + System.out.println(td16.fiboRec(6)); + } + +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/Addition.java b/CCI_Java/CCI_Java/src/td14/exo6/Addition.java new file mode 100644 index 0000000..443dc5b --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/Addition.java @@ -0,0 +1,14 @@ +package td14.exo6; + +public class Addition extends BinaryOperation { + + public Addition(Expression ex1, Expression ex2) { + super(ex1, ex2); + } + + @Override + public double value(double x) { + return left.value(x) + right.value(x); + } + +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/BinaryOperation.java b/CCI_Java/CCI_Java/src/td14/exo6/BinaryOperation.java new file mode 100644 index 0000000..f2f377d --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/BinaryOperation.java @@ -0,0 +1,14 @@ +package td14.exo6; + +public abstract class BinaryOperation implements Expression { + protected Expression left; + protected Expression right; + + public BinaryOperation(Expression left, Expression right) { + this.left = left; + this.right = right; + } + + @Override + public abstract double value(double x); +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/Constant.java b/CCI_Java/CCI_Java/src/td14/exo6/Constant.java new file mode 100644 index 0000000..17714e6 --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/Constant.java @@ -0,0 +1,14 @@ +package td14.exo6; + +public class Constant implements Expression { + private double value; + + public Constant(double value) { + this.value = value; + } + + @Override + public double value(double x) { + return this.value; + } +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/Cos.java b/CCI_Java/CCI_Java/src/td14/exo6/Cos.java new file mode 100644 index 0000000..d2f04de --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/Cos.java @@ -0,0 +1,14 @@ +package td14.exo6; + +public class Cos extends UnaryOperation { + + public Cos(Expression ex) { + super(ex); + } + + @Override + public double value(double x) { + return Math.cos(expression.value(x)); + } + +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/Division.java b/CCI_Java/CCI_Java/src/td14/exo6/Division.java new file mode 100644 index 0000000..071465f --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/Division.java @@ -0,0 +1,16 @@ +package td14.exo6; + +public class Division extends BinaryOperation { + + public Division(Expression ex1, Expression ex2) { + super(ex1, ex2); + } + + @Override + public double value(double x) { + if(right.value(x) == 0) + return Integer.MIN_VALUE; + return left.value(x) / right.value(x); + } + +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/Exp.java b/CCI_Java/CCI_Java/src/td14/exo6/Exp.java new file mode 100644 index 0000000..c388f77 --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/Exp.java @@ -0,0 +1,14 @@ +package td14.exo6; + +public class Exp extends UnaryOperation { + + public Exp(Expression ex) { + super(ex); + } + + @Override + public double value(double x) { + return Math.pow(expression.value(x), expression.value(x)); + } + +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/Expression.java b/CCI_Java/CCI_Java/src/td14/exo6/Expression.java new file mode 100644 index 0000000..8429da5 --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/Expression.java @@ -0,0 +1,6 @@ +package td14.exo6; + +public interface Expression { + public double value(double x); + +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/Log.java b/CCI_Java/CCI_Java/src/td14/exo6/Log.java new file mode 100644 index 0000000..63ed669 --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/Log.java @@ -0,0 +1,14 @@ +package td14.exo6; + +public class Log extends UnaryOperation { + + public Log(Expression ex) { + super(ex); + } + + @Override + public double value(double x) { + return Math.log(expression.value(x)); + } + +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/Multiplication.java b/CCI_Java/CCI_Java/src/td14/exo6/Multiplication.java new file mode 100644 index 0000000..f6b52b0 --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/Multiplication.java @@ -0,0 +1,14 @@ +package td14.exo6; + +public class Multiplication extends BinaryOperation{ + + public Multiplication(Expression ex1, Expression ex2) { + super(ex1, ex2); + } + + @Override + public double value(double x) { + return left.value(x) * right.value(x); + } + +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/Sin.java b/CCI_Java/CCI_Java/src/td14/exo6/Sin.java new file mode 100644 index 0000000..c692d6a --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/Sin.java @@ -0,0 +1,14 @@ +package td14.exo6; + +public class Sin extends UnaryOperation { + + public Sin(Expression ex) { + super(ex); + } + + @Override + public double value(double x) { + return Math.sin(expression.value(x)); + } + +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/Subtraction.java b/CCI_Java/CCI_Java/src/td14/exo6/Subtraction.java new file mode 100644 index 0000000..179377e --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/Subtraction.java @@ -0,0 +1,14 @@ +package td14.exo6; + +public class Subtraction extends BinaryOperation { + + public Subtraction(Expression ex1, Expression ex2) { + super(ex1, ex2); + } + + @Override + public double value(double x) { + return left.value(x) - right.value(x); + } + +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/Testing.java b/CCI_Java/CCI_Java/src/td14/exo6/Testing.java new file mode 100644 index 0000000..20fe530 --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/Testing.java @@ -0,0 +1,16 @@ +package td14.exo6; + +public class Testing { + + public static void main(String[] args) { + // Repr�sentation de la fonction f(x) = 2 * sin(x) + 3 * cos(x) + Expression f = new Addition(new Multiplication(new Constant(2), new Sin(new Variable())), + new Multiplication(new Constant(3), new Cos(new Variable()))); + // Calcul de la valeur de f(x) pour plusieurs valeurs de x + double[] values = { 0, 0.5, 1, 1.5, 2, 2.5 }; + for (double x : values) { + System.out.println("f(" + x + ") = " + f.value(x)); + } + } + +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/UnaryOperation.java b/CCI_Java/CCI_Java/src/td14/exo6/UnaryOperation.java new file mode 100644 index 0000000..f38a204 --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/UnaryOperation.java @@ -0,0 +1,13 @@ +package td14.exo6; + +public abstract class UnaryOperation implements Expression { + protected Expression expression; + + public UnaryOperation(Expression expression) { + this.expression = expression; + + } + + @Override + public abstract double value(double x); +} diff --git a/CCI_Java/CCI_Java/src/td14/exo6/Variable.java b/CCI_Java/CCI_Java/src/td14/exo6/Variable.java new file mode 100644 index 0000000..b902ba3 --- /dev/null +++ b/CCI_Java/CCI_Java/src/td14/exo6/Variable.java @@ -0,0 +1,11 @@ +package td14.exo6; + +public class Variable implements Expression { + + + @Override + public double value(double x) { + return x; + } + +} diff --git a/CCI_Java/CCI_Java/src/td16.java b/CCI_Java/CCI_Java/src/td16.java new file mode 100644 index 0000000..7498bfd --- /dev/null +++ b/CCI_Java/CCI_Java/src/td16.java @@ -0,0 +1,36 @@ + +public class td16 { + + public static int expoFor(int x, int n) { + int res = 1; + for (int i = 0; i < n; i++) + res *= x; + return res; + } + + public static double expoRec(double x, int n) { + double res = x; + if (n == 0) + return 1; + return res * expoRec(x, n - 1); + +// return (n == 0) ? 1 : res * expoRec(x, n - 1); + + } + + public static double fiboRec(double n) { + +// if (n == 0 || n == 1) +// return n; +// return fibuRec(n-1) + fibuRec(n - 2); + + return (n == 0 || n == 1) ? n : fiboRec(n-1) + fiboRec(n - 2); + } + + public static double divi(int n) { + if (n == 1) + return 1; + return (1.0 / n) + divi(n-1) ; + } + +} diff --git a/CCI_Java/CCI_Java/src/version3/Direction.java b/CCI_Java/CCI_Java/src/version3/Direction.java index 6677767..adb8244 100644 --- a/CCI_Java/CCI_Java/src/version3/Direction.java +++ b/CCI_Java/CCI_Java/src/version3/Direction.java @@ -3,3 +3,6 @@ package version3; public enum Direction { NORTH, SOUTH, EAST, WEST } + + + diff --git a/CCI_Java/CCI_Java/src/version3/Position.java b/CCI_Java/CCI_Java/src/version3/Position.java index 6642f97..7cc7b3b 100644 --- a/CCI_Java/CCI_Java/src/version3/Position.java +++ b/CCI_Java/CCI_Java/src/version3/Position.java @@ -9,17 +9,28 @@ public class Position { this.column = column; } - public boolean isSamePosition(Position pos) { - if (isLine(pos.line) && isColumn(pos.column)) - return true; +// public boolean isSamePosition(Position pos) { +// if (isLine(pos.line) && isColumn(pos.column)) +// return true; +// return false; +// } + + public boolean isSamePosition(Object obj) { + try { + if (obj.getClass() == this.getClass()) { + Position pos = (Position) obj; + if (isLine(pos.line) && isColumn(pos.column)) + return true; + } + } catch (NullPointerException e) { + return false; + } return false; } - - public boolean equals(Object obj) { - if (obj.getClass() == this.getClass()) - return isSamePosition((Position) obj); - return false; - + + public boolean isSame(Object obj) { + return obj.equals(this); +// return true; } public boolean isColumn(int col) { diff --git a/CCI_Java/CCI_Java/src/version3/SnakeGame.java b/CCI_Java/CCI_Java/src/version3/SnakeGame.java index 3c1dae6..52b427c 100644 --- a/CCI_Java/CCI_Java/src/version3/SnakeGame.java +++ b/CCI_Java/CCI_Java/src/version3/SnakeGame.java @@ -1,16 +1,18 @@ package version3; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import java.util.Random; public class SnakeGame { public static final int GRID_LINES = 12; public static final int GRID_COLUMNS = 12; - private List<Position> segments; + private LinkedList<Position> segments; private Direction direction; private boolean gameOver; private Position apple; + private Random rand = new Random(); public SnakeGame() { initialize(); @@ -20,33 +22,78 @@ public class SnakeGame { direction = Direction.EAST; int startL = GRID_LINES / 2; int startC = GRID_COLUMNS / 2; - gameOver = false; - setApple(); - segments = new ArrayList<Position>(); + segments = new LinkedList<Position>(); segments.add(new Position(startL, startC)); segments.add(new Position(startL, startC - 1)); segments.add(new Position(startL, startC - 2)); + gameOver = false; + setApple(); } public void setApple() { - Random rand = new Random(); - apple = new Position(rand.nextInt(GRID_LINES + 1), rand.nextInt(GRID_LINES + 1)); + apple = new Position(this.rand.nextInt(GRID_LINES), this.rand.nextInt(GRID_COLUMNS)); + if (isSnakeAt(apple)) { + setApple(); + } + } public void advance() { + if (!isGameOver()) { + if (isSnakeAt(apple)) { + setApple(); + } else { + segments.removeLast(); + } + + segments.addFirst(segments.peek().getNext(direction)); + } } public boolean isGameOver() { + if (isOutOfBounds(segments.peekFirst())) + gameOver = true; + if (snakeBite()) + gameOver = true; return gameOver; } - public void changeDirection(Direction direction) { + private boolean snakeBite() { + Position peek = segments.peekFirst(); + for (Position seg : segments) + if (!peek.isSame(seg) && peek.isSamePosition(seg)) + return true; + + return false; + } + + public boolean isOutOfBounds(Position pos) { + boolean condLine = pos.line < GRID_LINES && pos.line >= 0; + boolean condCol = pos.column < GRID_COLUMNS && pos.column >= 0; + if (condLine && condCol) + return false; + return true; + } + + public void changeDirection(Direction newDirection) { + if (newDirection != getOpposite(direction)) + direction = newDirection; + } + + private Direction getOpposite(Direction dir) { + if (dir == Direction.NORTH) + return Direction.SOUTH; + if (dir == Direction.EAST) + return Direction.WEST; + if (dir == Direction.SOUTH) + return Direction.NORTH; + return Direction.EAST; } public boolean isSnakeAt(Position position) { for (Position pos : segments) - if (position.isSamePosition(pos)) + if (pos.isSamePosition(position)) return true; return false; } @@ -70,12 +117,4 @@ public class SnakeGame { } } -// public void printLine() { -// String line = ""; -// for (int c =0; c<GRID_COLUMNS;c++) { -// if(apple.isColumn(c) && apple.isLine(c)) -// } -// -// } - } diff --git a/CCI_Java/CCI_Java/src/version3/TestPosition.java b/CCI_Java/CCI_Java/src/version3/TestPosition.java index 918c17f..626cbc1 100644 --- a/CCI_Java/CCI_Java/src/version3/TestPosition.java +++ b/CCI_Java/CCI_Java/src/version3/TestPosition.java @@ -5,6 +5,8 @@ public class TestPosition { public static void main(String[] args) { Position pos1 = new Position(3, 4); + Position pos2 = new Position(3, 4); + pos1.equals(pos2); System.out.println(pos1); } -- GitLab