From a7ef5800930bb3d46ee19440b7dbc758c9503dfe Mon Sep 17 00:00:00 2001 From: "michael.divia" <michael.divia@etu.hesge.ch> Date: Fri, 5 Jan 2024 16:02:31 +0100 Subject: [PATCH] Part 3 Separation --- .../.vscode/c_cpp_properties.json | 0 .../.vscode/launch.json | 0 .../.vscode/settings.json | 0 {Partie_3 => Partie_3_GFX}/pom.xml | 0 {Partie_3 => Partie_3_GFX}/save.csv | 0 .../src/main/java/ch/hepia/App.java | 0 .../src/main/java/ch/hepia/Carte.java | 0 .../src/main/java/ch/hepia/GameManager.java | 0 .../src/main/java/ch/hepia/Hand.java | 0 .../src/main/java/ch/hepia/JeudeCarte.java | 0 .../src/main/java/ch/hepia/Joueur.java | 0 .../src/main/java/ch/hepia/Paquet.java | 0 .../src/main/java/ch/hepia/Save.java | 0 .../src/test/java/ch/hepia/JoueurTest.java | 0 .../target/classes/ch/hepia/App.class | Bin .../target/classes/ch/hepia/COULEUR.class | Bin .../target/classes/ch/hepia/Carte.class | Bin .../target/classes/ch/hepia/GameManager.class | Bin .../target/classes/ch/hepia/Hand$1.class | Bin .../target/classes/ch/hepia/Hand.class | Bin .../classes/ch/hepia/JeudeCarte$1.class | Bin .../target/classes/ch/hepia/JeudeCarte.class | Bin .../target/classes/ch/hepia/Joueur.class | Bin .../classes/ch/hepia/JoueurCroupier.class | Bin .../classes/ch/hepia/JoueurHumain.class | Bin .../classes/ch/hepia/JoueurOrdinateur.class | Bin .../target/classes/ch/hepia/Paquet.class | Bin .../target/classes/ch/hepia/Save.class | Bin .../compile/default-compile/createdFiles.lst | 0 .../compile/default-compile/inputFiles.lst | 0 .../test-classes/ch/hepia/JoueurTest.class | Bin .../.vscode/c_cpp_properties.json | 18 + Partie_3_Terminal/.vscode/launch.json | 24 + Partie_3_Terminal/.vscode/settings.json | 60 ++ Partie_3_Terminal/pom.xml | 82 ++ Partie_3_Terminal/save.csv | 3 + .../src/main/java/ch/hepia/App.java | 187 +++++ .../src/main/java/ch/hepia/Carte.java | 86 ++ .../src/main/java/ch/hepia/GameManager.java | 755 +++++++++++++++++ .../src/main/java/ch/hepia/Hand.java | 216 +++++ .../src/main/java/ch/hepia/JeudeCarte.java | 123 +++ .../src/main/java/ch/hepia/Joueur.java | 761 ++++++++++++++++++ .../src/main/java/ch/hepia/Paquet.java | 25 + .../src/main/java/ch/hepia/Save.java | 100 +++ .../src/test/java/ch/hepia/JoueurTest.java | 302 +++++++ .../target/classes/ch/hepia/App.class | Bin 0 -> 3474 bytes .../target/classes/ch/hepia/COULEUR.class | Bin 0 -> 1075 bytes .../target/classes/ch/hepia/Carte.class | Bin 0 -> 2702 bytes .../target/classes/ch/hepia/GameManager.class | Bin 0 -> 18901 bytes .../target/classes/ch/hepia/Hand$1.class | Bin 0 -> 1125 bytes .../target/classes/ch/hepia/Hand.class | Bin 0 -> 4822 bytes .../classes/ch/hepia/JeudeCarte$1.class | Bin 0 -> 1157 bytes .../target/classes/ch/hepia/JeudeCarte.class | Bin 0 -> 3202 bytes .../target/classes/ch/hepia/Joueur.class | Bin 0 -> 663 bytes .../classes/ch/hepia/JoueurCroupier.class | Bin 0 -> 3338 bytes .../classes/ch/hepia/JoueurHumain.class | Bin 0 -> 4901 bytes .../classes/ch/hepia/JoueurOrdinateur.class | Bin 0 -> 4918 bytes .../target/classes/ch/hepia/Paquet.class | Bin 0 -> 902 bytes .../target/classes/ch/hepia/Save.class | Bin 0 -> 3866 bytes .../compile/default-compile/createdFiles.lst | 7 + .../compile/default-compile/inputFiles.lst | 8 + .../test-classes/ch/hepia/JoueurTest.class | Bin 0 -> 8931 bytes 62 files changed, 2757 insertions(+) rename {Partie_3 => Partie_3_GFX}/.vscode/c_cpp_properties.json (100%) rename {Partie_3 => Partie_3_GFX}/.vscode/launch.json (100%) rename {Partie_3 => Partie_3_GFX}/.vscode/settings.json (100%) rename {Partie_3 => Partie_3_GFX}/pom.xml (100%) rename {Partie_3 => Partie_3_GFX}/save.csv (100%) rename {Partie_3 => Partie_3_GFX}/src/main/java/ch/hepia/App.java (100%) rename {Partie_3 => Partie_3_GFX}/src/main/java/ch/hepia/Carte.java (100%) rename {Partie_3 => Partie_3_GFX}/src/main/java/ch/hepia/GameManager.java (100%) rename {Partie_3 => Partie_3_GFX}/src/main/java/ch/hepia/Hand.java (100%) rename {Partie_3 => Partie_3_GFX}/src/main/java/ch/hepia/JeudeCarte.java (100%) rename {Partie_3 => Partie_3_GFX}/src/main/java/ch/hepia/Joueur.java (100%) rename {Partie_3 => Partie_3_GFX}/src/main/java/ch/hepia/Paquet.java (100%) rename {Partie_3 => Partie_3_GFX}/src/main/java/ch/hepia/Save.java (100%) rename {Partie_3 => Partie_3_GFX}/src/test/java/ch/hepia/JoueurTest.java (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/App.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/COULEUR.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/Carte.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/GameManager.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/Hand$1.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/Hand.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/JeudeCarte$1.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/JeudeCarte.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/Joueur.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/JoueurCroupier.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/JoueurHumain.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/JoueurOrdinateur.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/Paquet.class (100%) rename {Partie_3 => Partie_3_GFX}/target/classes/ch/hepia/Save.class (100%) rename {Partie_3 => Partie_3_GFX}/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst (100%) rename {Partie_3 => Partie_3_GFX}/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst (100%) rename {Partie_3 => Partie_3_GFX}/target/test-classes/ch/hepia/JoueurTest.class (100%) create mode 100644 Partie_3_Terminal/.vscode/c_cpp_properties.json create mode 100644 Partie_3_Terminal/.vscode/launch.json create mode 100644 Partie_3_Terminal/.vscode/settings.json create mode 100644 Partie_3_Terminal/pom.xml create mode 100644 Partie_3_Terminal/save.csv create mode 100644 Partie_3_Terminal/src/main/java/ch/hepia/App.java create mode 100644 Partie_3_Terminal/src/main/java/ch/hepia/Carte.java create mode 100644 Partie_3_Terminal/src/main/java/ch/hepia/GameManager.java create mode 100644 Partie_3_Terminal/src/main/java/ch/hepia/Hand.java create mode 100644 Partie_3_Terminal/src/main/java/ch/hepia/JeudeCarte.java create mode 100644 Partie_3_Terminal/src/main/java/ch/hepia/Joueur.java create mode 100644 Partie_3_Terminal/src/main/java/ch/hepia/Paquet.java create mode 100644 Partie_3_Terminal/src/main/java/ch/hepia/Save.java create mode 100644 Partie_3_Terminal/src/test/java/ch/hepia/JoueurTest.java create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/App.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/COULEUR.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/Carte.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/GameManager.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/Hand$1.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/Hand.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/JeudeCarte$1.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/JeudeCarte.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/Joueur.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/JoueurCroupier.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/JoueurHumain.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/JoueurOrdinateur.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/Paquet.class create mode 100644 Partie_3_Terminal/target/classes/ch/hepia/Save.class create mode 100644 Partie_3_Terminal/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 Partie_3_Terminal/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 Partie_3_Terminal/target/test-classes/ch/hepia/JoueurTest.class diff --git a/Partie_3/.vscode/c_cpp_properties.json b/Partie_3_GFX/.vscode/c_cpp_properties.json similarity index 100% rename from Partie_3/.vscode/c_cpp_properties.json rename to Partie_3_GFX/.vscode/c_cpp_properties.json diff --git a/Partie_3/.vscode/launch.json b/Partie_3_GFX/.vscode/launch.json similarity index 100% rename from Partie_3/.vscode/launch.json rename to Partie_3_GFX/.vscode/launch.json diff --git a/Partie_3/.vscode/settings.json b/Partie_3_GFX/.vscode/settings.json similarity index 100% rename from Partie_3/.vscode/settings.json rename to Partie_3_GFX/.vscode/settings.json diff --git a/Partie_3/pom.xml b/Partie_3_GFX/pom.xml similarity index 100% rename from Partie_3/pom.xml rename to Partie_3_GFX/pom.xml diff --git a/Partie_3/save.csv b/Partie_3_GFX/save.csv similarity index 100% rename from Partie_3/save.csv rename to Partie_3_GFX/save.csv diff --git a/Partie_3/src/main/java/ch/hepia/App.java b/Partie_3_GFX/src/main/java/ch/hepia/App.java similarity index 100% rename from Partie_3/src/main/java/ch/hepia/App.java rename to Partie_3_GFX/src/main/java/ch/hepia/App.java diff --git a/Partie_3/src/main/java/ch/hepia/Carte.java b/Partie_3_GFX/src/main/java/ch/hepia/Carte.java similarity index 100% rename from Partie_3/src/main/java/ch/hepia/Carte.java rename to Partie_3_GFX/src/main/java/ch/hepia/Carte.java diff --git a/Partie_3/src/main/java/ch/hepia/GameManager.java b/Partie_3_GFX/src/main/java/ch/hepia/GameManager.java similarity index 100% rename from Partie_3/src/main/java/ch/hepia/GameManager.java rename to Partie_3_GFX/src/main/java/ch/hepia/GameManager.java diff --git a/Partie_3/src/main/java/ch/hepia/Hand.java b/Partie_3_GFX/src/main/java/ch/hepia/Hand.java similarity index 100% rename from Partie_3/src/main/java/ch/hepia/Hand.java rename to Partie_3_GFX/src/main/java/ch/hepia/Hand.java diff --git a/Partie_3/src/main/java/ch/hepia/JeudeCarte.java b/Partie_3_GFX/src/main/java/ch/hepia/JeudeCarte.java similarity index 100% rename from Partie_3/src/main/java/ch/hepia/JeudeCarte.java rename to Partie_3_GFX/src/main/java/ch/hepia/JeudeCarte.java diff --git a/Partie_3/src/main/java/ch/hepia/Joueur.java b/Partie_3_GFX/src/main/java/ch/hepia/Joueur.java similarity index 100% rename from Partie_3/src/main/java/ch/hepia/Joueur.java rename to Partie_3_GFX/src/main/java/ch/hepia/Joueur.java diff --git a/Partie_3/src/main/java/ch/hepia/Paquet.java b/Partie_3_GFX/src/main/java/ch/hepia/Paquet.java similarity index 100% rename from Partie_3/src/main/java/ch/hepia/Paquet.java rename to Partie_3_GFX/src/main/java/ch/hepia/Paquet.java diff --git a/Partie_3/src/main/java/ch/hepia/Save.java b/Partie_3_GFX/src/main/java/ch/hepia/Save.java similarity index 100% rename from Partie_3/src/main/java/ch/hepia/Save.java rename to Partie_3_GFX/src/main/java/ch/hepia/Save.java diff --git a/Partie_3/src/test/java/ch/hepia/JoueurTest.java b/Partie_3_GFX/src/test/java/ch/hepia/JoueurTest.java similarity index 100% rename from Partie_3/src/test/java/ch/hepia/JoueurTest.java rename to Partie_3_GFX/src/test/java/ch/hepia/JoueurTest.java diff --git a/Partie_3/target/classes/ch/hepia/App.class b/Partie_3_GFX/target/classes/ch/hepia/App.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/App.class rename to Partie_3_GFX/target/classes/ch/hepia/App.class diff --git a/Partie_3/target/classes/ch/hepia/COULEUR.class b/Partie_3_GFX/target/classes/ch/hepia/COULEUR.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/COULEUR.class rename to Partie_3_GFX/target/classes/ch/hepia/COULEUR.class diff --git a/Partie_3/target/classes/ch/hepia/Carte.class b/Partie_3_GFX/target/classes/ch/hepia/Carte.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/Carte.class rename to Partie_3_GFX/target/classes/ch/hepia/Carte.class diff --git a/Partie_3/target/classes/ch/hepia/GameManager.class b/Partie_3_GFX/target/classes/ch/hepia/GameManager.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/GameManager.class rename to Partie_3_GFX/target/classes/ch/hepia/GameManager.class diff --git a/Partie_3/target/classes/ch/hepia/Hand$1.class b/Partie_3_GFX/target/classes/ch/hepia/Hand$1.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/Hand$1.class rename to Partie_3_GFX/target/classes/ch/hepia/Hand$1.class diff --git a/Partie_3/target/classes/ch/hepia/Hand.class b/Partie_3_GFX/target/classes/ch/hepia/Hand.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/Hand.class rename to Partie_3_GFX/target/classes/ch/hepia/Hand.class diff --git a/Partie_3/target/classes/ch/hepia/JeudeCarte$1.class b/Partie_3_GFX/target/classes/ch/hepia/JeudeCarte$1.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/JeudeCarte$1.class rename to Partie_3_GFX/target/classes/ch/hepia/JeudeCarte$1.class diff --git a/Partie_3/target/classes/ch/hepia/JeudeCarte.class b/Partie_3_GFX/target/classes/ch/hepia/JeudeCarte.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/JeudeCarte.class rename to Partie_3_GFX/target/classes/ch/hepia/JeudeCarte.class diff --git a/Partie_3/target/classes/ch/hepia/Joueur.class b/Partie_3_GFX/target/classes/ch/hepia/Joueur.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/Joueur.class rename to Partie_3_GFX/target/classes/ch/hepia/Joueur.class diff --git a/Partie_3/target/classes/ch/hepia/JoueurCroupier.class b/Partie_3_GFX/target/classes/ch/hepia/JoueurCroupier.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/JoueurCroupier.class rename to Partie_3_GFX/target/classes/ch/hepia/JoueurCroupier.class diff --git a/Partie_3/target/classes/ch/hepia/JoueurHumain.class b/Partie_3_GFX/target/classes/ch/hepia/JoueurHumain.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/JoueurHumain.class rename to Partie_3_GFX/target/classes/ch/hepia/JoueurHumain.class diff --git a/Partie_3/target/classes/ch/hepia/JoueurOrdinateur.class b/Partie_3_GFX/target/classes/ch/hepia/JoueurOrdinateur.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/JoueurOrdinateur.class rename to Partie_3_GFX/target/classes/ch/hepia/JoueurOrdinateur.class diff --git a/Partie_3/target/classes/ch/hepia/Paquet.class b/Partie_3_GFX/target/classes/ch/hepia/Paquet.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/Paquet.class rename to Partie_3_GFX/target/classes/ch/hepia/Paquet.class diff --git a/Partie_3/target/classes/ch/hepia/Save.class b/Partie_3_GFX/target/classes/ch/hepia/Save.class similarity index 100% rename from Partie_3/target/classes/ch/hepia/Save.class rename to Partie_3_GFX/target/classes/ch/hepia/Save.class diff --git a/Partie_3/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/Partie_3_GFX/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst similarity index 100% rename from Partie_3/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst rename to Partie_3_GFX/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst diff --git a/Partie_3/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/Partie_3_GFX/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst similarity index 100% rename from Partie_3/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst rename to Partie_3_GFX/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/Partie_3/target/test-classes/ch/hepia/JoueurTest.class b/Partie_3_GFX/target/test-classes/ch/hepia/JoueurTest.class similarity index 100% rename from Partie_3/target/test-classes/ch/hepia/JoueurTest.class rename to Partie_3_GFX/target/test-classes/ch/hepia/JoueurTest.class diff --git a/Partie_3_Terminal/.vscode/c_cpp_properties.json b/Partie_3_Terminal/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..c2098a2 --- /dev/null +++ b/Partie_3_Terminal/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "linux-gcc-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "/usr/bin/gcc", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "linux-gcc-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Partie_3_Terminal/.vscode/launch.json b/Partie_3_Terminal/.vscode/launch.json new file mode 100644 index 0000000..7f873a9 --- /dev/null +++ b/Partie_3_Terminal/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "externalConsole": false, + "cwd": "/home/padi/Tรฉlรฉchargements", + "program": "/home/padi/Tรฉlรฉchargements/build/Debug/outDebug", + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/Partie_3_Terminal/.vscode/settings.json b/Partie_3_Terminal/.vscode/settings.json new file mode 100644 index 0000000..1152b26 --- /dev/null +++ b/Partie_3_Terminal/.vscode/settings.json @@ -0,0 +1,60 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false, + "java.configuration.updateBuildConfiguration": "interactive" +} \ No newline at end of file diff --git a/Partie_3_Terminal/pom.xml b/Partie_3_Terminal/pom.xml new file mode 100644 index 0000000..a8dc63e --- /dev/null +++ b/Partie_3_Terminal/pom.xml @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>ch.hepia</groupId> + <artifactId>Java_Card_Game</artifactId> + <version>1.0-SNAPSHOT</version> + + <name>Java_Card_Game</name> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <maven.compiler.source>20</maven.compiler.source> + <maven.compiler.target>20</maven.compiler.target> + </properties> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.13.2</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-engine</artifactId> + <version>5.9.1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx-controls</artifactId> + <version>19</version> + </dependency> + <dependency> + <groupId>com.opencsv</groupId> + <artifactId>opencsv</artifactId> + <version>5.9</version> + </dependency> + </dependencies> + + <build> + <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> + <plugins> + <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> + <plugin> + <artifactId>maven-clean-plugin</artifactId> + <version>3.1.0</version> + </plugin> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.8.0</version> + </plugin> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <version>2.22.1</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>3.4.1</version> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>3.1.0</version> + <executions> + <execution> + <goals> + <goal>java</goal> + </goals> + </execution> + </executions> + <configuration> + <mainClass>ch.hepia.App</mainClass> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> +</project> \ No newline at end of file diff --git a/Partie_3_Terminal/save.csv b/Partie_3_Terminal/save.csv new file mode 100644 index 0000000..f481abf --- /dev/null +++ b/Partie_3_Terminal/save.csv @@ -0,0 +1,3 @@ +Human,100.0,0 +Player_1,190.0,1 +Player_2,305.0,1 diff --git a/Partie_3_Terminal/src/main/java/ch/hepia/App.java b/Partie_3_Terminal/src/main/java/ch/hepia/App.java new file mode 100644 index 0000000..b99e87f --- /dev/null +++ b/Partie_3_Terminal/src/main/java/ch/hepia/App.java @@ -0,0 +1,187 @@ +package ch.hepia; + +import java.io.File; +import java.util.Scanner; + +public class App { + + // Scanner will be used all along to take user inputs in the terminal + public static final Scanner in = new Scanner(System.in); + + // All Color choices to be used in terminal prints + public static final String ANSI_RESET = "\u001B[0m"; + public static final String ANSI_BLACK = "\u001B[30m"; + public static final String ANSI_RED = "\u001B[31m"; + public static final String ANSI_GREEN = "\u001B[32m"; + public static final String ANSI_YELLOW = "\u001B[33m"; + public static final String ANSI_BLUE = "\u001B[34m"; + public static final String ANSI_PURPLE = "\u001B[35m"; + public static final String ANSI_CYAN = "\u001B[36m"; + public static final String ANSI_WHITE = "\u001B[37m"; + + public static void BlackJack() { + + System.out.print("\033[H\033[2J"); + System.out.flush(); + + System.out.println("*~-~* " + App.ANSI_RED + "BlackJack" + App.ANSI_RESET + " *~-~*\n"); + + int numPlayers; + int startMoney; + int computerStrategy = 1; + boolean loadSave = false; + String filePath = "save.csv"; + + File f = new File(filePath); + + // Check if a save file exists + if (f.exists() && !f.isDirectory()) { + + char choice = 'x'; + + System.out.print("Do you want to load last game save (y/n) ? "); + + while (true) { + + choice = App.in.next().charAt(0); + + // Choices are checked with available one for confirmation + if (choice == 'y' || choice == 'n') { + break; + } else { + System.out.println(App.ANSI_YELLOW + "Please enter a valid choice." + App.ANSI_RESET); + } + } + + if (choice == 'y') { + loadSave = true; + } + } + + GameManager BlackJack; + + if (loadSave) { + + // Load save to create game + Save Game = new Save(); + + BlackJack = new GameManager(Game.loadMoney(), Game.loadStrategy()); + + } else { + // Ask the number of players until a valide answer is given + while (true) { + + System.out.print("How many players ? "); + + // Check that the input is an valid int + while (!App.in.hasNextInt()) { + System.out.println( + App.ANSI_YELLOW + "Please enter a valid number for the number of players." + + App.ANSI_RESET); + System.out.print("How many players ? "); + App.in.next(); + } + + numPlayers = App.in.nextInt(); + + // Player count must be between 1 and 7 + if (numPlayers >= 1 && numPlayers <= 7) { + System.out.print(""); + break; + } else { + System.out.println( + App.ANSI_YELLOW + "Please enter a number of players between 1 and 7." + App.ANSI_RESET); + } + } + + // Ask the start money count for each players until a valide answer is given + while (true) { + + System.out.print("How much money do you start with ? "); + + // Check that the input is an valid int + while (!App.in.hasNextInt()) { + System.out + .println(App.ANSI_YELLOW + "Please enter a valid number for your Money." + App.ANSI_RESET); + System.out.print("How much money do you start with ? "); + App.in.next(); + } + + startMoney = App.in.nextInt(); + + // Starting money must be more or equal to minimum bid amount + if (startMoney >= 10) { + System.out.print(""); + break; + } else { + System.out.println(App.ANSI_YELLOW + "Please enter an amount above 10." + App.ANSI_RESET); + } + } + + // Ask if the Computer players should be smart of not + if (numPlayers > 1) { + while (true) { + + System.out.print("Should the Compter players be [1] Smart or [2] Stupid ? "); + + // Check that the input is an valid int + while (!App.in.hasNextInt()) { + System.out + .println(App.ANSI_YELLOW + "Please enter a valid choice." + App.ANSI_RESET); + System.out.print("Should the Compter players be [1] Smart or [2] Stupid ? "); + App.in.next(); + } + + computerStrategy = App.in.nextInt(); + + // Check if the value i s valide + if (computerStrategy == 1 || computerStrategy == 2) { + System.out.print(""); + break; + } else { + System.out.println(App.ANSI_YELLOW + "Please enter a valid choice." + App.ANSI_RESET); + } + } + } + + // Create a new game + BlackJack = new GameManager(numPlayers, startMoney, computerStrategy); + } + + boolean GameOver = false; + + // Game run's in 3 Phases : + // Phase 1 (StartTurn): + // Ask the player how much he wan't to bid + // Phase 2 (PlayTurn): + // Ask the player for all his interactions with this cards + // Phase 3 (ResolveTurn): + // Make the Dealer pick cards + // Do all the math for the player gains and losses + // Check if the player can continue et prepare for the next round + while (!GameOver) { + BlackJack.StartTurn(); + BlackJack.PlayTurn(); + GameOver = BlackJack.ResolveTurn(); + } + + // The player has less than the minimum bid amount allowed = Game Over + + System.out.print("\033[H\033[2J"); + System.out.flush(); + + System.out.println("*~-~* " + App.ANSI_RED + "BlackJack" + App.ANSI_RESET + " *~-~*\n"); + + System.out.println(App.ANSI_PURPLE + "Game Over !" + App.ANSI_RESET); + + App.in.close(); + } + + public static void main(String[] args) { + + // Play 1 BlackJack Game + BlackJack(); + + } + +} diff --git a/Partie_3_Terminal/src/main/java/ch/hepia/Carte.java b/Partie_3_Terminal/src/main/java/ch/hepia/Carte.java new file mode 100644 index 0000000..6282220 --- /dev/null +++ b/Partie_3_Terminal/src/main/java/ch/hepia/Carte.java @@ -0,0 +1,86 @@ +package ch.hepia; + +enum COULEUR { + coeur, + carreau, + pique, + trefle +} + +public class Carte { + + final private COULEUR couleur; + final private int rang; + final private int force; + + private static final int NOMBRE_DE_RANGS = 13; + + String[][] playingCards = { + { "๐", "๐ฑ", "๐ฒ", "๐ณ", "๐ด", "๐ต", "๐ถ", "๐ท", "๐ธ", "๐น", "๐บ", "๐ป", "๐ฝ", "๐พ" }, + { "๐", "๐", "๐", "๐", "๐", "๐ ", "๐", "๐", "๐", "๐", "๐", "๐", "๐", "๐" }, + { "๐", "๐ก", "๐ข", "๐ฃ", "๐ค", "๐ฅ", "๐ฆ", "๐ง", "๐จ", "๐ฉ", "๐ช", "๐ซ", "๐ญ", "๐ฎ" }, + { "๐", "๐", "๐", "๐", "๐", "๐", "๐", "๐", "๐", "๐", "๐", "๐", "๐", "๐" } + }; + + public Carte(COULEUR couleur, int rang) { + + if (rang < 0 || rang > NOMBRE_DE_RANGS) { + throw new IllegalArgumentException("Carte invalide : rang incorrect"); + } + + this.couleur = couleur; + this.rang = rang; + + if (rang <= 10) { + this.force = rang; + } else { + this.force = 10; + } + + } + + public COULEUR getCouleur() { + + return this.couleur; + + } + + public int getRang() { + + return this.rang; + + } + + public int getForce() { + + return this.force; + + } + + public String getNomCouleur() { + + String[] NOMS_COULEURS = { "โฅ", "โฆ", "โ ", "โฃ" }; + return NOMS_COULEURS[couleur.ordinal()]; + + } + + public String getNomRang() { + + String[] NOMS_RANGS = { "Joker", "As", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Valet", "Dame", "Roi" }; + return NOMS_RANGS[rang]; + + } + + public String getNomComplet() { + if (getRang() == 0) { + + return "๐"; + + } else { + + return playingCards[couleur.ordinal()][rang]; + + } + } + +} diff --git a/Partie_3_Terminal/src/main/java/ch/hepia/GameManager.java b/Partie_3_Terminal/src/main/java/ch/hepia/GameManager.java new file mode 100644 index 0000000..2cc3940 --- /dev/null +++ b/Partie_3_Terminal/src/main/java/ch/hepia/GameManager.java @@ -0,0 +1,755 @@ +package ch.hepia; + +import java.util.ArrayList; + +public class GameManager { + + private JeudeCarte Deck; + private ArrayList<Joueur> Players; + private JoueurCroupier Dealer; + private int ComputerPlayers; + private int Step; + + public GameManager(int nbPlayer, int startMoney, int computerStrategy) { + + // Create a new BlackJack Deck of card (6 x 52 cards game) + this.Deck = new JeudeCarte(new Paquet(6, 52)); + + this.Players = new ArrayList<>(); + + // First Player is always the humain + this.Players.add(new JoueurHumain(Deck, startMoney)); + + this.ComputerPlayers = 0; + + // All other are controlled by the computer + if (nbPlayer > 1) { + for (int x = 1; x < nbPlayer; x++) { + ComputerPlayers++; + this.Players.add(new JoueurOrdinateur(Deck, startMoney, computerStrategy)); + } + } + + this.Dealer = new JoueurCroupier(Deck); + } + + public GameManager(ArrayList<Double> Money, ArrayList<Integer> Strategy) { + + // Create a new BlackJack Deck of card (6 x 52 cards game) + this.Deck = new JeudeCarte(new Paquet(6, 52)); + + this.Players = new ArrayList<>(); + + // First Player is always the humain + this.Players.add(new JoueurHumain(Deck, Money.get(0))); + + this.ComputerPlayers = 0; + + // All other are controlled by the computer + if (Money.size() > 1) { + for (int x = 1; x < Money.size(); x++) { + ComputerPlayers++; + this.Players.add(new JoueurOrdinateur(Deck, Money.get(x), Strategy.get(x))); + } + } + + this.Dealer = new JoueurCroupier(Deck); + } + + // Phase 1 (StartTurn): + // Ask the player how much he wan't to bid + public void StartTurn() { + + this.Step = 0; + + System.out.print("\033[H\033[2J"); + System.out.flush(); + + System.out.println("*~-~* " + App.ANSI_RED + "BlackJack" + App.ANSI_RESET + " *~-~*\n"); + + double bet; + + System.out.println("Money : " + App.ANSI_BLUE + this.Players.get(0).GetMoney() + App.ANSI_RESET); + + // Ask the bid amount until a valide answer is given + while (true) { + + System.out.print("How much do you want to bet (Min. 10) ? "); + + // Check that the input is an valid double + while (!App.in.hasNextDouble()) { + System.out.println(App.ANSI_YELLOW + "Please enter a valid number to bet." + App.ANSI_RESET); + System.out.print("How much do you want to bet (Min. 10) ?"); + App.in.next(); + } + + bet = App.in.nextDouble(); + + // Check if the player has enough money to place the bid + if (bet <= this.Players.get(0).GetMoney()) { + + // Check if the minimum bid amount it cleared + if (bet < 10) { + System.out.println(App.ANSI_YELLOW + "Minimum bid amount is 10." + App.ANSI_RESET); + } else { + break; + } + + } else { + System.out.println(App.ANSI_YELLOW + "You don't have enough money." + App.ANSI_RESET); + } + } + + // Set the player bid for this turn + Players.get(0).SetBet(bet, 0); + + // Set the Computer players bid for this turn + for (int x = 1; x <= this.ComputerPlayers; x++) { + Players.get(x).SetBet(10, 0); + } + } + + // Phase 2 (PlayTurn): + // Ask the player for all his interactions with this cards + public void PlayTurn() { + + boolean EndTurn = false, CanSplit = false, CanInsure = false, CanDouble = false, CanDraw = false; + + // Continue interacting with the player until all actions have been taken on all + // his hands + while (!EndTurn) { + + char choice = 'x'; + + // Go thew all hands of the player + for (int HandNb = 0; HandNb < this.Players.get(0).GetNbHands(); HandNb++) { + + CanSplit = false; + CanInsure = false; + CanDouble = false; + CanDraw = false; + choice = 'x'; + + System.out.print("\033[H\033[2J"); + System.out.flush(); + + System.out.println("*~-~* " + App.ANSI_RED + "BlackJack" + App.ANSI_RESET + " *~-~*\n"); + + // Show the remaining amount of cards in the deck + System.out.println( + "Cards in Deck : " + App.ANSI_GREEN + this.Deck.GetNbCards() + App.ANSI_RESET + "\n"); + + // Dealer has only 1 card in his hand at this point in time + System.out + .println("Dealer Strength : " + App.ANSI_PURPLE + this.Dealer.GetStrength(0) + App.ANSI_RESET); + + // Show the dealer hand + this.Dealer.ShowHands(); + + // Show the current player balance + System.out.println("\nMoney : " + App.ANSI_BLUE + this.Players.get(0).GetMoney() + App.ANSI_RESET); + + // Check if the player has put down an insurance + if (this.Players.get(0).HasInsured()) { + System.out.println( + "Insured : " + App.ANSI_BLUE + this.Players.get(0).GetInsured() + App.ANSI_RESET); + } + + // Show the hand number of the player + System.out + .println("Bet on Hand " + App.ANSI_GREEN + (HandNb + 1) + App.ANSI_RESET + " : " + App.ANSI_BLUE + + this.Players.get(0).GetBet(HandNb) + App.ANSI_RESET); + + // Show the hand strength of the player + // 99 = BlackJack + // >21 = Busted + // <=21 = show the strength + System.out + .print("Strength of Hand " + App.ANSI_GREEN + (HandNb + 1) + App.ANSI_RESET + " : " + + App.ANSI_PURPLE); + if (this.Players.get(0).GetStrength(HandNb) == 99) { + System.out.println("BlackJack" + App.ANSI_RESET); + } else if (this.Players.get(0).GetStrength(HandNb) > 21) { + System.out.println( + this.Players.get(0).GetStrength(HandNb) + App.ANSI_RED + " [BUSTED]" + App.ANSI_RESET); + } else { + System.out.println(this.Players.get(0).GetStrength(HandNb) + App.ANSI_RESET); + } + + // Show the player hand + this.Players.get(0).ShowHand(HandNb); + + // Show Computer Players hands + for (int x = 1; x <= this.ComputerPlayers; x++) { + for (int HandNbComputer = 0; HandNbComputer < this.Players.get(x).GetNbHands(); HandNbComputer++) { + System.out + .print("\nComputer " + App.ANSI_GREEN + x + App.ANSI_RESET + ", Money " + App.ANSI_BLUE + + this.Players.get(x).GetMoney() + App.ANSI_RESET + ", Hand " + + App.ANSI_GREEN + HandNbComputer + App.ANSI_RESET + ", Bet " + App.ANSI_BLUE + + this.Players.get(x).GetBet(HandNbComputer) + App.ANSI_RESET + ", Strength " + + App.ANSI_PURPLE); + if (this.Players.get(x).GetStrength(HandNbComputer) == 99) { + System.out.println("BlackJack" + App.ANSI_RESET + " :"); + } else if (this.Players.get(x).GetStrength(HandNbComputer) > 21) { + System.out.println( + this.Players.get(x).GetStrength(HandNbComputer) + App.ANSI_RED + " [BUSTED]" + + App.ANSI_RESET + " :"); + } else { + System.out.println(this.Players.get(x).GetStrength(HandNbComputer) + App.ANSI_RESET + " :"); + } + this.Players.get(x).ShowHand(HandNbComputer); + } + } + + // Choices for player + System.out.println("\n--- " + App.ANSI_GREEN + "Choices" + App.ANSI_RESET + " ---\n"); + + // Insurance + // Can only insure if it's the first thing that the players does + // AND + // That he hasn't already insured during this round + if (this.Step == 0 && this.Dealer.HasOnlyAs() + && !this.Players.get(0).HasInsured()) { + CanInsure = true; + System.out.println(App.ANSI_BLUE + "[i]" + App.ANSI_RESET + " Insurance against Dealer"); + } + + // Split + // Can only split if this hand can be split (if it wasn't already split AND if + // the 2 cards have the same strength) + // AND + // if we have less that 3 hands already (Max 2 splits) + // AND + // if the player has enough money + if (this.Players.get(0).CanSplit(HandNb) + && this.Players.get(0).GetNbHands() < 3 + && this.Players.get(0).GetBet(HandNb) <= this.Players.get(0).GetMoney()) { + CanSplit = true; + System.out.println(App.ANSI_BLUE + "[s]" + App.ANSI_RESET + " Split your Hand"); + } + + // Double + // Can only double if this hand wasn't already doubled + // AND + // if the hand has only 2 cards + // AND + // if the hand is not a BlackJack + // AND + // if the player has enough money + if (!this.Players.get(0).HasDoubled(HandNb) + && this.Players.get(0).GetNbCards(HandNb) == 2 + && this.Players.get(0).GetStrength(HandNb) != 99 + && this.Players.get(0).GetBet(HandNb) <= this.Players.get(0).GetMoney()) { + CanDouble = true; + System.out.println(App.ANSI_BLUE + "[d]" + App.ANSI_RESET + " Double your Hand"); + } + + // Draw a Card (Hit) + // Can NOT draw if this hand was doubled AND has already 3 cards + // AND + // if the hand has been splitted with a pair of Asses + // AND + // if the player has a BlackJack + // AND + // if the strength of the hand is more than 21 + if (!(this.Players.get(0).HasDoubled(HandNb) && this.Players.get(0).GetNbCards(HandNb) == 3) + && !(this.Players.get(0).HasSplit(HandNb) + && this.Players.get(0).GetCardStrength(HandNb, 0) == 1) + && this.Players.get(0).GetStrength(HandNb) < 21) { + CanDraw = true; + System.out.println(App.ANSI_BLUE + "[h]" + App.ANSI_RESET + " Hit"); + } + + // Keep (Stand) + System.out.println(App.ANSI_BLUE + "[k]" + App.ANSI_RESET + " Keep current Hand"); + + // Ask for the player choice until a valide one is given + while (true) { + System.out.print("> "); + + choice = App.in.next().charAt(0); + + // Choices are checked with available one for confirmation + if ((choice == 'i' && CanInsure) || (choice == 's' && CanSplit) || (choice == 'd' && CanDouble) + || (choice == 'h' && CanDraw) + || choice == 'k') { + break; + } else { + System.out.println(App.ANSI_YELLOW + "Please enter a valid choice." + App.ANSI_RESET); + } + } + + // Hit + if (choice == 'h') { + this.Players.get(0).DrawCard(HandNb, this.Deck); + // Go back 1 hand to stay on the same hand in the for loop + HandNb--; + } + // Split + else if (choice == 's') { + this.Players.get(0).Split(HandNb, this.Deck); + // Go back 1 hand to stay on the same hand in the for loop + HandNb--; + } + // Double + else if (choice == 'd') { + this.Players.get(0).Double(HandNb, this.Deck); + // Go back 1 hand to stay on the same hand in the for loop + HandNb--; + } + + Step++; + } + + // Insure + if (choice == 'i') { + this.Players.get(0).Insure(); + EndTurn = false; + } + // If this point is reached (and not because of the insurance), all hands have + // been played + else { + EndTurn = true; + } + } + + } + + // Phase 3 (ResolveTurn): + // Make the Dealer pick cards + // Do all the math for the player gains and losses + // Check if the player can continue et prepare for the next round + public boolean ResolveTurn() { + + // Computer Players take turn to play + for (int x = 1; x <= this.ComputerPlayers; x++) { + + // Check there strategy + /* + * 1 = Smart + * 2 = Stupid + */ + if (this.Players.get(x).GetStrategy() == 1) { + + char[][][] Choices_2Cards = { + { + { 'S', 'T', 'T', 'T', 'T', 'T', 'T', 'R', 'R', 'R' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'R' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'R', 'R' }, + { 'R', 'T', 'T', 'T', 'T', 'T', 'T', 'S', 'R', 'R' }, + { 'R', 'T', 'T', 'T', 'T', 'T', 'R', 'R', 'R', 'R' }, + { 'R', 'T', 'T', 'T', 'T', 'R', 'R', 'R', 'R', 'R' }, + }, + { + { 'S', 'T', 'T', 'T', 'T', 'T', 'R', 'R', 'R', 'R' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'R' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'R', 'R' }, + { 'T', 'T', 'T', 'T', 'D', 'T', 'T', 'R', 'R', 'R' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'R', 'R', 'R', 'R' }, + { 'R', 'T', 'T', 'T', 'T', 'R', 'S', 'R', 'R', 'R' }, + { 'R', 'T', 'T', 'T', 'R', 'R', 'R', 'S', 'R', 'R' }, + { 'R', 'T', 'T', 'R', 'R', 'R', 'R', 'R', 'S', 'R' }, + { 'R', 'T', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' }, + }, + { + { 'S', 'T', 'T', 'T', 'T', 'D', 'D', 'R', 'R', 'R' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'D', 'D', 'D', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'D', 'D', 'D', 'T', 'R' }, + { 'T', 'T', 'T', 'T', 'D', 'D', 'D', 'T', 'R', 'R' }, + { 'T', 'T', 'T', 'D', 'D', 'D', 'T', 'R', 'R', 'R' }, + { 'D', 'T', 'D', 'D', 'D', 'S', 'R', 'R', 'R', 'R' }, + { 'D', 'D', 'D', 'D', 'T', 'R', 'S', 'R', 'R', 'R' }, + { 'R', 'D', 'D', 'T', 'R', 'R', 'R', 'S', 'R', 'R' }, + { 'R', 'D', 'T', 'R', 'R', 'R', 'R', 'R', 'S', 'R' }, + { 'R', 'T', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' }, + }, + { + { 'S', 'T', 'T', 'D', 'D', 'D', 'D', 'R', 'R', 'R' }, + { 'T', 'S', 'T', 'T', 'T', 'T', 'D', 'D', 'D', 'R' }, + { 'T', 'T', 'S', 'T', 'T', 'D', 'D', 'D', 'R', 'R' }, + { 'D', 'T', 'T', 'T', 'D', 'D', 'D', 'R', 'R', 'R' }, + { 'D', 'T', 'T', 'D', 'D', 'D', 'R', 'R', 'R', 'R' }, + { 'D', 'T', 'D', 'D', 'D', 'S', 'R', 'R', 'R', 'R' }, + { 'D', 'D', 'D', 'D', 'R', 'R', 'S', 'R', 'R', 'R' }, + { 'R', 'D', 'D', 'R', 'R', 'R', 'R', 'S', 'R', 'R' }, + { 'R', 'D', 'R', 'R', 'R', 'R', 'R', 'R', 'S', 'R' }, + { 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' }, + }, + { + { 'S', 'D', 'D', 'D', 'D', 'D', 'D', 'R', 'R', 'R' }, + { 'D', 'S', 'T', 'T', 'T', 'T', 'D', 'D', 'D', 'R' }, + { 'D', 'T', 'S', 'T', 'T', 'D', 'D', 'D', 'R', 'R' }, + { 'D', 'T', 'T', 'T', 'D', 'D', 'D', 'R', 'R', 'R' }, + { 'D', 'T', 'T', 'D', 'D', 'D', 'R', 'R', 'R', 'R' }, + { 'D', 'T', 'D', 'D', 'D', 'S', 'R', 'R', 'R', 'R' }, + { 'D', 'D', 'D', 'D', 'R', 'R', 'S', 'R', 'R', 'R' }, + { 'R', 'D', 'D', 'R', 'R', 'R', 'R', 'S', 'R', 'R' }, + { 'R', 'D', 'R', 'R', 'R', 'R', 'R', 'R', 'S', 'R' }, + { 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' }, + }, + { + { 'S', 'D', 'D', 'D', 'D', 'D', 'D', 'R', 'R', 'R' }, + { 'D', 'S', 'T', 'T', 'T', 'T', 'D', 'D', 'D', 'R' }, + { 'D', 'T', 'S', 'T', 'T', 'D', 'D', 'D', 'R', 'R' }, + { 'D', 'T', 'T', 'T', 'D', 'D', 'D', 'R', 'R', 'R' }, + { 'D', 'T', 'T', 'D', 'D', 'D', 'R', 'R', 'R', 'R' }, + { 'D', 'T', 'D', 'D', 'D', 'S', 'R', 'R', 'R', 'R' }, + { 'D', 'D', 'D', 'D', 'R', 'R', 'S', 'R', 'R', 'R' }, + { 'R', 'D', 'D', 'R', 'R', 'R', 'R', 'S', 'R', 'R' }, + { 'R', 'D', 'R', 'R', 'R', 'R', 'R', 'R', 'S', 'R' }, + { 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R' }, + }, + { + { 'S', 'T', 'T', 'T', 'T', 'T', 'R', 'R', 'R', 'R' }, + { 'T', 'S', 'T', 'T', 'T', 'T', 'T', 'D', 'D', 'T' }, + { 'T', 'T', 'S', 'T', 'T', 'T', 'D', 'D', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'D', 'D', 'T', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'D', 'D', 'T', 'T', 'T', 'T' }, + { 'T', 'T', 'T', 'D', 'D', 'T', 'T', 'T', 'T', 'T' }, + { 'R', 'T', 'D', 'D', 'T', 'T', 'S', 'T', 'T', 'R' }, + { 'R', 'D', 'D', 'T', 'T', 'T', 'T', 'S', 'R', 'R' }, + { 'R', 'D', 'T', 'T', 'T', 'T', 'T', 'R', 'R', 'R' }, + { 'R', 'T', 'T', 'T', 'T', 'T', 'R', 'R', 'R', 'R' }, + }, + { + { 'S', 'T', 'T', 'T', 'T', 'T', 'R', 'R', 'R', 'R' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'D', 'D', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'D', 'D', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'D', 'D', 'T', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'D', 'D', 'T', 'T', 'T', 'T' }, + { 'T', 'T', 'T', 'D', 'D', 'T', 'T', 'T', 'T', 'T' }, + { 'R', 'T', 'D', 'D', 'T', 'T', 'T', 'T', 'T', 'R' }, + { 'R', 'D', 'D', 'T', 'T', 'T', 'T', 'S', 'R', 'R' }, + { 'R', 'D', 'T', 'T', 'T', 'T', 'T', 'R', 'S', 'R' }, + { 'R', 'T', 'T', 'T', 'T', 'T', 'R', 'R', 'R', 'R' }, + }, + { + { 'S', 'T', 'T', 'T', 'T', 'T', 'T', 'R', 'R', 'R' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'D', 'D', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'D', 'D', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'D', 'D', 'T', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'D', 'D', 'T', 'T', 'T', 'T' }, + { 'T', 'T', 'T', 'D', 'D', 'T', 'T', 'T', 'T', 'R' }, + { 'T', 'T', 'D', 'D', 'T', 'T', 'T', 'T', 'R', 'R' }, + { 'R', 'D', 'D', 'T', 'T', 'T', 'T', 'S', 'R', 'R' }, + { 'R', 'D', 'T', 'T', 'T', 'T', 'R', 'R', 'S', 'R' }, + { 'R', 'T', 'T', 'T', 'T', 'R', 'R', 'R', 'R', 'R' }, + }, + { + { 'S', 'T', 'T', 'T', 'T', 'T', 'T', 'R', 'R', 'R' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'D', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'D', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'T', 'D', 'T', 'T', 'T' }, + { 'T', 'T', 'T', 'T', 'T', 'D', 'T', 'T', 'T', 'R' }, + { 'T', 'T', 'T', 'T', 'D', 'T', 'T', 'T', 'R', 'R' }, + { 'T', 'T', 'T', 'D', 'T', 'T', 'T', 'R', 'R', 'R' }, + { 'R', 'T', 'D', 'T', 'T', 'T', 'R', 'S', 'R', 'R' }, + { 'R', 'D', 'T', 'T', 'T', 'R', 'R', 'R', 'R', 'R' }, + { 'R', 'T', 'T', 'T', 'R', 'R', 'R', 'R', 'R', 'R' }, + } + }; + + char[][] Choices_MoreThan2Cards = { + { 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'R', 'R' }, + { 'T', 'T', 'D', 'D', 'T', 'R', 'R', 'R', 'R', 'R' }, + { 'T', 'D', 'D', 'D', 'T', 'R', 'R', 'R', 'R', 'R' }, + { 'T', 'D', 'D', 'D', 'R', 'R', 'R', 'R', 'R', 'R' }, + { 'T', 'D', 'D', 'D', 'R', 'R', 'R', 'R', 'R', 'R' }, + { 'T', 'D', 'D', 'D', 'R', 'R', 'R', 'R', 'R', 'R' }, + { 'T', 'T', 'D', 'D', 'T', 'T', 'T', 'T', 'T', 'R' }, + { 'T', 'T', 'D', 'D', 'T', 'T', 'T', 'T', 'T', 'R' }, + { 'T', 'T', 'D', 'D', 'T', 'T', 'T', 'T', 'R', 'R' }, + { 'T', 'T', 'T', 'D', 'T', 'T', 'T', 'R', 'R', 'R' } + }; + + char Choice = 'R'; + + // Go thew all the hands of the computer player + for (int HandNb = 0; HandNb < this.Players.get(x).GetNbHands(); HandNb++) { + + if (this.Players.get(x).GetNbCards(HandNb) == 2) { + Choice = Choices_2Cards[this.Dealer.GetCardStrength(0, 0) - 1][this.Players.get(x) + .GetCardStrength(HandNb, 0) - 1][this.Players.get(x).GetCardStrength(HandNb, 1) - 1]; + } else { + if (this.Players.get(x).GetStrength(HandNb) <= 8) { + Choice = Choices_MoreThan2Cards[this.Dealer.GetCardStrength(0, 0) - 1][0]; + } else if (this.Players.get(x).GetStrength(HandNb) == 9) { + Choice = Choices_MoreThan2Cards[this.Dealer.GetCardStrength(0, 0) - 1][1]; + } else if (this.Players.get(x).GetStrength(HandNb) == 10) { + Choice = Choices_MoreThan2Cards[this.Dealer.GetCardStrength(0, 0) - 1][2]; + } else if (this.Players.get(x).GetStrength(HandNb) == 11) { + Choice = Choices_MoreThan2Cards[this.Dealer.GetCardStrength(0, 0) - 1][3]; + } else if (this.Players.get(x).GetStrength(HandNb) == 12) { + Choice = Choices_MoreThan2Cards[this.Dealer.GetCardStrength(0, 0) - 1][4]; + } else if (this.Players.get(x).GetStrength(HandNb) == 13) { + Choice = Choices_MoreThan2Cards[this.Dealer.GetCardStrength(0, 0) - 1][5]; + } else if (this.Players.get(x).GetStrength(HandNb) == 14) { + Choice = Choices_MoreThan2Cards[this.Dealer.GetCardStrength(0, 0) - 1][6]; + } else if (this.Players.get(x).GetStrength(HandNb) == 15) { + Choice = Choices_MoreThan2Cards[this.Dealer.GetCardStrength(0, 0) - 1][7]; + } else if (this.Players.get(x).GetStrength(HandNb) == 16) { + Choice = Choices_MoreThan2Cards[this.Dealer.GetCardStrength(0, 0) - 1][8]; + } else if (this.Players.get(x).GetStrength(HandNb) >= 17) { + Choice = Choices_MoreThan2Cards[this.Dealer.GetCardStrength(0, 0) - 1][9]; + } + } + + if (Choice == 'T') { + // Draw + + this.Players.get(x).DrawCard(HandNb, this.Deck); + // Go back 1 hand to stay on the same hand in the for loop + HandNb--; + + } else if (Choice == 'R') { + // Stay + + } else if (Choice == 'D') { + // Double + + this.Players.get(x).Double(HandNb, this.Deck); + // Go back 1 hand to stay on the same hand in the for loop + HandNb--; + } else if (Choice == 'S') { + // Split + + this.Players.get(x).Split(HandNb, this.Deck); + // Go back 1 hand to stay on the same hand in the for loop + HandNb--; + } + } + + } else if (this.Players.get(x).GetStrategy() == 2) { + while (this.Players.get(x).GetStrength(0) <= 15) { + this.Players.get(x).DrawCard(0, this.Deck); + } + } + } + + // Dealer draws card until he hits 17 or more + while (this.Dealer.GetStrength(0) <= 17) { + this.Dealer.DrawCard(0, this.Deck); + } + + System.out.print("\033[H\033[2J"); + System.out.flush(); + + System.out.println("*~-~* " + App.ANSI_RED + "BlackJack" + App.ANSI_RESET + " *~-~*\n"); + + // Show the remaining amount of cards in the deck + System.out.println( + "Cards in Deck : " + App.ANSI_GREEN + this.Deck.GetNbCards() + App.ANSI_RESET + "\n"); + + // Show the hand strength of the dealer + // 99 = BlackJack + // >21 = Busted + // <=21 = show the strength + System.out.print("Dealer Score : " + App.ANSI_PURPLE); + if (this.Dealer.GetStrength(0) == 99) { + System.out.println("BlackJack" + App.ANSI_RESET); + } else if (this.Dealer.GetStrength(0) > 21) { + System.out.println(this.Dealer.GetStrength(0) + App.ANSI_RED + " [BUSTED]" + App.ANSI_RESET); + } else { + System.out.println(this.Dealer.GetStrength(0) + App.ANSI_RESET); + } + + // Show the dealers hand + this.Dealer.ShowHands(); + + // Check if the player has put down an insurance + if (this.Players.get(0).HasInsured()) { + System.out.println( + "Insured : " + App.ANSI_BLUE + this.Players.get(0).GetInsured() + App.ANSI_RESET); + } + + // Apply Computer Players Loss/Win + for (int x = 1; x <= this.ComputerPlayers; x++) { + for (int HandNbComputer = 0; HandNbComputer < this.Players.get(x).GetNbHands(); HandNbComputer++) { + // If the player is Busted (strength > 21 but not BlackJack (99)) + if (this.Players.get(x).GetStrength(HandNbComputer) > 21 + && this.Players.get(x).GetStrength(HandNbComputer) != 99) { + } + // If it's a Draw + else if (this.Dealer.GetStrength(0) == this.Players.get(x).GetStrength(HandNbComputer)) { + // Player get's back his bet + this.Players.get(x).AddMoney(this.Players.get(x).GetBet(HandNbComputer)); + } + // If the player has done a BlackJack + else if (this.Players.get(x).GetStrength(HandNbComputer) == 99) { + // Player gets payed 1.5 to 1 + this.Players.get(x).AddMoney(this.Players.get(x).GetBet(HandNbComputer) * 2.5); + } + // If the Dealer is Busted (strength > 21 but not BlackJack (99)) + else if (this.Dealer.GetStrength(0) > 21 && this.Dealer.GetStrength(0) != 99) { + // Player wins and get payed 1 to 1 + this.Players.get(x).AddMoney(this.Players.get(x).GetBet(HandNbComputer) * 2); + } + // If the Dealer has a better score + else if (this.Players.get(x).GetStrength(HandNbComputer) < this.Dealer.GetStrength(0)) { + } + // If the Player has a better score + else if (this.Players.get(x).GetStrength(HandNbComputer) > this.Dealer.GetStrength(0)) { + // Player wins and get payed 1 to 1 + this.Players.get(x).AddMoney(this.Players.get(x).GetBet(HandNbComputer) * 2); + } + } + } + + // Show Computer Players hands + for (int x = 1; x <= this.ComputerPlayers; x++) { + for (int HandNbComputer = 0; HandNbComputer < this.Players.get(x).GetNbHands(); HandNbComputer++) { + System.out + .print("\nComputer " + App.ANSI_GREEN + x + App.ANSI_RESET + ", Money " + App.ANSI_BLUE + + this.Players.get(x).GetMoney() + App.ANSI_RESET + ", Hand " + + App.ANSI_GREEN + HandNbComputer + App.ANSI_RESET + ", Bet " + App.ANSI_BLUE + + this.Players.get(x).GetBet(HandNbComputer) + App.ANSI_RESET + ", Strength " + + App.ANSI_PURPLE); + if (this.Players.get(x).GetStrength(HandNbComputer) == 99) { + System.out.println("BlackJack" + App.ANSI_RESET + " :"); + } else if (this.Players.get(x).GetStrength(HandNbComputer) > 21) { + System.out.println( + this.Players.get(x).GetStrength(HandNbComputer) + App.ANSI_RED + " [BUSTED]" + + App.ANSI_RESET + " :"); + } else { + System.out.println(this.Players.get(x).GetStrength(HandNbComputer) + App.ANSI_RESET + " :"); + } + this.Players.get(x).ShowHand(HandNbComputer); + } + } + + // Go thew all hands of the player + for (int HandNb = 0; HandNb < this.Players.get(0).GetNbHands(); HandNb++) { + + System.out.println("\nHand " + App.ANSI_GREEN + (HandNb + 1) + App.ANSI_RESET + " :"); + + // Show to bet amount of the hand + System.out.println("\tBet : " + App.ANSI_BLUE + this.Players.get(0).GetBet(HandNb) + App.ANSI_RESET); + + // Show strength of the hand of the player + // 99 = BlackJack + // >21 = Busted + // <=21 = show the strength + System.out.print("\tStrength : " + App.ANSI_PURPLE); + if (this.Players.get(0).GetStrength(HandNb) == 99) { + System.out.println("BlackJack" + App.ANSI_RESET); + } else if (this.Players.get(0).GetStrength(HandNb) > 21) { + System.out.println( + this.Players.get(0).GetStrength(HandNb) + App.ANSI_RED + " [BUSTED]" + App.ANSI_RESET); + } else { + System.out.println(this.Players.get(0).GetStrength(HandNb) + App.ANSI_RESET); + } + + // Show and apply gains and losses + System.out.print("\tResult : "); + // If the player is Busted (strength > 21 but not BlackJack (99)) + if (this.Players.get(0).GetStrength(HandNb) > 21 && this.Players.get(0).GetStrength(HandNb) != 99) { + // Show player loss + System.out.println(App.ANSI_RED + "-" + this.Players.get(0).GetBet(HandNb) + App.ANSI_RESET); + } + // If it's a Draw + else if (this.Dealer.GetStrength(0) == this.Players.get(0).GetStrength(HandNb)) { + // Player get's back his bet + System.out.println(App.ANSI_BLUE + "ยฑ0" + App.ANSI_RESET); + this.Players.get(0).AddMoney(this.Players.get(0).GetBet(HandNb)); + } + // If the player has done a BlackJack + else if (this.Players.get(0).GetStrength(HandNb) == 99) { + // Player gets payed 1.5 to 1 + System.out.println(App.ANSI_GREEN + "+" + (this.Players.get(0).GetBet(HandNb) * 1.5) + App.ANSI_RESET); + this.Players.get(0).AddMoney(this.Players.get(0).GetBet(HandNb) * 2.5); + } + // If the Dealer is Busted (strength > 21 but not BlackJack (99)) + else if (this.Dealer.GetStrength(0) > 21 && this.Dealer.GetStrength(0) != 99) { + // Player wins and get payed 1 to 1 + System.out.println(App.ANSI_GREEN + "+" + this.Players.get(0).GetBet(HandNb) + App.ANSI_RESET); + this.Players.get(0).AddMoney(this.Players.get(0).GetBet(HandNb) * 2); + } + // If the Dealer has a better score + else if (this.Players.get(0).GetStrength(HandNb) < this.Dealer.GetStrength(0)) { + // Show player loss + System.out.println(App.ANSI_RED + "-" + this.Players.get(0).GetBet(HandNb) + App.ANSI_RESET); + } + // If the Player has a better score + else if (this.Players.get(0).GetStrength(HandNb) > this.Dealer.GetStrength(0)) { + // Player wins and get payed 1 to 1 + System.out.println(App.ANSI_GREEN + "+" + this.Players.get(0).GetBet(HandNb) + App.ANSI_RESET); + this.Players.get(0).AddMoney(this.Players.get(0).GetBet(HandNb) * 2); + } + + } + + // Check if the player had insurance + if (this.Players.get(0).HasInsured()) { + + System.out.print("Insurance : "); + + // If the Dealer did a BackJack + if (this.Dealer.GetStrength(0) == 99) { + // Player gets payed back 2 to 1 + System.out.println(App.ANSI_GREEN + "+" + (this.Players.get(0).GetInsured() * 3) + App.ANSI_RESET); + this.Players.get(0).AddMoney(this.Players.get(0).GetInsured() * 3); + } else { + // Show player loss + System.out.println(App.ANSI_RED + "-" + (this.Players.get(0).GetInsured()) + App.ANSI_RESET); + } + } + + // Show the final player balance + System.out.println("\nMoney : " + App.ANSI_BLUE + this.Players.get(0).GetMoney() + App.ANSI_RESET); + + // Show Choices + System.out.println("\n--- " + App.ANSI_GREEN + "Choices" + App.ANSI_RESET + " ---\n"); + + System.out.println(App.ANSI_BLUE + "[c]" + App.ANSI_RESET + " Continue"); + System.out.println(App.ANSI_BLUE + "[s]" + App.ANSI_RESET + " Save & Quit"); + + char choice = 'x'; + + // Ask for the player choice until a valide one is given + while (true) { + System.out.print("> "); + + choice = App.in.next().charAt(0); + + // Choices are checked with available one for confirmation + if (choice == 'c' || choice == 's') { + break; + } else { + System.out.println(App.ANSI_YELLOW + "Please enter a valid choice." + App.ANSI_RESET); + } + } + + if (choice == 'c') { + // If the player has less than the minimum bid amount allowed + if (this.Players.get(0).GetMoney() <= 10) { + return true; + } + + // If more thn 75% of the Deck has been used, reshuffle all cards. In our case: + // simply recreate a new deck + if (this.Deck.GetNbCards() < 78) { + this.Deck = new JeudeCarte(new Paquet(6, 52)); + } + + // Reset all hands + this.Dealer.Reset(this.Deck); + for (Joueur Player : this.Players) { + Player.Reset(this.Deck); + } + } else if (choice == 's') { + + Save Game = new Save(); + Game.save(this.Players, this.ComputerPlayers); + + return true; + } + + return false; + } + +} diff --git a/Partie_3_Terminal/src/main/java/ch/hepia/Hand.java b/Partie_3_Terminal/src/main/java/ch/hepia/Hand.java new file mode 100644 index 0000000..9b5ffe0 --- /dev/null +++ b/Partie_3_Terminal/src/main/java/ch/hepia/Hand.java @@ -0,0 +1,216 @@ +package ch.hepia; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +public class Hand implements Comparable<Hand> { + + private ArrayList<Carte> Hand; + private double Bet; + private boolean Splitted; + private boolean Doubled; + + public Hand(Carte... cartes) { + + this.Hand = new ArrayList<>(); + + for (Carte carte : cartes) { + + Hand.add(carte); + + } + + this.Splitted = false; + this.Doubled = false; + this.Bet = 0; + } + + public Hand(JeudeCarte game, int nb) { + + this.Hand = new ArrayList<>(); + + this.DrawCardFromGame(game, nb); + + this.Splitted = false; + this.Doubled = false; + } + + public boolean HasDoubled() { + return this.Doubled; + } + + public void Double() { + this.Doubled = true; + this.Bet *= 2; + } + + public boolean HasSplit() { + return this.Splitted; + } + + public void Splitted() { + this.Splitted = true; + } + + public int NbCard() { + return this.Hand.size(); + } + + public void SetBet(double amount) { + if (amount < 0) { + throw new RuntimeException("Can't bet negative amount of money."); + } + + this.Bet = amount; + } + + public double GetBet() { + return this.Bet; + } + + public Carte GetCarte(int cardNb) { + return this.Hand.get(cardNb); + } + + public void AddCardToHand(Carte... cartes) { + + for (Carte carte : cartes) { + + this.Hand.add(carte); + + } + } + + public void RemoveCardFromHand(Carte... cartes) { + + for (Carte carte : cartes) { + + this.Hand.remove(carte); + + } + } + + public void DrawCardFromGame(JeudeCarte game) { + + this.AddCardToHand(game.GetTopCarteOfGame()); + + game.RemoveCarteFromGame(game.GetTopCarteOfGame()); + + } + + public void DrawCardFromGame(JeudeCarte game, int nb) { + + for (int x = 0; x < nb; x++) { + this.DrawCardFromGame(game); + } + + } + + public void SortHand() { + + Collections.sort(Hand, new Comparator<Carte>() { + + public int compare(Carte carte1, Carte carte2) { + + int comparaisonCouleur = carte1.getCouleur().compareTo(carte2.getCouleur()); + + if (comparaisonCouleur == 0) { + + return Integer.compare(carte1.getRang(), carte2.getRang()); + + } else { + + return comparaisonCouleur; + } + } + + }); + + } + + public int GetStrength() { + + int force = 0; + int as = 0; + + // Add strength of cards and count how much Asses there is + for (Carte carte : Hand) { + if (carte.getForce() == 1) { + as++; + } + force += carte.getForce(); + } + + // Test how many Asses we can but to 11 without going over 21 + while (force < 21 && as > 0) { + force += 10; + + as--; + + if (force > 21) { + force -= 10; + as = 0; + } + } + + // Edge Case = BlackJack + // Check if a 21 is a BlackJack (As + 10) or a combination of 3 cards + // (simple 21) + if (force == 21) { + + boolean isAs = false; + boolean is10 = false; + boolean isOther = false; + + for (Carte carte : Hand) { + + switch (carte.getForce()) { + case 1: + isAs = true; + break; + case 10: + is10 = true; + break; + default: + isOther = true; + break; + } + } + + if (isAs && is10 && !isOther) { + return 99; + } + } + + return force; + } + + public void ShowHand() { + + for (Carte carte : Hand) { + + System.out.print(carte.getNomComplet() + " "); + + } + + System.out.println(""); + } + + // Not used but asked for Part 2 + @Override + public int compareTo(Hand otherHand) { + + int Hand_1_Strength = this.GetStrength(); + int Hand_2_Strength = otherHand.GetStrength(); + + if (Hand_1_Strength > Hand_2_Strength) { + return 1; + } else if (Hand_1_Strength < Hand_2_Strength) { + return -1; + } else { + return 0; + } + + } +} diff --git a/Partie_3_Terminal/src/main/java/ch/hepia/JeudeCarte.java b/Partie_3_Terminal/src/main/java/ch/hepia/JeudeCarte.java new file mode 100644 index 0000000..e6bd3c6 --- /dev/null +++ b/Partie_3_Terminal/src/main/java/ch/hepia/JeudeCarte.java @@ -0,0 +1,123 @@ +package ch.hepia; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class JeudeCarte { + + private List<Carte> jeuDeCartes; + + public JeudeCarte(int nb) { + + jeuDeCartes = new ArrayList<>(); + + for (COULEUR couleur : COULEUR.values()) { + + for (int rang = 7; rang <= (nb / 4) + 6; rang++) { + + if (rang > 13) { + jeuDeCartes.add(new Carte(couleur, rang - 13)); + } else { + jeuDeCartes.add(new Carte(couleur, rang)); + } + + } + + } + + if (nb % 4 != 0) { + + for (int x = 0; x < nb % 4; x++) { + + jeuDeCartes.add(new Carte(COULEUR.carreau, 0)); + + } + } + + Collections.sort(jeuDeCartes, new Comparator<Carte>() { + + public int compare(Carte carte1, Carte carte2) { + + int comparaisonCouleur = carte1.getCouleur().compareTo(carte2.getCouleur()); + + if (comparaisonCouleur == 0) { + + return Integer.compare(carte1.getRang(), carte2.getRang()); + + } else { + + return comparaisonCouleur; + } + } + + }); + + } + + public JeudeCarte(Paquet paquet) { + + jeuDeCartes = new ArrayList<>(); + + List<JeudeCarte> paquets = paquet.getPaquet(); + + for (JeudeCarte deck : paquets) { + List<Carte> cartes = deck.getCartes(); + jeuDeCartes.addAll(cartes); + } + + } + + public List<Carte> getCartes() { + return this.jeuDeCartes; + } + + public Carte GetTopCarteOfGame() { + + return this.jeuDeCartes.get(0); + + } + + public void AddCarteToGame(Carte... cartes) { + + for (Carte carte : cartes) { + + this.jeuDeCartes.add(carte); + + } + } + + public void RemoveCarteFromGame(Carte... cartes) { + + for (Carte carte : cartes) { + + this.jeuDeCartes.remove(carte); + + } + } + + public void shuffle() { + + Collections.shuffle(jeuDeCartes); + + } + + public int GetNbCards() { + return this.jeuDeCartes.size(); + } + + public void ShowPaquet() { + + System.out.println("------- Paquet -------"); + + for (Carte carte : jeuDeCartes) { + + System.out.println(carte.getNomComplet()); + + } + + System.out.println("----------------------"); + } + +} diff --git a/Partie_3_Terminal/src/main/java/ch/hepia/Joueur.java b/Partie_3_Terminal/src/main/java/ch/hepia/Joueur.java new file mode 100644 index 0000000..e69d341 --- /dev/null +++ b/Partie_3_Terminal/src/main/java/ch/hepia/Joueur.java @@ -0,0 +1,761 @@ +package ch.hepia; + +import java.util.ArrayList; + +interface Joueur { + + // Get the Computer Player Strategy + public int GetStrategy(); + + // Add amount of money to the player balance + public void AddMoney(double amount); + + // Remove amount of money from the player balance + public void RemoveMoney(double amount); + + // Get the current balance of the player + public double GetMoney(); + + // Set bet amount on specific player hand + public void SetBet(double amount, int handNb); + + // Get the bet amount from specific hand + public double GetBet(int handNb); + + // Draw 1 card in specific hand from specific Deck + public void DrawCard(int handNb, JeudeCarte Jeu); + + // Get a specific card strength from a specific hand + public int GetCardStrength(int handNb, int cardNb); + + // Get number of cards in specific hand + public int GetNbCards(int handNb); + + // Show specific hand in terminal + public void ShowHand(int handNb); + + // Show all hands in terminal + public void ShowHands(); + + // Get the number of hands of the player + public int GetNbHands(); + + // Get the strength of a specific hand + public int GetStrength(int handNb); + + // Double the bet on specific hand + public void Double(int handNb, JeudeCarte Jeu); + + // Check if a specific hand has been doubled + public boolean HasDoubled(int handNb); + + // Check if a specific hand can be split + public boolean CanSplit(int handNb); + + // Split a specific hand + public void Split(int handNb, JeudeCarte Jeu); + + // Check if a specific hand was splitted + public boolean HasSplit(int handNb); + + // Insure the player + public void Insure(); + + // Get player insured amount + public double GetInsured(); + + // Has the player insured himself + public boolean HasInsured(); + + // Reset player for next turn + public void Reset(JeudeCarte Jeu); +} + +// Human Player +class JoueurHumain implements Joueur { + + private ArrayList<Hand> Hands; + private double Money; + private double Insurance; + private boolean Insured; + + public JoueurHumain(JeudeCarte Jeu, double Money) { + + this.Hands = new ArrayList<>(); + + // At creation, player get's 1 hand with 2 cards + this.Hands.add(new Hand(Jeu, 2)); + + this.Hands.get(0).SetBet(0); + + this.Money = Money; + this.Insurance = 0; + this.Insured = false; + } + + public int GetStrategy() { + // Human player has no strategy + throw new RuntimeException("Humain Player has no Strategy."); + } + + public void AddMoney(double amount) { + + // Check if the amount is positif and that it will not create an Overflow + if (amount < 0) { + throw new RuntimeException("Can't add negative amount of Money."); + } else if (this.Money > 0 && this.Money + amount < 0) { + throw new RuntimeException("Money Overflow."); + } + + // Add money to current balance + this.Money += amount; + } + + public void RemoveMoney(double amount) { + + // Check if the amount is positif and that it will not create an Underflow + if (amount < 0) { + throw new RuntimeException("Can't subtract negative amount of Money."); + } else if (this.Money < 0 && this.Money + amount > 0) { + throw new RuntimeException("Money Underflow."); + } + + // Remove money from current balance + this.Money -= amount; + } + + public double GetMoney() { + return this.Money; + } + + public void SetBet(double amount, int handNb) { + + // Check if the amount is positif + if (amount <= 0) { + throw new RuntimeException("Can't bet a negative or null amount."); + } + // Check if the player has enough money in his balance + else if (amount > this.Money) { + throw new RuntimeException("Can't bet more than the Money you have."); + } + + // Check if the hand ID is valide + if (handNb < 0 || handNb > Hands.size()) { + throw new RuntimeException("Hand number not valid."); + } + + // Remove amount from player balance + this.Money -= amount; + + // Set bet on player hand + this.Hands.get(handNb).SetBet(amount); + } + + public double GetBet(int handNb) { + + // Check if the hand ID is valide + if (handNb < 0 || handNb > Hands.size()) { + throw new RuntimeException("Hand number not valid."); + } + + // Get the bet amount on this hand + return this.Hands.get(handNb).GetBet(); + } + + public void DrawCard(int handNb, JeudeCarte Jeu) { + + // Check if the hand ID is valide + if (handNb < 0 || handNb > Hands.size()) { + throw new RuntimeException("Hand number not valid."); + } + + // Draw 1 card from of Deck in hand + this.Hands.get(handNb).DrawCardFromGame(Jeu); + } + + public int GetCardStrength(int handNb, int cardNb) { + return this.Hands.get(handNb).GetCarte(cardNb).getForce(); + } + + public int GetNbCards(int handNb) { + return this.Hands.get(handNb).NbCard(); + } + + public void ShowHand(int handNb) { + + // Check if the hand ID is valide + if (handNb < 0 || handNb > Hands.size()) { + throw new RuntimeException("Hand number not valid."); + } + + // Show hand in terminal + this.Hands.get(handNb).ShowHand(); + } + + public void ShowHands() { + + // Go threw all hands + for (Hand hand : this.Hands) { + + // Show the hand in terminal + hand.ShowHand(); + } + } + + public int GetNbHands() { + return this.Hands.size(); + } + + public int GetStrength(int handNb) { + + // If the strength is a BlackJack + // AND + // The hand was splitted + // OR + // It's not the 1rst hand + // OR + // There are more than 2 cards in the hand + if (this.Hands.get(handNb).GetStrength() == 99 + && (this.Hands.get(handNb).HasSplit() || handNb != 0 || this.Hands.get(handNb).NbCard() != 2)) { + // Than it is not a BlackJack but a simple 21 + return 21; + } else { + return this.Hands.get(handNb).GetStrength(); + } + + } + + public void Double(int handNb, JeudeCarte Jeu) { + + // Remove bet amount from money + this.RemoveMoney(this.Hands.get(handNb).GetBet()); + + // Double the bet in the hand + this.Hands.get(handNb).Double(); + + // If hte player doubles a hand he must draw 1 card + this.Hands.get(handNb).DrawCardFromGame(Jeu); + } + + public boolean HasDoubled(int handNb) { + return this.Hands.get(handNb).HasDoubled(); + } + + public boolean CanSplit(int handNb) { + + // Hand can be split + // If it hasn't already been spit with an As + // AND + // if the 2 cards are the same + // AND + // if there is only 2 cards in the hands + if (!(this.Hands.get(handNb).HasSplit() && this.Hands.get(handNb).GetCarte(0).getForce() == 1) + && this.Hands.get(handNb).GetCarte(0).getForce() == this.Hands.get(handNb).GetCarte(1).getForce() + && this.Hands.get(handNb).NbCard() == 2) { + return true; + } + + return false; + } + + public void Split(int handNb, JeudeCarte Jeu) { + + // Player can only have 3 hands + if (this.Hands.size() == 3) { + throw new RuntimeException("Max number of splits."); + } + + // Get the 2nd card of the hand we want to split + Carte card = this.Hands.get(handNb).GetCarte(1); + + // Create a new hand with this card in it + this.Hands.add(new Hand(card)); + + // Remove the card from the 1rst hand + this.Hands.get(handNb).RemoveCardFromHand(card); + + // Set the hand as splitted + this.Hands.get(handNb).Splitted(); + + // Set the new hand as splitted + this.Hands.get(this.Hands.size() - 1).Splitted(); + + // Set the bet of the new hand to the same as the splitted hand + this.Hands.get(this.Hands.size() - 1).SetBet(this.Hands.get(handNb).GetBet()); + + // Remove the money from the player balance + this.RemoveMoney(this.Hands.get(handNb).GetBet()); + + // Draw 1 card in each hands + this.Hands.get(handNb).DrawCardFromGame(Jeu); + this.Hands.get(this.Hands.size() - 1).DrawCardFromGame(Jeu); + } + + public boolean HasSplit(int handNb) { + return this.Hands.get(handNb).HasSplit(); + } + + public void Insure() { + + this.Insured = true; + + // Set the insurance the half the bet of the only player hand + this.Insurance = this.Hands.get(0).GetBet() / 2; + + // Remove the insurance from the player balance + this.RemoveMoney(this.Insurance); + } + + public double GetInsured() { + return this.Insurance; + } + + public boolean HasInsured() { + return this.Insured; + } + + public void Reset(JeudeCarte Jeu) { + + this.Insured = false; + + // Reset hands + this.Hands = new ArrayList<>(); + + // Draw 2 card from Deck + this.Hands.add(new Hand(Jeu, 2)); + + this.Hands.get(0).SetBet(0); + } +} + +// Computer Player +class JoueurOrdinateur implements Joueur { + + private ArrayList<Hand> Hands; + private double Money; + private double Insurance; + private boolean Insured; + + /* + * 1 = Smart + * 2 = Stupid + */ + private int Strategy; + + public JoueurOrdinateur(JeudeCarte Jeu, double Money, int Strategy) { + + this.Hands = new ArrayList<>(); + + // At creation, player get's 1 hand with 2 cards + Hands.add(new Hand(Jeu, 2)); + + Hands.get(0).SetBet(0); + + this.Money = Money; + this.Insurance = 0; + this.Insured = false; + + this.Strategy = Strategy; + } + + public int GetStrategy() { + return this.Strategy; + } + + public void AddMoney(double amount) { + + // Check if the amount is positif and that it will not create an Overflow + if (amount < 0) { + throw new RuntimeException("Can't add negative amount of Money."); + } else if (this.Money > 0 && this.Money + amount < 0) { + throw new RuntimeException("Money Overflow."); + } + + // Add amount from current player balance + this.Money += amount; + } + + public void RemoveMoney(double amount) { + + // Check if the amount is positif and that it will not create an Underflow + if (amount < 0) { + throw new RuntimeException("Can't subtract negative amount of Money."); + } else if (this.Money < 0 && this.Money + amount > 0) { + throw new RuntimeException("Money Underflow."); + } + + // Remove amount from current player balance + this.Money -= amount; + } + + public double GetMoney() { + return this.Money; + } + + public void SetBet(double amount, int handNb) { + + // Check if the amount is positif + if (amount <= 0) { + throw new RuntimeException("Can't bet a negative or null amount."); + } + // Check if the player has enough money in his balance + else if (amount > this.Money) { + throw new RuntimeException("Can't bet more than the Money you have."); + } + + // Check if the hand ID is valide + if (handNb < 0 || handNb > Hands.size()) { + throw new RuntimeException("Hand number not valid."); + } + + // Remove amount from player balance + this.Money -= amount; + + // Set bet on player hand + this.Hands.get(handNb).SetBet(amount); + } + + public double GetBet(int handNb) { + + // Check if the hand ID is valide + if (handNb < 0 || handNb > Hands.size()) { + throw new RuntimeException("Hand number not valid."); + } + + // Get the bet amount on this hand + return this.Hands.get(handNb).GetBet(); + } + + public void DrawCard(int handNb, JeudeCarte Jeu) { + + // Check if the hand ID is valide + if (handNb < 0 || handNb > Hands.size()) { + throw new RuntimeException("Hand number not valid."); + } + + // Draw 1 card from of Deck in hand + this.Hands.get(handNb).DrawCardFromGame(Jeu); + } + + public int GetCardStrength(int handNb, int cardNb) { + return this.Hands.get(handNb).GetCarte(cardNb).getForce(); + } + + public int GetNbCards(int handNb) { + return this.Hands.get(handNb).NbCard(); + } + + public void ShowHand(int handNb) { + + // Check if the hand ID is valide + if (handNb < 0 || handNb > Hands.size()) { + throw new RuntimeException("Hand number not valid."); + } + + // Show hand in terminal + this.Hands.get(handNb).ShowHand(); + } + + public void ShowHands() { + + // Go threw all hands + for (Hand hand : this.Hands) { + + // Show the hand in terminal + hand.ShowHand(); + } + } + + public int GetNbHands() { + return this.Hands.size(); + } + + public int GetStrength(int handNb) { + + // If the strength is a BlackJack + // AND + // The hand was splitted + // OR + // It's not the 1rst hand + // OR + // There are more than 2 cards in the hand + if (this.Hands.get(handNb).GetStrength() == 99 + && (this.Hands.get(handNb).HasSplit() || handNb != 0 || this.Hands.get(handNb).NbCard() != 2)) { + // Than it is not a BlackJack but a simple 21 + return 21; + } else { + return this.Hands.get(handNb).GetStrength(); + } + + } + + public void Double(int handNb, JeudeCarte Jeu) { + + // Remove bet amount from money + this.RemoveMoney(this.Hands.get(handNb).GetBet()); + + // Double the bet in the hand + this.Hands.get(handNb).Double(); + + // If hte player doubles a hand he must draw 1 card + this.Hands.get(handNb).DrawCardFromGame(Jeu); + } + + public boolean HasDoubled(int handNb) { + return this.Hands.get(handNb).HasDoubled(); + } + + public boolean CanSplit(int handNb) { + + // Hand can be split + // If it hasn't already been spit with an As + // AND + // if the 2 cards are the same + // AND + // if there is only 2 cards in the hands + if (!(this.Hands.get(handNb).HasSplit() && this.Hands.get(handNb).GetCarte(0).getForce() == 1) + && this.Hands.get(handNb).GetCarte(0).getForce() == this.Hands.get(handNb).GetCarte(1).getForce() + && this.Hands.get(handNb).NbCard() == 2) { + return true; + } + + return false; + } + + public void Split(int handNb, JeudeCarte Jeu) { + + // Player can only have 3 hands + if (this.Hands.size() == 3) { + throw new RuntimeException("Max number of splits."); + } + + // Get the 2nd card of the hand we want to split + Carte card = this.Hands.get(handNb).GetCarte(1); + + // Create a new hand with this card in it + this.Hands.add(new Hand(card)); + + // Remove the card from the 1rst hand + this.Hands.get(handNb).RemoveCardFromHand(card); + + // Set the hand as splitted + this.Hands.get(handNb).Splitted(); + + // Set the new hand as splitted + this.Hands.get(this.Hands.size() - 1).Splitted(); + + // Set the bet of the new hand to the same as the splitted hand + this.Hands.get(this.Hands.size() - 1).SetBet(this.Hands.get(handNb).GetBet()); + + // Remove the money from the player balance + this.RemoveMoney(this.Hands.get(handNb).GetBet()); + + // Draw 1 card in each hands + this.Hands.get(handNb).DrawCardFromGame(Jeu); + this.Hands.get(this.Hands.size() - 1).DrawCardFromGame(Jeu); + } + + public boolean HasSplit(int handNb) { + return this.Hands.get(handNb).HasSplit(); + } + + public void Insure() { + + this.Insured = true; + + // Set the insurance the half the bet of the only player hand + this.Insurance = this.Hands.get(0).GetBet() / 2; + + // Remove the insurance from the player balance + this.RemoveMoney(this.Insurance); + } + + public double GetInsured() { + return this.Insurance; + } + + public boolean HasInsured() { + return this.Insured; + } + + public void Reset(JeudeCarte Jeu) { + + this.Insured = false; + + // Reset hands + this.Hands = new ArrayList<>(); + + // Draw 2 card from Deck + this.Hands.add(new Hand(Jeu, 2)); + + this.Hands.get(0).SetBet(0); + } +} + +// Dealer +class JoueurCroupier implements Joueur { + + private Hand Hand; + + public JoueurCroupier(JeudeCarte Jeu) { + this.Hand = new Hand(Jeu, 1); + } + + public int GetStrategy() { + // Dealer has no strategy + throw new RuntimeException("Dealer has no Strategy."); + } + + public void AddMoney(double amount) { + // Dealer has infinite amount of money + throw new RuntimeException("Dealer has no Money."); + } + + public void RemoveMoney(double amount) { + // Dealer has infinite amount of money + throw new RuntimeException("Dealer has no Money."); + } + + public double GetMoney() { + // Dealer has infinite amount of money + throw new RuntimeException("Dealer has no Money."); + } + + public void SetBet(double amount, int handNb) { + // Dealer doesn't bet + throw new RuntimeException("Dealer doesn't Bet."); + } + + public double GetBet(int handNb) { + // Dealer doesn't bet + throw new RuntimeException("Dealer doesn't Bet."); + } + + public void DrawCard(int handNb, JeudeCarte Jeu) { + + // Dealer has only 1 hand + if (handNb != 0) { + throw new RuntimeException("Dealer has only 1 hand."); + } + + // Draw 1 card from of Deck in hand + this.Hand.DrawCardFromGame(Jeu); + } + + public int GetCardStrength(int handNb, int cardNb) { + return this.Hand.GetCarte(cardNb).getForce(); + } + + public int GetNbCards(int handNb) { + return this.Hand.NbCard(); + } + + public void ShowHand(int handNb) { + + // Dealer has only 1 hand + if (handNb != 0) { + throw new RuntimeException("Dealer has only 1 hand."); + } + + // Show hand in terminal + this.Hand.ShowHand(); + } + + public void ShowHands() { + + // Show hand in terminal (only 1 for the Dealer) + this.Hand.ShowHand(); + } + + public int GetNbHands() { + + // Dealer has only 1 hand + return 1; + } + + public int GetStrength(int handNb) { + + // Dealer has only 1 hand + if (handNb != 0) { + throw new RuntimeException("Bank has only 1 hand."); + } + + // If the strength is a BlackJack + // AND + // The hand was splitted + // OR + // It's not the 1rst hand + // OR + // There are more than 2 cards in the hand + if (this.Hand.GetStrength() == 99 + && (this.Hand.HasSplit() || handNb != 0 || this.Hand.NbCard() != 2)) { + // Than it is not a BlackJack but a simple 21 + return 21; + } else { + return this.Hand.GetStrength(); + } + + } + + public void Double(int handNb, JeudeCarte Jeu) { + // Dealer does not bet + throw new RuntimeException("Dealer can't Double."); + } + + public boolean HasDoubled(int handNb) { + // Dealer does not bet + throw new RuntimeException("Dealer can't Double."); + } + + public boolean CanSplit(int handNb) { + // Dealer can't split + throw new RuntimeException("Dealer can't Split."); + } + + public void Split(int handNb, JeudeCarte Jeu) { + // Dealer can't split + throw new RuntimeException("Dealer can't Split."); + + } + + public boolean HasSplit(int handNb) { + // Dealer can't split + throw new RuntimeException("Dealer can't split."); + } + + public void Insure() { + // Dealer can't insure himself against himself + throw new RuntimeException("Dealer can't get Insurance."); + } + + public double GetInsured() { + // Dealer can't insure himself against himself + throw new RuntimeException("Dealer can't get Insurance."); + } + + public boolean HasInsured() { + // Dealer can't insure himself against himself + throw new RuntimeException("Dealer can't get Insurance."); + + } + + public void Reset(JeudeCarte Jeu) { + + // Create a new hand with 1 card + this.Hand = new Hand(Jeu, 1); + } + + // Check if the Dealer only has an As in this hand (for Insurance) + public boolean HasOnlyAs() { + + // If the first card in hand is an As + // AND + // There is only 1 card in the hand + if (this.Hand.GetCarte(0).getNomRang() == "As" && this.Hand.NbCard() == 1) { + return true; + } + + return false; + } + +} diff --git a/Partie_3_Terminal/src/main/java/ch/hepia/Paquet.java b/Partie_3_Terminal/src/main/java/ch/hepia/Paquet.java new file mode 100644 index 0000000..43311c5 --- /dev/null +++ b/Partie_3_Terminal/src/main/java/ch/hepia/Paquet.java @@ -0,0 +1,25 @@ +package ch.hepia; + +import java.util.List; +import java.util.ArrayList; + +public class Paquet { + + private List<JeudeCarte> paquet; + + public Paquet(int nb_paquet, int nb_carte) { + + paquet = new ArrayList<>(); + + for (int i = 0; i < nb_paquet; ++i) { + JeudeCarte jeuDeCarte = new JeudeCarte(nb_carte); + jeuDeCarte.shuffle(); + paquet.add(jeuDeCarte); + } + + } + + public List<JeudeCarte> getPaquet() { + return paquet; + } +} diff --git a/Partie_3_Terminal/src/main/java/ch/hepia/Save.java b/Partie_3_Terminal/src/main/java/ch/hepia/Save.java new file mode 100644 index 0000000..d66eaa2 --- /dev/null +++ b/Partie_3_Terminal/src/main/java/ch/hepia/Save.java @@ -0,0 +1,100 @@ +package ch.hepia; + +import com.opencsv.CSVWriter; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; + +public class Save { + + public void save(ArrayList<Joueur> Players, int ComputerPlayers) { + + String filePath = "save.csv"; + + File file = new File(filePath); + + try { + // Create FileWriter object + FileWriter outputfile = new FileWriter(file); + + // Create CSVWriter object filewriter + CSVWriter writer = new CSVWriter(outputfile, ',', + CSVWriter.NO_QUOTE_CHARACTER, + CSVWriter.DEFAULT_ESCAPE_CHARACTER, + CSVWriter.DEFAULT_LINE_END); + + String[] data = { "Human", Double.toString(Players.get(0).GetMoney()), "0" }; + + writer.writeNext(data); + + for (int x = 1; x <= ComputerPlayers; x++) { + + data[0] = "Player_" + x; + data[1] = Double.toString(Players.get(x).GetMoney()); + data[2] = Integer.toString(Players.get(x).GetStrategy()); + + writer.writeNext(data); + } + + // Closing writer connection + writer.close(); + + } catch (IOException e) { + e.printStackTrace(); + } + + } + + public ArrayList<Double> loadMoney() { + + File file = new File("save.csv"); + + ArrayList<Double> Money = new ArrayList<>(); + + try { + + List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); + + for (String string : lines) { + + String[] array = string.split(","); + + Money.add(Double.valueOf(array[1])); + } + + } catch (IOException e) { + e.printStackTrace(); + } + + return Money; + } + + public ArrayList<Integer> loadStrategy() { + + File file = new File("save.csv"); + + ArrayList<Integer> Strategy = new ArrayList<>(); + + try { + + List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); + + for (String string : lines) { + + String[] array = string.split(","); + + Strategy.add(Integer.valueOf(array[2])); + } + + } catch (IOException e) { + e.printStackTrace(); + } + + return Strategy; + } +} diff --git a/Partie_3_Terminal/src/test/java/ch/hepia/JoueurTest.java b/Partie_3_Terminal/src/test/java/ch/hepia/JoueurTest.java new file mode 100644 index 0000000..836b221 --- /dev/null +++ b/Partie_3_Terminal/src/test/java/ch/hepia/JoueurTest.java @@ -0,0 +1,302 @@ +package ch.hepia; + +import static org.junit.Assert.*; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import org.junit.Test; + +public class JoueurTest { + + @Test + public void testAddMoney() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + joueur.AddMoney(100); + + assertEquals(100, joueur.GetMoney(), 0); + } + + @Test + public void testAddZeroMoney() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + joueur.AddMoney(0); + + assertEquals(0, joueur.GetMoney(), 0); + } + + @Test + public void testAddNegativeMoney() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertThrows(RuntimeException.class, () -> joueur.AddMoney(-50)); + } + + @Test + public void testRemoveMoney() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 100); + joueur.RemoveMoney(10); + + assertEquals(90, joueur.GetMoney(), 0); + } + + @Test + public void testRemoveZeroMoney() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + joueur.RemoveMoney(0); + + assertEquals(0, joueur.GetMoney(), 0); + } + + @Test + public void testRemoveNegativeMoney() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 100); + + assertThrows(RuntimeException.class, () -> joueur.RemoveMoney(-50)); + } + + @Test + public void testAddBet() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 100); + joueur.SetBet(10, 0); + + assertEquals(10, joueur.GetBet(0), 0); + } + + @Test + public void testAddNegativeBet() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 100); + + assertThrows(RuntimeException.class, () -> joueur.SetBet(-10, 0)); + } + + @Test + public void testAddTooBigBet() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 100); + + assertThrows(RuntimeException.class, () -> joueur.SetBet(101, 0)); + } + + @Test + public void testAddBetWrongHand() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 100); + + assertThrows(RuntimeException.class, () -> joueur.SetBet(1, 1)); + } + + @Test + public void testGetBetWrongHand() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 100); + joueur.SetBet(10, 0); + + assertThrows(RuntimeException.class, () -> joueur.GetBet(1)); + } + + @Test + public void testDrawCard() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + joueur.DrawCard(0, Deck); + + assertEquals(3, joueur.GetNbCards(0)); + } + + @Test + public void testDrawCardWrongHand() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(6, 52)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertThrows(RuntimeException.class, () -> joueur.DrawCard(1, Deck)); + } + + @Test + public void testCardStrength() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertEquals(0, joueur.GetCardStrength(0, 0)); + } + + @Test + public void testCardStrengthWrongCard() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertThrows(RuntimeException.class, () -> joueur.GetCardStrength(0, 2)); + } + + @Test + public void testCardStrengthWrongHand() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertThrows(RuntimeException.class, () -> joueur.GetCardStrength(1, 0)); + } + + @Test + public void testCardCount() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertEquals(2, joueur.GetNbCards(0)); + } + + @Test + public void testCardCountWrongHand() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertThrows(RuntimeException.class, () -> joueur.GetNbCards(1)); + } + + @Test + public void testShowHand() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + + joueur.ShowHand(0); + + System.setOut(System.out); + String printedOutput = outputStreamCaptor.toString().trim(); + + assertTrue(printedOutput.contains("๐ ๐")); + } + + @Test + public void testWrongShowHand() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertThrows(RuntimeException.class, () -> joueur.ShowHand(1)); + } + + @Test + public void testShowHands() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + + joueur.ShowHands(); + + System.setOut(System.out); + String printedOutput = outputStreamCaptor.toString().trim(); + + assertTrue(printedOutput.contains("๐ ๐")); + } + + @Test + public void testNumberHands() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertEquals(1, joueur.GetNbHands()); + } + + @Test + public void testHandStrength() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertEquals(0, joueur.GetStrength(0)); + } + + @Test + public void testWrongHandStrength() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertThrows(RuntimeException.class, () -> joueur.GetStrength(1)); + } + + @Test + public void testDoubled() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertEquals(false, joueur.HasDoubled(0)); + } + + @Test + public void testCanSplit() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 2)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + assertEquals(true, joueur.CanSplit(0)); + } + + @Test + public void testCantSplit() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 3)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + joueur.DrawCard(0, Deck); + + assertEquals(false, joueur.CanSplit(0)); + } + + @Test + public void testSplit() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 5)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + joueur.Split(0, Deck); + + assertEquals(true, joueur.HasSplit(0)); + } + + @Test + public void testSplitMax() { + + JeudeCarte Deck = new JeudeCarte(new Paquet(1, 15)); + JoueurHumain joueur = new JoueurHumain(Deck, 0); + + joueur.Split(0, Deck); + joueur.Split(1, Deck); + + assertThrows(RuntimeException.class, () -> joueur.Split(0, Deck)); + } +} diff --git a/Partie_3_Terminal/target/classes/ch/hepia/App.class b/Partie_3_Terminal/target/classes/ch/hepia/App.class new file mode 100644 index 0000000000000000000000000000000000000000..aad0e41606823ab879200272efe2f63852dccb72 GIT binary patch literal 3474 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 HmsL9ehE+B8 literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/COULEUR.class b/Partie_3_Terminal/target/classes/ch/hepia/COULEUR.class new file mode 100644 index 0000000000000000000000000000000000000000..c582fd28bd308c74abcc31d7c543625ab96af75b GIT binary patch literal 1075 zcmX^0Z`VEs1_lQPD|QAZMh1c84E>DMg3LsHXa7(i*U%tN21W)J9tKthHbw^4<owjq zB1Q%wA9PjLAY~jp44fck?8%8mMX8CUATe$p1|E<YYe8mVX(~vBkB5ODB*Iowl$w?U z782xP5MmH!WMEebbMy&y4Q6Bzj>fcti$Rn@jGaN4he4b{0_2#S{Jc~~1`!QSpRB~P zME#t^ymWp4q^#8B5^F97DF$hF1{od(Sq3>q20nxW*SykPMh5n>#GKMp|1?GhQw=2D z&N+$2#nwmy!6ikRdFj^3Hh>HOo3Fsbpva)a$iQZknU`5&$H*XtY!p<dr)C%j11lE; zBZC4511ARq4+jH3h^NWJpv9mK@-o;Z#f%K18k$%<&B(w8Q^4Y!pOVVR!0(fpm+DuV zo0M7<l9-f}%E+LG#a>O!@B_tLesW??SYlBoNF!7?OI~7bDo73yMo_miGO(0nWEL|r za0X|l=Ovbu7Ns&WFl%UrF*0!2B<DbVt%4L>ps=yQwAs#@k%22XzqBYh)h!d`VlL;z zqLNfSkc|!o42%p?3=9mc4w9f$#=zhp2}(v_numc6O!I?i0Vz-_0jXr*WYA&IW?*E{ zWnf@XVqjzd0j^C90^1lw4lsyrU|?WiWYA+^U|<8wF*9&7$TH|d)tfLdfknB57`1jV zNFHEd1gU32QE$M&z`z4h#bC%_#K6G71d3}0Ca{f$49pD73=9nHTG}$(8RR#DrID>e zXlG|I205L<1gyqXfD07sP=}Z@uz=jnAj`g&fiaSK69aQ_B+DiS_TWg?O$=PYk!+h7 zc!NQ1L-h*>gBgP<)QDuL5!SmI7$b$0nYS~jY-V5vb5vQt9Ck2AjTOw{0&~>az#QHk v3>upm1VFBbSRls0%D}+D!obVG${@wS#-Pr?&S1j8%)kV7y*Yyg*cX-n^pnST literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/Carte.class b/Partie_3_Terminal/target/classes/ch/hepia/Carte.class new file mode 100644 index 0000000000000000000000000000000000000000..f2e1b3556ab535a9579d8c800c12eb799aff3d01 GIT binary patch literal 2702 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 literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/GameManager.class b/Partie_3_Terminal/target/classes/ch/hepia/GameManager.class new file mode 100644 index 0000000000000000000000000000000000000000..0ae3f3d24bc760587c947162801cc9ccb6df14b6 GIT binary patch literal 18901 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 HF-QUccl)VU literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/Hand$1.class b/Partie_3_Terminal/target/classes/ch/hepia/Hand$1.class new file mode 100644 index 0000000000000000000000000000000000000000..2214bf48295c2e99569934bb083314370d6c1499 GIT binary patch literal 1125 zcmX^0Z`VEs1_lQPJ1zz$24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SE(Q(;PId+^9tLg(9!3Vf<P80c)Pl@JedolYl2k?puJqIr=ls%~)Y2kG z1`!QSAA|z`P#@ROAZsoLJ_dev1_2%hK?Wg41_5*hj0~K~`MCv&MX4eAj10mWJ_r}N z=9T7JYkGp*Ai~2S${@zbz@DC35|o&i4tAX<7lQ<YBs+r?4}&y=3?qXeLaS$9Nosm( z5hDXT)Nn=yRt-;2kYRER^6U%>AT5fF4E%8CcqHbfs2DObC~F}30pv+*biSr1JA*PK zg9zBR(vr*^eP^%-5=-)n7#W0+^n=W_)(m50U~$e*No8c<_sPsl^()OyN-YXWOv*`R zWDxSnPfpAUODxI+@u7k&B^jB;j0}PZi$Mmd7+Nzjuz{ph3_wPqxEv&v405d@BZB}! zA2^oaaz=~{LXhA{%q-5&gU1`ACnE!Ia7kivwr^qq)D7y$5dldW)<{tU718u$WZ(?W zOwUU!DJ@E6WU#_i0uezACL44o+F3I)a0Ta=7A2>;Wr6~R6Xaz*P!KaR@Vn+E=j0b> z=B4|lmSp6ourpXPGVr4KpNGL3l$<$&^NUJAIvE)_{8EccJo1Z67#Vmx^YT)QoO2S3 zi&Kjk6d2?fm>3utlo%Kom>C!tSQ%6p7#UO<7#J)W7#WyAB3j!S7&kI7FfcKwF)%Q& zF)%VPFcdJTGcYiSK@>1(FlaJ>04swQgEj*r10#bpgCf+JItC^N76t|eIqhu>>^j>R z*taq8+R4sh;Md;9Agr^EL3js)_!`+YVCzBV3xQRaFz_&xF$geJFvu{}fbG%(i_5|7 zl4H<e&;`3ijzNz>mw}0ahe3!zpTU5EnZXd^&OZz?i~^1f(hNpWx0o|9gFVTsrG0>b zL+1bk$2JDA)tFx60UON=wT_j+7#sj545nb(jKQ3Nfq{j=g29Tx1}tL1V9UV3z{SAG KAO{Kw1_l5eRqtm2 literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/Hand.class b/Partie_3_Terminal/target/classes/ch/hepia/Hand.class new file mode 100644 index 0000000000000000000000000000000000000000..6e99640898ba7d7dacac297d9754b15afd0dc13e GIT binary patch literal 4822 zcmX^0Z`VEs1_lR)!(0qZ49x5dEIbUX3~Y=H0$GV=iTXK-dFlH8Nm;4MC5#MgHko;u zC3cJq%o>_u><k=?48mYVr6rj;`i@0KiIqN?#U)$}><rAD4BQMn><qj-415gyj10WV z8TuKi1(}KZ9*KD=j0`LgO4J97eru2cf;<dD48n{I%!w%}j0~b05QRvtvDS<N*&)iq zAjTlh$iNX?kds+blA6NEzzCL*<YABkNwB-*mnP+;rhpX7@G!_S$T2c7JEfK|GBCPu zF>o^|@GvMcC^0e!xD+LpJ0}*UxE1B+x+mtQGBQYN_`sd*m0FsT>YP|ql4|X#8OG+o z00AJUs_`(WGiWd}uoP!jrGmr8lbu0}kwFUVH?Wg~O7luGb5mU_l2Z#xGV}8|7<3pJ zl${gv)JqhSQcD!_QqvPlGRsmG5_9uQ^GX!*(-d;^^HMAIxEM4U^gt1!j}{2QB}JKe z>DHQIAQu?&Fc>iyGcquzgZw3`;i-ukT<i>{j0}8m|A4&$(reDcU;zqfwxZPB{IXOo z1}g?@b_N?B23rO@Mh0QH21EcbG6=e-mW1RNfX(nvg9Mh4h9)Akz%tgL;C0|(aAa^| zWZ-p7Ndbj!NIoRyMKq$(m4p0Z#o)rj;0n?p90Ya`*d$n#fDCj8#g_*og9P@-0i{bX zMh1SkyFu2e7;-UqGWdYP(U*}y2uUYM795EF3<2y6fjkUB48e>HqTrYVr)uZ?oSf8T zP@ENmVmQC3gpolLni|0hKq=lD65L?EbAE0?Vo_pAei7JQc7{+MhA@V3Mh1?|l2oub zBZHU*G=ji7JfY&&+zgQnQS1!SJPa`mv5X8t2v@+AFfy=bBo_OnR+NC#SrkY|JP$(x zLn0#sOCDHQ1ZFlk;X!h)H5Y>kLoyFT3MiR!q^Fj+<rgKVax$bbq_Z<*@GxXDWTE8u z;L75X)Lcde=KRtUMh0jm&CJ&iD9X$$2`(v0P0R%wnZv`7%aF&&z?+_0;+LNb@_G&^ z1){nEnpA}t7#Iq87z!DR7#YNK6SGsD^YfAuOTsftGMw}Cic1pnN{Sg7)SzJtc0E)l zG_a6`xEM+pO4%98co@nV^kKyistXwzSPMYz<zT2}WMBYksODj)0jXvOi|6Ell2aWI zLp>-|xZP91KFdol$pDEr@-Q?pG&3@ACWGTMH6$Nf!trEhXk}y&0Y?<rd7vOjEJ{qu zNo8c<49-l?ODriZN@ZkFM@k{^g3<;(2iRFNGO#%3r=&76@cU%urTUfTCZ!gIK#UXe z$xlwq2}>->1o5GQtjVAviIG77-6%!|mXeIjVvs>7S;3l-feoyun2|vcBMUMz@CKJ8 zCTII57Jw~aXPCgqz>*Fw4Mh=FAj$%3Mh2$5Bt`~CPeukVkHlhVVav$C24OKWaCjsZ zgUe<{1~$JWP!Yh$z!scZ0xp7CG+Z>p7#Y|g#U3LAn>$p3Swqu>k%7ZKwFF!MFfs^( z3N^S-z=BY(r1&K<G6=y-3vl@j%GQhwj1{1IA-|{u!ez-Ub_8YO%wj_WMh5oGV*iqi z)FMU()-+IVU}RuQEC#91$S;Se=gbGmL)iQvD&8<2l=wkOgpmOvVuU1uwUY8=WUz$9 zJve<p^COZ7BE=vj2as*npwz$>oL^d$oa&YdPEa6WJy2p}WZ?EoEiUm*1*MN-Mg{?= z{QQ#QlA^={-_(+f{FGvTHim6n4BHuYururg<+)vq3@RXvkor6`uPi@1RUeYQAlc9@ zF}WnasFIOk266_3DufscvOOoYSj8tlKfAO5TIPX$1u+O&1Vv*=WkD*kBvg4cQYb*f z1v#ffjc`uP$qCLZNwwx+*u%)c#Hhf?z~h;hms;eUlUQ7wTFlO{pOHZo!*AG}%+7F- zkwFf>Qbq<gi2oQA8Mqmk7#JB^7+4sXK&==CMus*91_maEb_ON}Sq3>UTZ};*OiO`j zVTMKqRt6^qMurXs28MkM%nWP{3=Ga%+Zh<Ob~CU?ZfD@!%D|=VtFzCJ*^EV$MRpN` zq>d<ykrk`f76vX!)@=*|;VmqT%l|*uV&2Li0wN@|__i`gZ)9L#U}orKU|>*V;ACK6 z;A3E65MbbE5Moef5Mj_|5MnT9kYKQ2kYuoBkYaFRkY?y&U|>*SU}jKe;9}@z=wV<5 zIfS8?p%2_}ac1aen83iuFp+_QL7ai<KZ7^}D?0->JHsS)hDnT!3=BUQq!}0)SQ(U{ zeko#LW?%*xiRKqAZJBKh@*syoTnln26WF0rV86>UurSCo@G~efh%zWMNHM4|$TO(I z9S3qE%t;CilNqKkFoNu0n948>9QM;0VxjiyGcbbXKmjGO1{~y|&|m`#YJd&o0kc`5 zeq>~r!2ps4MT83jD_BlQi)AZ=gjVDh25Aun<!orULY&J7_MQ#{D}yeBAcG!~i9&D_ zXJU1Z2)c6&ku)QmBL;Vl3D|E83~V6hh#*1?)BtB-FlAt6Fheqd4Q~A`1`TLv7(qjW z1C(sGF{q-uz!FJ62VDPbhB;9E@eC|r?~1AO&6vZ$yPH8XQb>C{gYJGUb!ebK5}ObM z3j+g#Edv{a9fJUaBZDY|6WC-i1||ju1~I6~Al6(4IcRcXW?&RxU}TubFdu4}KGeIQ zsFPlg7Im&*^U$Mi0mDM5W(Ni)uw6VLpGt3IFgU<qvH{HuPp}yfH}SyT#KW+NVHyJ? zLnEjG3N@{XfeD-{Rf)-hpol>Z20sQ7h5!aR20sQBhG4Ljp!_9*l)qHrma8J=FJ1<w ze+(Spd<Du?jSP$7B?M9KF@qKf=<W$;5MhX9kYfmEP+^E6-#v^BiVPmm@QG$%1&6l0 z7Rz1+lSpRmZ48#d+ZgP%QMk?^mmuew1O|SFBnCN#6tF8G5g`u`3wdb923Z6vPRbaV zz)4G(*-lnw5d)u=_BIB$7G}of|38BaM-KK326l!_1|EhC1|fzVumxJ+5?O#@3BxpS zDi(%YB@DHSfk7BrhJXq<P6nnw3`~r_82A|&8J5Dcp&bJYxKt1TC9T~Io{?JH8N7Ee z_<<Y%@f{>X7BKKLG=VLKBvS#Xb&Q~vBP8G$?=mnka4;}19AUO$wgs8DjUmKOcPB#x zBg0GvRo$Hoaf}QH7)-2KBw4mGB(W@DU~6Gwlm>GWY?lAOAuS-fh(TIr9)oxbBUcO4 ze`x{HCI8>HFn(jUUH<>6w1DUWhAd`KoxyAd%0^t<7(%SrB-x-A*nwD38`ve;w=pEG zW?*1Y0cR5iupcEEKuur<200eH<qSM5W-QAY*jUV1m;c`<JCi{`lw~FZw<zl@1~!4@ zHPWEM1QG#73^EK13~k^lkA<O&L4l#0L6f0}L5HD_!Gxio!JJ_dgCoOa1{a2@4DJlm z8GIRLFa$8nWC&$gz!1%_h#{6?F+&2w5{6`kWeiOWD;O3qtYTQiu$o~h!&-(F4C@$H zGi+d3$FP}UBg0mP{S4a}4l(QkhjS1E2ZI8G2)N#2VQ6B|0khZ{Vi{5ymNAGkFf$}D zBrz;!5NBXvNM?v<SOKcOK%ozf877893@gEzpM~K7!zyrP0!j$x4BY=1co-Sk86y8M z$g?w;{AA#g{m&rAz|PLV%?JYQ43P{Be;AC}8BADMe=#uqVqp5g04mN_!;?)nXqbe7 zfx!$K%|6=DSdiC-MYHcFhE$zx4B5LF@);PmF%&QVe{T~*s!+u?hAL3vf&{J@xJus7 zAkA=)L5txqgD%5S22+M(-~a$+A!!DFu(v@atr^r~AWv|EQZolTL*y?86$VC7F9nhY z89JbON=j=RL#?g$HilX|8QCQatSoC}WEU~8GOb}o#H<_xI|Bp583tB{vkY7e=Nb4J zE-(l(Tx1YqxWpjAa0ToLP&Q*=kb+tbVy$8512+mp8P<Zsl#4-tVI4RVf*i)d!1R|v zkdcv1z>%SeVLjAU#?S(sQ%m~*1NSzD29P5l*$Y%XGcd4&ErVn&PN-$9(3aK)22gl0 yF>GSk%)kK7uAU5A7#J8h7#JD0GB7giX4uQXz#zoH#NY{T)_~ev2N(`9NCE)5^!f+@ literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/JeudeCarte$1.class b/Partie_3_Terminal/target/classes/ch/hepia/JeudeCarte$1.class new file mode 100644 index 0000000000000000000000000000000000000000..2735eb7c27de1aa52aa4584d2c1ef9d746a2b524 GIT binary patch literal 1157 zcmX^0Z`VEs1_lQPJ1zz$24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SE(Q(;PId+^9tLg(9!3Vf<P80c)Pl@JedolYl2k?puJqIr=ls%~)Y2kG z1`!QSAA|z`P#@ROAZsoLJ_dev1_2%hK?Wg41_5*hj0~K~`MCv&MX4eAj10mWJ_r}N z=9T7JYkGp*Ai~2S${@zbz@DC35|o&i4tAX<7lQ<YBs+r?4}&y=3?qXeLaS$9Nosm( z5hDXT)Nn=yRt-;2kYRER^6U%>AT5fF45D!7c%_!6q=J2=V#vs#tbybckXNnI`I?^W z49biQB49g9OEPoxox$EnEXgloWRO78k1*L<GmMde#W_DEm63tpCo?bAuQWF)wJ0Pp zDJPYYLC7aRIWZ?Ju_zP7hYGTkWMmdIGKeFrM;NDKXwAsL22!A6z{ntqO$kUrGRXag zj0^$@1z>-|<%}2^gdo9`m|2{k2aiuiPeumb;F84TY~REJsC(3rBM6dYtdXJ&Dx&Gh z$iNw#nVy$eQd*SC$Y6!31R{bKa5m^pw6kVp;0n$!ElN&x%LD}yKf?QZprB`D;CIbS z&dD#%%uDx8Ey>7FVP~*pWDv#@ub?Dv&B(x_;R%Wc4!_jm5|8}i5=I6d&%C_UBIlgM z;^Nd|1_cH=1||kZ1|<dt24)5Z237_Y21W)|1_lO821W)ZkcifH2F8sH3=B*RY77hv zYz&MH3=HZF>I@7FVh{xk8Vs5YAi&C?#h}f=$iT=T&7cT1rjCJ$frWvAK~8%c1G~;P z2KH?Xymqp)82GifF$n8yV-ViKAihR+4cK~+`9fgT+6+7lx(osg`V2A*#$da&z~XXn zyW|*j7<9pIkz>$f&}Cp^;9(GA&}T4UU}i9cxbqK#45NS}gEWH?)Gg)=%wSLQYH1%} z;Lth1z_E=1Y&E9Wc)&*ULak$EFa`&J34<w^He)bnU|?WjuwbxaumOu$FxWCMFmN$2 LGRT2Kf`I`5Swi{a literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/JeudeCarte.class b/Partie_3_Terminal/target/classes/ch/hepia/JeudeCarte.class new file mode 100644 index 0000000000000000000000000000000000000000..ef19fe3892611f8ced9c139e6ced49f24319685c GIT binary patch literal 3202 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 literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/Joueur.class b/Partie_3_Terminal/target/classes/ch/hepia/Joueur.class new file mode 100644 index 0000000000000000000000000000000000000000..cec581d3b0582175934534582a999fa29a5d8288 GIT binary patch literal 663 zcmX^0Z`VEs1_lQPEp`SbMh5=m4E>DMg3LsHul&-~(js;S7Dfhvti-ZJ{hY+SbbbG% ztkmQZMh0&8)RN$mqQsKa^h!nsW(`eGMg|VYloa3mywplY1{Mt$%`ip=?x57%{IXQ2 zAcuQu36#mKq3OcNz!scZ;*?s#$iS-M;t5jE<_;BL(eMN*;BYBQEO$;UN?~M>)bR8{ zxGl9bCDl2xs3g@Iq>bM_wFIOpxTGjGFTErKWT2-f$Vpu8sU?0%Ah}|YqrhSu!5R7G z9*KD=5RouO22PkrG1x0%j0_NcAVtM+ze0^>bIC7F%1LEp;POZ;hOnU~MKLmPI49-> z7vyAu`~;;rJQ9ncOg7KF;?g3JR`=8r2s;I04xGcRp&7-<z#5cV3<?(s4V-@F3eGPr zN=|jl1UZEp5?Okncw%E<U}Rus00A);Mg~>}HU>}}vNLdiX-+83#lQ{b^Dyv&X+8#i zFfG6!2&RP?gu%23gD995V-N?^5)6`HS_*2eG*n&&s!x_d4lFMZr4^v!icr21RKGIR Xeia5)uzEEHbq0{jH5eEem>4txBR_%S literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/JoueurCroupier.class b/Partie_3_Terminal/target/classes/ch/hepia/JoueurCroupier.class new file mode 100644 index 0000000000000000000000000000000000000000..1d0bb3797ec4281bcbc48e36763785c6e864c086 GIT binary patch literal 3338 zcmX^0Z`VEs1_lR)3U&r2Mh5ZZ4E>DMg3LsHul&-~(jw=g{L+HV)FO5U7Dfhvti-ZJ z{hY+SbbbG%tkmQZb_O;^27WXxj0`LuiFqlE4E#QD8IXWABLkaFW?p8A9V3H;213p& zwKOHwIkBiD)mk%*k%7fIKP8omfti7qhk=uUkCA~{Lo<w>L4c8g7sWU(27U%1kP=}= z21)G3d1{7nGB7fT@-VP7aDd#CnV0HUnwykb6q1;flgh{-<ddJAm=l&*lnLTP1zAcm zGK(1*B#~T*5){^q49s4srHl-sNGcG1U}WHSPb~>9DM~C!O|Jwy-;<p|o{>Qc5qd$T zc_o>-sjd~tsRbpO`FR`+ii`~6E~$w*sYMDIiNy+e`3f)-^tc%07?eRCRbgZh)$l=> z5?oT0nU@X@G!Dm<6yN;3)JjGM77Z88Fb)O{Mg|d71Htloj0|jvx%s7eC5#M=E{qJ^ zL8-a<WvO5}Mg|V|)DkF@Swqu>k%28ZwZtj4gpq+&!^IP1tRW+VFx1$T{M6z+^%4cA z)Dn=X8Hsr*eo2fBjGl}PZ0=BPEE=95V>n!j63d+vi&8*Q<%u=eK!#hQ210&bPNjmO z0?1%JP;6WCFxW6~F)|3iOmi#B&vj4CO=V=@4K7Jc&h||#fW{%eduj>DzTlFg)V%bP z43GyrJvBW+#yIjYI59XwJPS^Cj10mWo|*_(fd#F(7+e|L*%{mz8TjDo4lKjN;K3lv z$iR`FTH=;pl$^@Qz?Pg?1ok_ZduoYa63F6WP((m2^yOjj1L<IcNHH>S1ZU)zgR%rf zQ5eWoK|Boppw!L@lPhLqfEWi-SPV~9VDE4+gflXTIwj_1gHsE7Kt=K}gfhs2OpWGY zh+&9jWZ>{fEDkQn$t(e<$0$YyHkbU;q?}X^h6F@9NlpYsCqzPzk%7x2u^7Thfw(h@ zk%7ZGF%N7G2SX|%B|tQS#q}5&SiuYqh75EC#UKZOl8R?uacNO12SYX^gETZTL5xUG zEl~hVCgvrlf}G%<S_0;$ra;^S=dcE)7K73yr$=J3e_l?dV=*Yc3V9fc7(fA+o?7CU zpBt2zm(Iu_qM?bIX*d{485x)yL285ZON)|I-7-N10ym`8(*tEP1_cI224)6E237_} z1}0Du!oa{F!NADC$-u?H$iU6Oz~INg%D}|Hz#ycxoq<PdHv@m9Hp_Mf!L1A;8yOfF zm>9$u7#R2%m>C$DA{bbhA{hjkq8P*(7#PGLx)>xFBpE<Jh(U@$nt_plkwJz*7HYN$ z*lq>}uH6iBkwOaF8I<<J&17R>WME*51DnMIVl!|-&0=IwWl)2fV8_4=vKwlGIu;X> z!6ral12chvfr~+tK@02}Z4%7NAYhgbgD%uvs6NByu3WHL=swe9(1)7f!NAPG!T<{! z11vr(0-K-!@jo<d5IzI3j2Mi;A#B263N;lJUZB{7gg7=+%fY5%h8M^zQ0$p8m_yCV zf`+}g^h^d`a12_2T&cB%K}2U8gB2)wFoTna5Xd7;wG1pwbqst=O$=g8&0tF)P8Wwe zU7P`82?K*TII%D>*fKDHJiy1m$Y94{54G2efeGwq9*|8k+ZY_SF}SQjOE+yu7Vy9= z;DKAf!{Eta%)rFJ$l%4`4K>#WoCg>fI6&rZWAH&YvkPn{BxE??W^zEyWMuGX2!NUt z&%g{${bHCQvyCATJzyp<urN(z;A5J~Aj&ii$qq5N9b!;Bkb)za0Td{p3~B~W#&BnY zjfZ4QE|4RbW;3ue%>f$=No+8uGctt0GolXE3?>$IPcKB$$pm!}BSR=W&?Z8?Y6tgf z7%UNNV~7w)Ucev^3C^fl3_{Yg82BJOAJ+K{YyzTdAiM~Wt&p@L#lXhEz_gr!g=qx? zAJZlVDW=T~#!Ooo%$T-=T>=SyJE%(-80?UOhLwStPX!dGaqu(>%0<lZToey-8d^%( z2R0Ux6p_mZSW@JICPhYuM1~}2{G#R}Y^ELtn+kC(rm2h!$vDhP!Q#Rb1k6gq;ahBG zodugkjBjIbxG)`y3onCB#qHZncw$8@7qhUKbpvb`B&otej*%e;N6CuKgu7Tx$YqFy z#vWleJi=;19=uL;gVu?BIO;=4#(T-Y%k&Ct5+r2!;E9$GoTfmfX+GRlQQ*>u0g_#q z!KGS(P{}d|0Z10{VOhYy%Cd$Tky9X*?k5Imrq2wrOy9s3L4r*lY7w-!0M)i-;8b4@ E0Axi5U;qFB literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/JoueurHumain.class b/Partie_3_Terminal/target/classes/ch/hepia/JoueurHumain.class new file mode 100644 index 0000000000000000000000000000000000000000..068028eff942eafbe3b36e821e7fc43a0fe1309b GIT binary patch literal 4901 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 literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/JoueurOrdinateur.class b/Partie_3_Terminal/target/classes/ch/hepia/JoueurOrdinateur.class new file mode 100644 index 0000000000000000000000000000000000000000..e8925bd7d60d537103d49935df82fae23c2b1f36 GIT binary patch literal 4918 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 literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/Paquet.class b/Partie_3_Terminal/target/classes/ch/hepia/Paquet.class new file mode 100644 index 0000000000000000000000000000000000000000..287773450d9a2e8fcd9120c796067e1f9f2a10cf GIT binary patch literal 902 zcmX^0Z`VEs1_lQPBQ6Fe24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00Sb_Nbc24S$G(vr*^eaE7r#7dvc;u0<fb_Qln25tr(b_QM^20jLUMh5=m z4E>DMg3LtyfW*SmRFGK(P=<gH!VHjhYjy@fMh0QH2Cvl8lvL-$qLNfD1_1_Pkn2Pk z8CWztHN!vxVmu7uAm_3dXOyO;<)m^mNHR#VGf49=$S}w<GVq}q&d9)=n3BTCAgTee z70G+nno*1loWYstd5I;ZMX8Jo>JTMh&w(6f<AcRb)^^s646GWSo|<8d3@pz1DXEMM z{63j^seYxoNvTC4iAg!Bj0{3P`N@enVTnbVAU;%(D=W3s1>!SC22rerGcqt{GBPlF zGBU7~WMmdIG6*7+K?2g6k%2QWDIOM>9C=Cc$)K=eWZ(@hNlec6O)P*~$C;j50@1_B zAf%y*<~eId22Bh>+&<<C&Mz%WPIb!!`HmZ6tR5(+859|~8JHLt7#JCtKvB=Y$RNkS zz`(>H&%ngM$iT{=z`)3$$iTp`kAazim4Si5LTft%qt<Q)_Q>rFoLd>VnC)bx7cr>p zW)O&!+0Gzj#UjbFjX_jv3j>!V%T5LfCWi19X2#|J?`~vZU|?oYVqjoUV&Gt4VBlh4 zVc=olXW(NHW8h~{U=UzXWe{XAWZ+{kXAogfW?*120oyLfpu(Waz``KNpvIuapw7Sy zasz_~gC+wASTJZYs53Bv#k3jJ8JHM!7#J9Y7?}Pu2r{s+GjKC9GBPmyVo+sZWYA^M rV_*XNMW2BYtcMlk%ne}gf*i&M78D0t&I4w%LM?&>2}qj(ShXPlgpaz3 literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/classes/ch/hepia/Save.class b/Partie_3_Terminal/target/classes/ch/hepia/Save.class new file mode 100644 index 0000000000000000000000000000000000000000..9573a2e368dea090dc72a1674ce1aa82a9c79b87 GIT binary patch literal 3866 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 literal 0 HcmV?d00001 diff --git a/Partie_3_Terminal/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/Partie_3_Terminal/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..814b859 --- /dev/null +++ b/Partie_3_Terminal/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,7 @@ +ch/hepia/Hand.class +ch/hepia/JeudeCarte.class +ch/hepia/Carte.class +ch/hepia/App.class +ch/hepia/COULEUR.class +ch/hepia/Hand$1.class +ch/hepia/Paquet.class diff --git a/Partie_3_Terminal/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/Partie_3_Terminal/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..aacaf9d --- /dev/null +++ b/Partie_3_Terminal/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,8 @@ +/home/padi/Git/java-card-game/Partie_3/src/main/java/ch/hepia/Paquet.java +/home/padi/Git/java-card-game/Partie_3/src/main/java/ch/hepia/Joueur.java +/home/padi/Git/java-card-game/Partie_3/src/main/java/ch/hepia/App.java +/home/padi/Git/java-card-game/Partie_3/src/main/java/ch/hepia/Hand.java +/home/padi/Git/java-card-game/Partie_3/src/main/java/ch/hepia/Carte.java +/home/padi/Git/java-card-game/Partie_3/src/main/java/ch/hepia/GameManager.java +/home/padi/Git/java-card-game/Partie_3/src/main/java/ch/hepia/JeudeCarte.java +/home/padi/Git/java-card-game/Partie_3/src/main/java/ch/hepia/Save.java diff --git a/Partie_3_Terminal/target/test-classes/ch/hepia/JoueurTest.class b/Partie_3_Terminal/target/test-classes/ch/hepia/JoueurTest.class new file mode 100644 index 0000000000000000000000000000000000000000..6c1eb68d4853e00d11fada367c940922ce2fed72 GIT binary patch literal 8931 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 b0kcdQEf_5str!>>xEL52tr=|@?HMEiAYEvy literal 0 HcmV?d00001 -- GitLab