Commit ef0edfd4 authored by Roope Malinen's avatar Roope Malinen
Browse files

please I'm so tired of this

parent a656925a
package domain.kortit;
public class Jokerikortti extends Kortti {
public Jokerikortti(String vari) {
super(vari);
}
public String toString() {
return "[Jokeri, vri]";
}
}
package domain.kortit;
public abstract class Kortti {
protected String vari;
public Kortti(String vari) {
this.vari = vari;
}
public String annaVari() {
return this.vari;
}
}
package domain.kortit;
public class Nosta4Jokerikortti extends Kortti {
public Nosta4Jokerikortti(String vari) {
super(vari);
}
public String toString() {
return "[Jokeri, +4]";
}
}
package domain.kortit;
public class NostaKaksikortti extends Kortti {
public NostaKaksikortti(String vari) {
super(vari);
}
public String toString() {
return "[" + this.vari + ", +2]";
}
}
package domain.kortit;
public class Ohituskortti extends Kortti {
public Ohituskortti(String vari) {
super(vari);
}
public String toString() {
return "[" + this.vari + ", ]";
}
}
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 + ", " + this.numero + "]";
}
}
package domain.kortit;
public class Suunnanvaihtokortti extends Kortti {
public Suunnanvaihtokortti(String vari) {
super(vari);
}
public String toString() {
return "[" + this.vari + ", <->]";
}
}
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;
}
}
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();
}
}
}
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);
}
}
package domain.pelaajat;
public class Ihmispelaaja extends Pelaaja {
public Ihmispelaaja(String nimi) {
super(nimi);
}
}
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;
}
}
package domain.pelaajat;
public class Tietokonepelaaja extends Pelaaja {
public Tietokonepelaaja(String nimi) {
super(nimi);
}
}
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 vrin
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 vri tai jokerikortti tai Nosta 4 -jokerikortti.
// Nosta 4 -jokerikortin voi kytt vain jos pelaajalla ei ole kyseist vri.
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 vriltn "
+ this.vari + " tai jokerikortti tai Nosta 4- jokerikortti "
+ "(vain jos kdess ei ole kyseist vri)");
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 kytt Nosta 4 -korttia, jos sinulla on sopivan vrinen kortti.");
return false;
}
}
}
/*
* Jokeri Kortin lynyt pelaaja saa valita seuraavaksi pelattavan vrin.
* Kortin saa lyd milloin tahansa paitsi silloin, kun sen lyj joutuu juuri
* ottamaan vastaan Nosta kaksi -korttia tai Nosta 4-jokeri -korttia.
*/
if (kortti instanceof Jokerikortti) {
do{
System.out.println("Valitse vri (sininen, punainen, keltainen, vihre):");
System.out.print(">");
String vari = lukija.next();
this.vari = vari;
}while (!(this.vari.equals("sininen")||this.vari.equals("punainen")||this.vari.equals("keltainen")||this.vari.equals("vihre")));
this.paivitaVuoronumero();
kelvollinenKortti = true;
}
/*
* Nosta 4 -jokeri Kortin lyneest pelaajasta seuraava menett vuoronsa
* ja nostaa pakasta nelj korttia. Lisksi kortin lynyt pelaaja saa valita
* seuraavaksi pelattavan vrin. Pelaaja ei saa kuitenaan lyd nosta 4-jokeri
* korttia silloin, kun hnell on kdessn mys samanvrinen kortti kuin
* poistopakan pllimminen kortti on. Muulloin kortin voi lyd 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 kytt Nosta 4 -korttia, jos sinulla on sopivan vrinen kortti.");
return false;
}
this.annaPelaaja(seuraavaksiVuorossa).nostaNeljaKorttia(this.nostopakka);
do{
System.out.println("Valitse vri (sininen, punainen, keltainen, vihre):");
System.out.print(">");
String vari = lukija.next();
this.vari = vari;
}while (!(this.vari.equals("sininen")||this.vari.equals("punainen")||this.vari.equals("keltainen")||this.vari.equals("vihre")));
this.paivitaVuoronumero();
kelvollinenKortti = true;
}
/*
* Nosta kaksi Kortin lyneen pelaajan jlkeen seuraavana vuorossa oleva
* menett vuoronsa ja joutuu nostamaan pakasta kaksi korttia kteen. Nosta
* kaksi -kortin saa lyd joko samanvrisen kortin tai mys erivrisen Nosta
* kaksi -kortin plle.
*/
else if (kortti instanceof NostaKaksikortti) {
if (edellinenKortti != null && !edellinenKortti.annaVari().equals(kortti.annaVari())
|| edellinenKortti instanceof NostaKaksikortti) {
System.out.println("Nosta 2 -kortin voi lyd samanvrisen kortin plle tai"
+ " toisen nosta 2 -kortin plle.");
return false;
}
this.annaPelaaja(seuraavaksiVuorossa).nostaKaksiKorttia(this.nostopakka);
this.paivitaVuoronumero();
kelvollinenKortti = true;
}
/*
* Ohituskortti Kortin lyneest pelaajasta seuraava menett vuoronsa. Kortin
* saa lyd joko samanvrisen kortin tai erivrisen ohituskortin plle.
*/
else if (kortti instanceof Ohituskortti) {
if (edellinenKortti != null && !edellinenKortti.annaVari().equals(kortti.annaVari())
|| edellinenKortti instanceof Ohituskortti) {
System.out.println("Ohituskortin saa lyd samanvrisen kortin plle tai"
+ " toisen ohituskortin plle.");
return false;
}
this.paivitaVuoronumero();
kelvollinenKortti = true;
}
/*
* Suunnanvaihtokortti Kortti vaihtaa pelaajien vuorojrjestyksen suunnan.
* Kortin saa lyd joko samanvrisen kortin tai erivrisen Suunnanvaihtokortin
* plle.
*/
else if (kortti instanceof Suunnanvaihtokortti) {
if (edellinenKortti != null && !edellinenKortti.annaVari().equals(kortti.annaVari())
|| edellinenKortti instanceof Suunnanvaihtokortti) {
System.out.println("Suunnanvaihtokortin saa lyd samanvrisen kortin plle tai"
+ " toisen suunnanvaihtokortin plle.");
}
this.suuntaKasvava = !this.suuntaKasvava;
paivitaVuoronumero();
paivitaVuoronumero();
kelvollinenKortti = true;
}
else if (kortti instanceof Peruskortti) {
if (edellinenKortti != null && edellinenKortti.annaVari() != null) {
if (!kortti.annaVari().equals(edellinenKortti.annaVari())
&& edellinenKortti instanceof Peruskortti) {
if (((Peruskortti) kortti).annaNumero() != ((Peruskortti) edellinenKortti).annaNumero()) {
//Kortti on peruskortti, mutta erivrinen ja erinumeroinen kuin edellinen kortti
System.out.println("Kortin tulee olla samaa vri tai sama numero.");
return false;
}
}
if(!kortti.annaVari().equals(edellinenKortti.annaVari())) {
System.out.println("Kortin tulee olla samaa vri 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 vrin
if (this.vari != null) {
if (kortti.annaVari() != null
&& kortti.annaVari().equals(this.vari)) {