Commit 0ca9775f authored by Roope Malinen's avatar Roope Malinen
Browse files

Voi juku bojat jossei se nyt toimi. Ja siltä varalta että toimii niin tässä...

Voi juku bojat jossei se nyt toimi. Ja siltä varalta että toimii niin tässä kaikenlaista pientä kivaa
parents
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)) {