diff --git a/.classpath b/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..d54800d3c97c210e833c6f1bed4106b6644f91c1 --- /dev/null +++ b/.classpath @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"> + <attributes> + <attribute name="module" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" path="src"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/.project b/.project new file mode 100644 index 0000000000000000000000000000000000000000..32b3842114d82b69fcc56658b998417a5717a73c --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>Uno</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..f2525a8b92227620edba3ac50006e8c33c8ff2c6 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,14 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/bin/domain/kortit/Erikoiskortti.class b/bin/domain/kortit/Erikoiskortti.class new file mode 100644 index 0000000000000000000000000000000000000000..ac6c0e3dd03a3373682d42f0e88eb976009a0058 Binary files /dev/null and b/bin/domain/kortit/Erikoiskortti.class differ diff --git a/bin/domain/kortit/Jokerikortti.class b/bin/domain/kortit/Jokerikortti.class new file mode 100644 index 0000000000000000000000000000000000000000..4791f369d8cf393e9078e74307dbd28273093471 Binary files /dev/null and b/bin/domain/kortit/Jokerikortti.class differ diff --git a/bin/domain/kortit/Kortti.class b/bin/domain/kortit/Kortti.class new file mode 100644 index 0000000000000000000000000000000000000000..36c7059f6c543e8d0c197b9ffd2dc37248c3fa43 Binary files /dev/null and b/bin/domain/kortit/Kortti.class differ diff --git a/bin/domain/kortit/Nosta4Jokerikortti.class b/bin/domain/kortit/Nosta4Jokerikortti.class new file mode 100644 index 0000000000000000000000000000000000000000..8ec34e7aced1ac5df21e91fb402489206d6aebd6 Binary files /dev/null and b/bin/domain/kortit/Nosta4Jokerikortti.class differ diff --git a/bin/domain/kortit/NostaKaksikortti.class b/bin/domain/kortit/NostaKaksikortti.class new file mode 100644 index 0000000000000000000000000000000000000000..54e471461ba163e4c42dabba046d743c6a06763c Binary files /dev/null and b/bin/domain/kortit/NostaKaksikortti.class differ diff --git a/bin/domain/kortit/Ohituskortti.class b/bin/domain/kortit/Ohituskortti.class new file mode 100644 index 0000000000000000000000000000000000000000..c71c6de2ec1febcc93aec573932605c67d209208 Binary files /dev/null and b/bin/domain/kortit/Ohituskortti.class differ diff --git a/bin/domain/kortit/Peruskortti.class b/bin/domain/kortit/Peruskortti.class new file mode 100644 index 0000000000000000000000000000000000000000..7e239219216ffc2b9a96535d42fd0bcfb8c5897b Binary files /dev/null and b/bin/domain/kortit/Peruskortti.class differ diff --git a/bin/domain/kortit/Suunnanvaihtokortti.class b/bin/domain/kortit/Suunnanvaihtokortti.class new file mode 100644 index 0000000000000000000000000000000000000000..2a89ba889f772084761055691cfc8548145f11ad Binary files /dev/null and b/bin/domain/kortit/Suunnanvaihtokortti.class differ diff --git a/bin/domain/korttipakat/Korttipakka.class b/bin/domain/korttipakat/Korttipakka.class new file mode 100644 index 0000000000000000000000000000000000000000..54cf09085df67be326c87be78198dce7340b3b73 Binary files /dev/null and b/bin/domain/korttipakat/Korttipakka.class differ diff --git a/bin/domain/korttipakat/Nostopakka.class b/bin/domain/korttipakat/Nostopakka.class new file mode 100644 index 0000000000000000000000000000000000000000..d6a625560c8dd59366b40dcbdf057c40faf809b7 Binary files /dev/null and b/bin/domain/korttipakat/Nostopakka.class differ diff --git a/bin/domain/korttipakat/Poistopakka.class b/bin/domain/korttipakat/Poistopakka.class new file mode 100644 index 0000000000000000000000000000000000000000..86e0ada8eb4e440ff9ed01e027d0e58075a1b0da Binary files /dev/null and b/bin/domain/korttipakat/Poistopakka.class differ diff --git a/bin/domain/pelaajat/Ihmispelaaja.class b/bin/domain/pelaajat/Ihmispelaaja.class new file mode 100644 index 0000000000000000000000000000000000000000..2797f6e34f4f3ec8042ade3ff3e7e75c62ae5365 Binary files /dev/null and b/bin/domain/pelaajat/Ihmispelaaja.class differ diff --git a/bin/domain/pelaajat/Pelaaja.class b/bin/domain/pelaajat/Pelaaja.class new file mode 100644 index 0000000000000000000000000000000000000000..1627319f00587d3f0317259851f485bd35b13450 Binary files /dev/null and b/bin/domain/pelaajat/Pelaaja.class differ diff --git a/bin/domain/pelaajat/Tietokonepelaaja.class b/bin/domain/pelaajat/Tietokonepelaaja.class new file mode 100644 index 0000000000000000000000000000000000000000..af44071b31467805d0497a19b66fa247ad400dde Binary files /dev/null and b/bin/domain/pelaajat/Tietokonepelaaja.class differ diff --git a/bin/logiikka/Peli.class b/bin/logiikka/Peli.class new file mode 100644 index 0000000000000000000000000000000000000000..a2fae56a9300cac39a3797dd673438c6c9ac0dad Binary files /dev/null and b/bin/logiikka/Peli.class differ diff --git a/bin/main/Uno.class b/bin/main/Uno.class new file mode 100644 index 0000000000000000000000000000000000000000..4440dc4ab9df0509b7ab53e520f84513e9826f4d Binary files /dev/null and b/bin/main/Uno.class differ diff --git a/bin/ui/Tekstikayttoliittyma.class b/bin/ui/Tekstikayttoliittyma.class new file mode 100644 index 0000000000000000000000000000000000000000..be1d201b4a4581392284b1157ce66b0f0a8a4a5d Binary files /dev/null and b/bin/ui/Tekstikayttoliittyma.class differ diff --git a/pelitilanne.txt b/pelitilanne.txt new file mode 100644 index 0000000000000000000000000000000000000000..33807395000b8d6d9cff9e1199837b8fae69b1de --- /dev/null +++ b/pelitilanne.txt @@ -0,0 +1,119 @@ +Pelaajan pelaaja kortit: +punainen peruskortti numero 7 +sininen peruskortti numero 7 +keltainen nosta kaksi -kortti +sininen ohituskortti +sininen peruskortti numero 5 +jokerikortti +keltainen peruskortti numero 2 +punainen peruskortti numero 8 +sininen peruskortti numero 6 +vihreä peruskortti numero 2 + +Pelaajan tietokone 1 kortit: +keltainen peruskortti numero 4 +sininen nosta kaksi -kortti +punainen peruskortti numero 9 +vihreä peruskortti numero 8 +keltainen peruskortti numero 0 + +Pelaajan tietokone 2 kortit: +keltainen ohituskortti +keltainen peruskortti numero 3 +keltainen peruskortti numero 9 +vihreä ohituskortti +vihreä peruskortti numero 6 +keltainen peruskortti numero 1 +keltainen peruskortti numero 8 +sininen peruskortti numero 1 +vihreä nosta kaksi -kortti +keltainen peruskortti numero 7 +sininen ohituskortti +vihreä peruskortti numero 1 +keltainen peruskortti numero 9 +keltainen peruskortti numero 5 +vihreä peruskortti numero 0 +sininen suunnanvaihtokortti + +Pelaajan tietokone 3 kortit: +sininen peruskortti numero 1 +sininen peruskortti numero 5 +vihreä peruskortti numero 7 +punainen peruskortti numero 2 +keltainen peruskortti numero 8 +jokerikortti + +Nostopakassa on kortit: +punainen nosta kaksi -kortti +keltainen peruskortti numero 6 +sininen peruskortti numero 0 +keltainen peruskortti numero 3 +nosta 4 -jokerikortti +punainen peruskortti numero 0 +sininen peruskortti numero 7 +vihreä peruskortti numero 3 +vihreä peruskortti numero 8 +punainen peruskortti numero 8 +punainen peruskortti numero 5 +keltainen peruskortti numero 7 +keltainen suunnanvaihtokortti +punainen peruskortti numero 4 +vihreä peruskortti numero 9 +vihreä suunnanvaihtokortti +vihreä nosta kaksi -kortti +punainen peruskortti numero 2 +punainen peruskortti numero 1 +keltainen suunnanvaihtokortti +sininen peruskortti numero 3 +punainen ohituskortti +sininen peruskortti numero 6 +punainen peruskortti numero 3 +keltainen peruskortti numero 2 +vihreä peruskortti numero 5 +sininen nosta kaksi -kortti +keltainen ohituskortti +keltainen peruskortti numero 5 +sininen peruskortti numero 9 +keltainen nosta kaksi -kortti +punainen peruskortti numero 7 +sininen peruskortti numero 8 +sininen peruskortti numero 2 +keltainen peruskortti numero 1 +sininen peruskortti numero 4 +punainen suunnanvaihtokortti +punainen peruskortti numero 6 +punainen peruskortti numero 5 +vihreä peruskortti numero 5 +vihreä peruskortti numero 1 +punainen peruskortti numero 1 +keltainen peruskortti numero 6 +sininen peruskortti numero 3 +sininen peruskortti numero 8 +punainen peruskortti numero 6 +punainen peruskortti numero 9 +punainen nosta kaksi -kortti +punainen ohituskortti +sininen peruskortti numero 4 +punainen peruskortti numero 3 +punainen suunnanvaihtokortti +vihreä peruskortti numero 2 +jokerikortti +punainen peruskortti numero 4 +vihreä suunnanvaihtokortti +sininen peruskortti numero 2 +keltainen peruskortti numero 4 +vihreä peruskortti numero 9 +vihreä peruskortti numero 6 +vihreä peruskortti numero 3 +sininen peruskortti numero 9 +vihreä peruskortti numero 4 +sininen suunnanvaihtokortti +vihreä peruskortti numero 4 + +Poistopakassa olevat kortit: +vihreä peruskortti numero 7 +vihreä ohituskortti +jokerikortti +nosta 4 -jokerikortti +nosta 4 -jokerikortti +nosta 4 -jokerikortti diff --git a/src/domain/kortit/Erikoiskortti.java b/src/domain/kortit/Erikoiskortti.java new file mode 100644 index 0000000000000000000000000000000000000000..9a5a82cb9134cc20e5ee0d5456029f365a3b77d9 --- /dev/null +++ b/src/domain/kortit/Erikoiskortti.java @@ -0,0 +1,5 @@ +package domain.kortit; + +public interface Erikoiskortti { + +} diff --git a/src/domain/kortit/Jokerikortti.java b/src/domain/kortit/Jokerikortti.java new file mode 100644 index 0000000000000000000000000000000000000000..3825dcb95547d4b06817fa2ae05e68fc01b6f5ca --- /dev/null +++ b/src/domain/kortit/Jokerikortti.java @@ -0,0 +1,13 @@ +package domain.kortit; + +public class Jokerikortti extends Kortti implements Erikoiskortti { + + public Jokerikortti(String vari) { + super(vari); + } + + public String toString() { + return "jokerikortti"; + } + +} diff --git a/src/domain/kortit/Kortti.java b/src/domain/kortit/Kortti.java new file mode 100644 index 0000000000000000000000000000000000000000..3a778358afa0010ac8a8f6bfe418de79b9542767 --- /dev/null +++ b/src/domain/kortit/Kortti.java @@ -0,0 +1,14 @@ +package domain.kortit; + +public abstract class Kortti { + + protected String vari; + + public Kortti(String vari) { + this.vari = vari; + } + + public String annaVari() { + return this.vari; + } +} diff --git a/src/domain/kortit/Nosta4Jokerikortti.java b/src/domain/kortit/Nosta4Jokerikortti.java new file mode 100644 index 0000000000000000000000000000000000000000..01863b6588fbbb6a0f5a4579e95e8b3a89bb70eb --- /dev/null +++ b/src/domain/kortit/Nosta4Jokerikortti.java @@ -0,0 +1,12 @@ +package domain.kortit; + +public class Nosta4Jokerikortti extends Kortti implements Erikoiskortti { + + public Nosta4Jokerikortti(String vari) { + super(vari); + } + + public String toString() { + return "nosta 4 -jokerikortti"; + } +} diff --git a/src/domain/kortit/NostaKaksikortti.java b/src/domain/kortit/NostaKaksikortti.java new file mode 100644 index 0000000000000000000000000000000000000000..57c5c6638c4004d5b6264c175fa80887eaa56b8f --- /dev/null +++ b/src/domain/kortit/NostaKaksikortti.java @@ -0,0 +1,13 @@ +package domain.kortit; + +public class NostaKaksikortti extends Kortti implements Erikoiskortti { + + + public NostaKaksikortti(String vari) { + super(vari); + } + + public String toString() { + return this.vari + " nosta kaksi -kortti"; + } +} diff --git a/src/domain/kortit/Ohituskortti.java b/src/domain/kortit/Ohituskortti.java new file mode 100644 index 0000000000000000000000000000000000000000..19ae128b081b46df3c1444ff22200f9dfa851e5a --- /dev/null +++ b/src/domain/kortit/Ohituskortti.java @@ -0,0 +1,14 @@ +package domain.kortit; + +public class Ohituskortti extends Kortti implements Erikoiskortti { + + + public Ohituskortti(String vari) { + super(vari); + } + + public String toString() { + return this.vari + " ohituskortti"; + } + +} diff --git a/src/domain/kortit/Peruskortti.java b/src/domain/kortit/Peruskortti.java new file mode 100644 index 0000000000000000000000000000000000000000..c5170345c6a2ad2ebe80bedd5fce515edf6be60c --- /dev/null +++ b/src/domain/kortit/Peruskortti.java @@ -0,0 +1,21 @@ +package domain.kortit; + +public class Peruskortti extends Kortti { + + private int numero; + + public Peruskortti(String vari, int numero) { + super(vari); + this.numero = numero; + } + + public int annaNumero() { + return this.numero; + } + + public String toString() { + return this.vari + " peruskortti numero " + this.numero; + } + + +} diff --git a/src/domain/kortit/Suunnanvaihtokortti.java b/src/domain/kortit/Suunnanvaihtokortti.java new file mode 100644 index 0000000000000000000000000000000000000000..7383ffbe9c6d756856e802054f00a878c1db773e --- /dev/null +++ b/src/domain/kortit/Suunnanvaihtokortti.java @@ -0,0 +1,12 @@ +package domain.kortit; + +public class Suunnanvaihtokortti extends Kortti implements Erikoiskortti { + + public Suunnanvaihtokortti(String vari) { + super(vari); + } + + public String toString() { + return this.vari + " suunnanvaihtokortti"; + } +} diff --git a/src/domain/korttipakat/Korttipakka.java b/src/domain/korttipakat/Korttipakka.java new file mode 100644 index 0000000000000000000000000000000000000000..6adb174aef145dad6399d78a0a29bdead22a00c7 --- /dev/null +++ b/src/domain/korttipakat/Korttipakka.java @@ -0,0 +1,64 @@ +package domain.korttipakat; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import domain.kortit.Jokerikortti; +import domain.kortit.Kortti; +import domain.kortit.Nosta4Jokerikortti; +import domain.kortit.NostaKaksikortti; +import domain.kortit.Ohituskortti; +import domain.kortit.Peruskortti; +import domain.kortit.Suunnanvaihtokortti; + +public class Korttipakka { + + List<Kortti> kortit; + + public Korttipakka() { + this.kortit = new ArrayList<>(); + this.generoiKorttipakka(); + this.sekoita(); + } + + public void generoiKorttipakka() { + for (int i = 0; i < 4; i++) { + this.kortit.add(new Jokerikortti(null)); + } + for (int i = 0; i < 4; i++) { + this.kortit.add(new Nosta4Jokerikortti(null)); + } + + generoiSamaaVariaOlevatKortit("sininen"); + generoiSamaaVariaOlevatKortit("vihre�"); + generoiSamaaVariaOlevatKortit("punainen"); + generoiSamaaVariaOlevatKortit("keltainen"); + } + + public void generoiSamaaVariaOlevatKortit(String vari) { + for (int i = 0; i < 2; i++) { + for (int j = 1; j < 10; j++) { + this.kortit.add(new Peruskortti(vari, j)); + } + this.kortit.add(new NostaKaksikortti(vari)); + this.kortit.add(new Suunnanvaihtokortti(vari)); + this.kortit.add(new Ohituskortti(vari)); + } + this.kortit.add(new Peruskortti(vari, 0)); + } + + public void sekoita() { + Collections.shuffle(this.kortit); + } + + public Kortti jaaKortti() { + Kortti k = this.kortit.get(0); + this.kortit.remove(0); + return k; + } + + public List<Kortti> annaKortit() { + return this.kortit; + } +} diff --git a/src/domain/korttipakat/Nostopakka.java b/src/domain/korttipakat/Nostopakka.java new file mode 100644 index 0000000000000000000000000000000000000000..186e2cab12d1a9abf3b519dc362b090fbafa3ca3 --- /dev/null +++ b/src/domain/korttipakat/Nostopakka.java @@ -0,0 +1,38 @@ +package domain.korttipakat; + +import java.util.ArrayList; +import java.util.List; + +import domain.kortit.Kortti; + +public class Nostopakka { + + List<Kortti> kortit; + + public Nostopakka() { + this.kortit = new ArrayList<>(); + } + + public void lisaaKortit(List<Kortti> kortit) { + this.kortit.addAll(kortit); + } + + public Kortti nostaKortti() { + try { + Kortti k = this.kortit.get(0); + this.kortit.remove(0); + return k; + } catch (Exception e) { + throw new IndexOutOfBoundsException(); + } + } + + public String toString() { + StringBuilder str = new StringBuilder(""); + str.append("Nostopakassa on kortit:\n"); + for (Kortti kortti : this.kortit) { + str.append(kortti + "\n"); + } + return str.toString(); + } +} diff --git a/src/domain/korttipakat/Poistopakka.java b/src/domain/korttipakat/Poistopakka.java new file mode 100644 index 0000000000000000000000000000000000000000..7118b11971053cf6eb06781bdba634b2dd1ba6c2 --- /dev/null +++ b/src/domain/korttipakat/Poistopakka.java @@ -0,0 +1,32 @@ +package domain.korttipakat; + +import java.util.ArrayList; +import java.util.List; + +import domain.kortit.Kortti; + +public class Poistopakka { + + List<Kortti> kortit; + + public Poistopakka() { + this.kortit = new ArrayList<>(); + } + + public void lisaaKortti(Kortti k) { + this.kortit.add(k); + } + + public Kortti annaPaallimmainenKortti() { + return this.kortit.get(this.kortit.size()-1); + } + + public String toString() { + StringBuilder str = new StringBuilder(""); + str.append("Poistopakassa olevat kortit:\n"); + for (Kortti kortti : this.kortit) { + str.append(kortti + "\n"); + } + return str.toString(); + } +} diff --git a/src/domain/pelaajat/Ihmispelaaja.java b/src/domain/pelaajat/Ihmispelaaja.java new file mode 100644 index 0000000000000000000000000000000000000000..95e8d9ccefcdbc9adad6bd85d1cef210c94f07d2 --- /dev/null +++ b/src/domain/pelaajat/Ihmispelaaja.java @@ -0,0 +1,8 @@ +package domain.pelaajat; + +public class Ihmispelaaja extends Pelaaja { + + public Ihmispelaaja(String nimi) { + super(nimi); + } +} diff --git a/src/domain/pelaajat/Pelaaja.java b/src/domain/pelaajat/Pelaaja.java new file mode 100644 index 0000000000000000000000000000000000000000..a6202e875b29dbc641463f5eaa25f5058403eb4a --- /dev/null +++ b/src/domain/pelaajat/Pelaaja.java @@ -0,0 +1,84 @@ +package domain.pelaajat; + +import java.util.ArrayList; +import java.util.List; + +import domain.kortit.Jokerikortti; +import domain.kortit.Kortti; +import domain.kortit.Nosta4Jokerikortti; +import domain.kortit.NostaKaksikortti; +import domain.kortit.Ohituskortti; +import domain.kortit.Peruskortti; +import domain.kortit.Suunnanvaihtokortti; +import domain.korttipakat.Nostopakka; + +public abstract class Pelaaja { + + private String nimi; + List<Kortti> kortit; + + public Pelaaja(String nimi) { + this.nimi = nimi; + this.kortit = new ArrayList<>(); + } + + public void lisaaKortti(Kortti k) { + this.kortit.add(k); + } + + public void tulostaKortit() { + int i = 0; + for (Kortti k : this.kortit) { + System.out.println("(" + i + ")" + " " + k.toString()); + i++; + } + } + + public List<Kortti> annaKortit() { + return this.kortit; + } + + public String annaNimi() { + return this.nimi; + } + + public void nostaKortti(Nostopakka nostopakka) { + this.kortit.add(nostopakka.nostaKortti()); + } + + public void nostaKaksiKorttia(Nostopakka nostopakka) { + this.nostaKortti(nostopakka); + this.nostaKortti(nostopakka); + } + + public void nostaNeljaKorttia(Nostopakka nostopakka) { + this.nostaKortti(nostopakka); + this.nostaKortti(nostopakka); + this.nostaKortti(nostopakka); + this.nostaKortti(nostopakka); + } + + public int laskePisteet() { + int summa = 0; + for (Kortti k : this.kortit) { + if (k instanceof Ohituskortti || k instanceof Suunnanvaihtokortti + || k instanceof NostaKaksikortti) { + summa += 20; + } else if (k instanceof Jokerikortti || k instanceof Nosta4Jokerikortti) { + summa += 50; + } else { + summa += ((Peruskortti) k).annaNumero(); + } + } + return summa; + } + + public String toString() { + StringBuilder str = new StringBuilder(""); + str.append("Pelaajan " + this.nimi + " kortit:\n"); + for (Kortti kortti : this.kortit) { + str.append(kortti + "\n"); + } + return str.toString(); + } +} diff --git a/src/domain/pelaajat/Tietokonepelaaja.java b/src/domain/pelaajat/Tietokonepelaaja.java new file mode 100644 index 0000000000000000000000000000000000000000..22635423bed221594985e153df9002e86bf855fa --- /dev/null +++ b/src/domain/pelaajat/Tietokonepelaaja.java @@ -0,0 +1,9 @@ +package domain.pelaajat; + +public class Tietokonepelaaja extends Pelaaja { + + public Tietokonepelaaja(String nimi) { + super(nimi); + } + +} diff --git a/src/logiikka/Peli.java b/src/logiikka/Peli.java new file mode 100644 index 0000000000000000000000000000000000000000..0e80f8f33f81563ff82a04f27bea59e09fb1a7c3 --- /dev/null +++ b/src/logiikka/Peli.java @@ -0,0 +1,425 @@ +package logiikka; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.Scanner; + +import domain.kortit.Jokerikortti; +import domain.kortit.Kortti; +import domain.kortit.Nosta4Jokerikortti; +import domain.kortit.NostaKaksikortti; +import domain.kortit.Ohituskortti; +import domain.kortit.Peruskortti; +import domain.kortit.Suunnanvaihtokortti; +import domain.korttipakat.Korttipakka; +import domain.korttipakat.Nostopakka; +import domain.korttipakat.Poistopakka; +import domain.pelaajat.Ihmispelaaja; +import domain.pelaajat.Pelaaja; +import domain.pelaajat.Tietokonepelaaja; + +public class Peli { + + private List<Pelaaja> pelaajat; + private Nostopakka nostopakka; + private Poistopakka poistopakka; + private String vari; + private int seuraavaksiVuorossa; + private boolean suuntaKasvava; + private Random random; + + public Peli() { + this.pelaajat = new ArrayList<>(); + this.pelaajat.add(new Ihmispelaaja("pelaaja")); // pelaaja nro 0 + this.pelaajat.add(new Tietokonepelaaja("tietokone 1")); + this.pelaajat.add(new Tietokonepelaaja("tietokone 2")); + this.pelaajat.add(new Tietokonepelaaja("tietokone 3")); + + + this.nostopakka = new Nostopakka(); + this.poistopakka = new Poistopakka(); + + Korttipakka korttipakka = new Korttipakka(); + this.jaaKortit(korttipakka); + this.vari = null; + this.seuraavaksiVuorossa = 0; + this.suuntaKasvava = true; + this.random = new Random(); + } + + public void jaaKortit(Korttipakka k) { + for (Pelaaja p : this.pelaajat) { + for (int i = 0; i < 7; i++) { + p.lisaaKortti(k.jaaKortti()); + k.sekoita(); + } + } + + this.poistopakka.lisaaKortti(k.jaaKortti()); + + this.nostopakka.lisaaKortit(k.annaKortit()); + } + + public Pelaaja annaPelaaja(int numero) { + return this.pelaajat.get(numero); + } + + public Nostopakka annaNostopakka() { + return this.nostopakka; + } + + public Poistopakka annaPoistopakka() { + return this.poistopakka; + } + + public void kasvataVuoronumeroa() { + if (this.seuraavaksiVuorossa == this.pelaajat.size()-1) { + this.seuraavaksiVuorossa = 0; + return; + } + this.seuraavaksiVuorossa++; + } + + public void pienennaVuoronumeroa() { + if (this.seuraavaksiVuorossa == 0) { + this.seuraavaksiVuorossa = this.pelaajat.size()-1; + return; + } + this.seuraavaksiVuorossa--; + } + + public boolean annaSuuntaKasvava() { + return this.suuntaKasvava; + } + + public int annaSeuraavaksiVuorossa() { + return this.seuraavaksiVuorossa; + } + + public String annaVari() { + return this.vari; + } + + public void paivitaVuoronumero() { + if (this.annaSuuntaKasvava()) { + this.kasvataVuoronumeroa(); + } else { + this.pienennaVuoronumeroa(); + } + } + + public boolean pelaaKortti(Scanner lukija, Kortti kortti, Kortti edellinenKortti, Pelaaja pelaaja) { + + boolean kelvollinenKortti = false; + + // Edellinen pelaaja on valinnut v�rin + + if (this.vari != null) { + if (kortti.annaVari() != null + && kortti.annaVari().equals(this.vari)) { + return false; + } + this.vari = null; + return true; + } + + // Jos edellinen kortti on Jokerikortti tai Nosta 4 -jokerikortti, + //niin kortin pit�� olla annettua v�ri� tai jokerikortti tai Nosta 4 -jokerikortti. + // Nosta 4 -jokerikortin voi k�ytt�� vain jos pelaajalla ei ole kyseist� v�ri�. + + if (edellinenKortti instanceof Jokerikortti || edellinenKortti instanceof Nosta4Jokerikortti) { + if (kortti.annaVari() != null + && !kortti.annaVari().equals(this.vari) + && !(kortti instanceof Jokerikortti) + && !(kortti instanceof Nosta4Jokerikortti)) { + System.out.println("Sinun tulee laittaa kortti, joka on v�rilt��n " + + this.vari + " tai jokerikortti tai Nosta 4- jokerikortti " + + "(vain jos k�dess� ei ole kyseist� v�ri�)"); + return false; + } + if (kortti instanceof Nosta4Jokerikortti) { + boolean pelaajallaSopivanVarinenKortti = false; + for (Kortti k : pelaaja.annaKortit()) { + if (k.annaVari() != null && + k.annaVari().equals(edellinenKortti.annaVari())) { + pelaajallaSopivanVarinenKortti = true; + } + } + if (pelaajallaSopivanVarinenKortti) { + System.out.println("Et voi k�ytt�� Nosta 4 -korttia, jos sinulla on sopivan v�rinen kortti."); + return false; + } + } + } + /* + * Jokeri � Kortin ly�nyt pelaaja saa valita seuraavaksi pelattavan v�rin. + * Kortin saa ly�d� milloin tahansa paitsi silloin, kun sen ly�j� joutuu juuri + * ottamaan vastaan Nosta kaksi -korttia tai Nosta 4-jokeri -korttia. + */ + if (kortti instanceof Jokerikortti) { + System.out.println("Valitse v�ri (sininen, punainen, keltainen, vihre�):"); + System.out.print(">"); + String vari = lukija.next(); + this.vari = vari; + this.paivitaVuoronumero(); + kelvollinenKortti = true; + } + /* + * Nosta 4 -jokeri � Kortin ly�neest� pelaajasta seuraava menett�� vuoronsa + * ja nostaa pakasta nelj� korttia. Lis�ksi kortin ly�nyt pelaaja saa valita + * seuraavaksi pelattavan v�rin. Pelaaja ei saa kuitenaan ly�d� nosta 4-jokeri + * korttia silloin, kun h�nell� on k�dess��n my�s samanv�rinen kortti kuin + * poistopakan p��llimm�inen kortti on. Muulloin kortin voi ly�d� koska vain. + */ + + else if (kortti instanceof Nosta4Jokerikortti) { + boolean pelaajallaSopivanVarinenKortti = false; + for (Kortti k : pelaaja.annaKortit()) { + if (k.annaVari() != null && + k.annaVari().equals(edellinenKortti.annaVari())) { + pelaajallaSopivanVarinenKortti = true; + } + } + if (pelaajallaSopivanVarinenKortti) { + System.out.println("Et voi k�ytt�� Nosta 4 -korttia, jos sinulla on sopivan v�rinen kortti."); + return false; + } + this.annaPelaaja(seuraavaksiVuorossa).nostaNeljaKorttia(this.nostopakka); + System.out.println("Valitse v�ri (sininen, punainen, keltainen, vihre�):"); + System.out.print(">"); + String vari = lukija.next(); + this.vari = vari; + this.paivitaVuoronumero(); + kelvollinenKortti = true; + } + + /* + * Nosta kaksi � Kortin ly�neen pelaajan j�lkeen seuraavana vuorossa oleva + * menett�� vuoronsa ja joutuu nostamaan pakasta kaksi korttia k�teen. Nosta + * kaksi -kortin saa ly�d� joko samanv�risen kortin tai my�s eriv�risen Nosta + * kaksi -kortin p��lle. + */ + + else if (kortti instanceof NostaKaksikortti) { + if (!edellinenKortti.annaVari().equals(kortti.annaVari()) + || edellinenKortti instanceof NostaKaksikortti) { + System.out.println("Nosta 2 -kortin voi ly�d� samanv�risen kortin p��lle tai" + + " toisen nosta 2 -kortin p��lle."); + return false; + } + this.annaPelaaja(seuraavaksiVuorossa).nostaKaksiKorttia(this.nostopakka); + this.paivitaVuoronumero(); + kelvollinenKortti = true; + } + + /* + * Ohituskortti � Kortin ly�neest� pelaajasta seuraava menett�� vuoronsa. Kortin + * saa ly�d� joko samanv�risen kortin tai eriv�risen ohituskortin p��lle. + */ + + else if (kortti instanceof Ohituskortti) { + if (!edellinenKortti.annaVari().equals(kortti.annaVari()) + || edellinenKortti instanceof Ohituskortti) { + System.out.println("Ohituskortin saa ly�d� samanv�risen kortin p��lle tai" + + " toisen ohituskortin p��lle."); + return false; + } + this.paivitaVuoronumero(); + kelvollinenKortti = true; + } + + /* + * Suunnanvaihtokortti � Kortti vaihtaa pelaajien vuoroj�rjestyksen suunnan. + * Kortin saa ly�d� joko samanv�risen kortin tai eriv�risen Suunnanvaihtokortin + * p��lle. + */ + + else if (kortti instanceof Suunnanvaihtokortti) { + if (!edellinenKortti.annaVari().equals(kortti.annaVari()) + || edellinenKortti instanceof Suunnanvaihtokortti) { + System.out.println("Suunnanvaihtokortin saa ly�d� samanv�risen kortin p��lle tai" + + " toisen suunnanvaihtokortin p��lle."); + } + this.suuntaKasvava = !this.suuntaKasvava; + kelvollinenKortti = true; + } + + else if (kortti instanceof Peruskortti) { + if (edellinenKortti.annaVari() != null) { + if (!kortti.annaVari().equals(edellinenKortti.annaVari()) + && edellinenKortti instanceof Peruskortti) { + if (((Peruskortti) kortti).annaNumero() != ((Peruskortti) edellinenKortti).annaNumero()) { + //Kortti on peruskortti, mutta eriv�rinen ja erinumeroinen kuin edellinen kortti + System.out.println("Kortin tulee olla samaa v�ri� tai sama numero."); + return false; + } + } + if(!kortti.annaVari().equals(edellinenKortti.annaVari())) { + System.out.println("Kortin tulee olla samaa v�ri� tai sama numero."); + return false; + } else { + kelvollinenKortti = true; + } + } + } + + this.vari = null; + return kelvollinenKortti; + } + + public boolean pelaaKorttiTietokone(Scanner lukija, Kortti kortti, Kortti edellinenKortti, Pelaaja pelaaja) { + + boolean kelvollinenKortti = false; + + // Edellinen pelaaja on valinnut v�rin + + if (this.vari != null) { + if (kortti.annaVari() != null + && kortti.annaVari().equals(this.vari)) { + return false; + } + this.vari = null; + System.out.println(pelaaja.annaNimi() + " pelasi kortin: " + kortti); + return true; + } + + + // Jos edellinen kortti on Jokerikortti tai Nosta 4 -jokerikortti, + //niin kortin pit�� olla annettua v�ri� tai jokerikortti tai Nosta 4 -jokerikortti. + // Nosta 4 -jokerikortin voi k�ytt�� vain jos pelaajalla ei ole kyseist� v�ri�. + + if (edellinenKortti instanceof Jokerikortti || edellinenKortti instanceof Nosta4Jokerikortti) { + if (kortti.annaVari() != null + && !kortti.annaVari().equals(this.vari) && !(kortti instanceof Jokerikortti) + && !(kortti instanceof Nosta4Jokerikortti)) { + return false; + } + if (kortti instanceof Nosta4Jokerikortti) { + boolean pelaajallaSopivanVarinenKortti = false; + for (Kortti k : pelaaja.annaKortit()) { + if (k.annaVari() != null + && k.annaVari().equals(edellinenKortti.annaVari())) { + pelaajallaSopivanVarinenKortti = true; + } + } + if (pelaajallaSopivanVarinenKortti) { + return false; + } + } + } + /* + * Jokeri � Kortin ly�nyt pelaaja saa valita seuraavaksi pelattavan v�rin. + * Kortin saa ly�d� milloin tahansa paitsi silloin, kun sen ly�j� joutuu juuri + * ottamaan vastaan Nosta kaksi -korttia tai Nosta 4-jokeri -korttia. + */ + if (kortti instanceof Jokerikortti) { + String[] varit = {"sininen", "punainen", "keltainen", "vihre�"}; + int varinNumero = this.random.nextInt(4); + String vari = varit[varinNumero]; + this.vari = vari; + this.paivitaVuoronumero(); + kelvollinenKortti = true; + System.out.println(pelaaja.annaNimi() + " pelasi kortin: " + kortti); + } + /* + * Nosta 4 -jokeri � Kortin ly�neest� pelaajasta seuraava menett�� vuoronsa + * ja nostaa pakasta nelj� korttia. Lis�ksi kortin ly�nyt pelaaja saa valita + * seuraavaksi pelattavan v�rin. Pelaaja ei saa kuitenaan ly�d� nosta 4-jokeri + * korttia silloin, kun h�nell� on k�dess��n my�s samanv�rinen kortti kuin + * poistopakan p��llimm�inen kortti on. Muulloin kortin voi ly�d� koska vain. + */ + + else if (kortti instanceof Nosta4Jokerikortti) { + boolean pelaajallaSopivanVarinenKortti = false; + for (Kortti k : pelaaja.annaKortit()) { + if (k.annaVari() != null + && k.annaVari().equals(edellinenKortti.annaVari())) { + pelaajallaSopivanVarinenKortti = true; + } + } + if (pelaajallaSopivanVarinenKortti) { + System.out.println("Et voi k�ytt�� Nosta 4 -korttia, jos sinulla on sopivan v�rinen kortti."); + return false; + } + this.annaPelaaja(seuraavaksiVuorossa).nostaNeljaKorttia(this.nostopakka); + String[] varit = {"sininen", "punainen", "keltainen", "vihre�"}; + int varinNumero = this.random.nextInt(4); + String vari = varit[varinNumero]; + this.vari = vari; + this.paivitaVuoronumero(); + kelvollinenKortti = true; + System.out.println(pelaaja.annaNimi() + " pelasi kortin: " + kortti); + } + + /* + * Nosta kaksi � Kortin ly�neen pelaajan j�lkeen seuraavana vuorossa oleva + * menett�� vuoronsa ja joutuu nostamaan pakasta kaksi korttia k�teen. Nosta + * kaksi -kortin saa ly�d� joko samanv�risen kortin tai my�s eriv�risen Nosta + * kaksi -kortin p��lle. + */ + + else if (kortti instanceof NostaKaksikortti) { + if (!edellinenKortti.annaVari().equals(kortti.annaVari()) + || edellinenKortti instanceof NostaKaksikortti) { + return false; + } + this.annaPelaaja(seuraavaksiVuorossa).nostaKaksiKorttia(this.nostopakka); + this.paivitaVuoronumero(); + kelvollinenKortti = true; + System.out.println(pelaaja.annaNimi() + " pelasi kortin: " + kortti); + } + + /* + * Ohituskortti � Kortin ly�neest� pelaajasta seuraava menett�� vuoronsa. Kortin + * saa ly�d� joko samanv�risen kortin tai eriv�risen ohituskortin p��lle. + */ + + else if (kortti instanceof Ohituskortti) { + if (!edellinenKortti.annaVari().equals(kortti.annaVari()) + || edellinenKortti instanceof Ohituskortti) { + return false; + } + this.paivitaVuoronumero(); + kelvollinenKortti = true; + System.out.println(pelaaja.annaNimi() + " pelasi kortin: " + kortti); + } + + /* + * Suunnanvaihtokortti � Kortti vaihtaa pelaajien vuoroj�rjestyksen suunnan. + * Kortin saa ly�d� joko samanv�risen kortin tai eriv�risen Suunnanvaihtokortin + * p��lle. + */ + + else if (kortti instanceof Suunnanvaihtokortti) { + if (!edellinenKortti.annaVari().equals(kortti.annaVari()) + || edellinenKortti instanceof Suunnanvaihtokortti) { + } + this.suuntaKasvava = !this.suuntaKasvava; + kelvollinenKortti = true; + System.out.println(pelaaja.annaNimi() + " pelasi kortin: " + kortti); + } + + else if (kortti instanceof Peruskortti) { + if (edellinenKortti.annaVari() != null) { + if (!kortti.annaVari().equals(edellinenKortti.annaVari()) + && edellinenKortti instanceof Peruskortti) { + if (((Peruskortti) kortti).annaNumero() != ((Peruskortti) edellinenKortti).annaNumero()) { + //Kortti on peruskortti, mutta eriv�rinen ja erinumeroinen kuin edellinen kortti + return false; + } + } + if(!kortti.annaVari().equals(edellinenKortti.annaVari())) { + return false; + } + } else { + kelvollinenKortti = true; + System.out.println(pelaaja.annaNimi() + " pelasi kortin: " + kortti); + } + } + + this.vari = null; + return kelvollinenKortti; + } + +} diff --git a/src/main/Uno.java b/src/main/Uno.java new file mode 100644 index 0000000000000000000000000000000000000000..87886a449e5166752b42eace86e9c7f394d226cd --- /dev/null +++ b/src/main/Uno.java @@ -0,0 +1,16 @@ +package main; + +import ui.Tekstikayttoliittyma; + +public class Uno { + + public static void main(String[] args) { + Uno.pelaa(); + } + + public static void pelaa() { + Tekstikayttoliittyma tk = new Tekstikayttoliittyma(); + tk.start(); + } + +} diff --git a/src/ui/Tekstikayttoliittyma.java b/src/ui/Tekstikayttoliittyma.java new file mode 100644 index 0000000000000000000000000000000000000000..858b673b4d7792cd96115aa52bc0c5a791566318 --- /dev/null +++ b/src/ui/Tekstikayttoliittyma.java @@ -0,0 +1,165 @@ +package ui; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Scanner; + +import domain.kortit.Erikoiskortti; +import domain.kortit.Kortti; +import domain.korttipakat.Nostopakka; +import domain.korttipakat.Poistopakka; +import domain.pelaajat.Pelaaja; +import logiikka.Peli; + +public class Tekstikayttoliittyma { + + Scanner lukija; + + public Tekstikayttoliittyma() { + lukija = new Scanner(System.in); + } + + public void start() { + + System.out.println("Tervetuloa pelaamaan Uunoa. Kirjoita \"uusi\" aloittaaksesi uuden pelin,"); + System.out.println(" \"lataa\" ladataksesi vanhan pelin tai 'lopeta' lopettaaksesi."); + System.out.print("> "); + String input = this.lukija.next(); + + switch (input) { + case "lopeta": + return; + case "uusi": + this.uusiPeli(); + default: + this.uusiPeli(); + } + } + + public void uusiPeli() { + + System.out.println("Pelaat Unoa kolmea tietokonepelaajaa vastaan."); + System.out.println(); + Peli peli = new Peli(); + Pelaaja pelaaja = peli.annaPelaaja(0); + Poistopakka poistopakka = peli.annaPoistopakka(); + Nostopakka nostopakka = peli.annaNostopakka(); + + try { + PrintWriter tiedosto = new PrintWriter(new File("pelitilanne.txt")); + tiedosto.close(); + } catch (Exception e) { + // TODO: handle exception + } + + Kortti ensimmainenKortti = poistopakka.annaPaallimmainenKortti(); + + while (ensimmainenKortti instanceof Erikoiskortti) { + ensimmainenKortti = nostopakka.nostaKortti(); + poistopakka.lisaaKortti(ensimmainenKortti); + } + + boolean peliKesken = true; + while (peliKesken) { + + Pelaaja peliVuorossa = peli.annaPelaaja(peli.annaSeuraavaksiVuorossa()); + System.out.println("Pelivuorossa on: " + peliVuorossa.annaNimi() + + " (Pisteet: " + peliVuorossa.laskePisteet() + ")"); + System.out.println(); + + + //ihmispelaaja + if (peli.annaSeuraavaksiVuorossa() == 0) { + + if (peli.annaVari() != null) { + System.out.println("Laitettava kortti, joka on v�rilt��n " + + peli.annaVari() ); + } else { + System.out.print("Pakan p��limm�inen kortti on: "); + System.out.println(poistopakka.annaPaallimmainenKortti()); + } + peli.paivitaVuoronumero(); + + boolean korttiPelattu = false; + while (korttiPelattu == false) { + System.out.println("Sinulla on k�dess�si kortit:"); + pelaaja.tulostaKortit(); + + System.out.println("Kirjoita kortin numero pelataksesi kortin tai \"nosta\" nostaaksesi kortin."); + System.out.print(">"); + String input = this.lukija.next(); + List<Kortti> kortit = pelaaja.annaKortit(); + if (input.equals("nosta")) { + pelaaja.nostaKortti(nostopakka); + break; + } + int kortinNumero = Integer.valueOf(input); + Kortti k = kortit.get(kortinNumero); + Kortti edellinenKortti = poistopakka.annaPaallimmainenKortti(); + + + korttiPelattu = peli.pelaaKortti(lukija, k, edellinenKortti, pelaaja); + if (korttiPelattu) { + poistopakka.lisaaKortti(k); + kortit.remove(kortinNumero); + } + } + + } else { // tietokonepelaaja + peli.paivitaVuoronumero(); + + boolean kelvollinenKortti = false; + int kortinNumero = 0; + while (kelvollinenKortti == false) { + + List<Kortti> kortit = peliVuorossa.annaKortit(); + Kortti k = kortit.get(kortinNumero); + Kortti edellinenKortti = poistopakka.annaPaallimmainenKortti(); + + kelvollinenKortti = peli.pelaaKorttiTietokone(lukija, k, edellinenKortti, peliVuorossa); + + if (!kelvollinenKortti) { + if (kortinNumero == peliVuorossa.annaKortit().size()-1) { + peliVuorossa.nostaKortti(nostopakka); //ei sopivaa korttia + kelvollinenKortti = true; + } else { + kortinNumero++; + } + } else { + poistopakka.lisaaKortti(k); + kortit.remove(kortinNumero); + } + } + } + //Tulostaminen tiedostoon + try { + + File tiedosto = new File("pelitilanne.txt"); + OutputStreamWriter kirjoittaja = + new OutputStreamWriter(new FileOutputStream(tiedosto), StandardCharsets.UTF_8); + + kirjoittaja.append(peli.annaPelaaja(0).toString()); + kirjoittaja.append("\n"); + kirjoittaja.append(peli.annaPelaaja(1).toString()); + kirjoittaja.append("\n"); + kirjoittaja.append(peli.annaPelaaja(2).toString()); + kirjoittaja.append("\n"); + kirjoittaja.append(peli.annaPelaaja(3).toString()); + kirjoittaja.append("\n"); + kirjoittaja.append(nostopakka.toString()); + kirjoittaja.append("\n"); + kirjoittaja.append(poistopakka.toString()); + + kirjoittaja.close(); + } catch (Exception e) { + // TODO: handle exception + } + + } + } +}