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
+			}
+
+		}
+	}	
+}