Skip to content
Snippets Groups Projects
Commit 089ebfb2 authored by Jarkko Hanhela's avatar Jarkko Hanhela
Browse files

First commit 2020.2.13

parents
No related branches found
No related tags found
No related merge requests found
Showing
with 820 additions and 0 deletions
File added
File added
File added
package Korttipelit.Isompi;
import java.awt.event.*;
import javax.swing.*;
import Korttipelit.Pino;
import Korttipelit.Korttipeli;
import static Korttipelit.Korttipelit.pyt;
import static Korttipelit.Korttipelit.pakka;
public class Isompi implements Korttipeli {
//pelaajien lukumr
private int pelaajat;
//korttipinot
private Pino[] pino;
//tosi, jos on oma vuoro
private boolean vuoro = false;
//jos joillakin pelaajilla on yht suuret kortit
private boolean riita = false;
//keskell olevien korttien lukumr
private int lkm;
public Isompi(int pelaajat) {
this.pelaajat = pelaajat;
//luo korttipinot
pino = new Pino[pelaajat * 2 + 1];
pino[0] = new Pino(400, 300); //keskikasa
pino[1] = new Pino(250, 500); //alapelaajan pistekasa
pino[pelaajat + 1] = new Pino(400, 500); //alapelaajan kortit
if(pelaajat == 2) {
pino[2] = new Pino(550, 100); //ylpelaajan pistekasa
pino[4] = new Pino(400, 100); //ylpelaajan kortit
} else if(pelaajat > 2) {
pino[2] = new Pino(100, 150); //vasemman pelaajan pistekasa
pino[pelaajat + 2] = new Pino(100, 300); //vasemman pelaajan kortit
if(pelaajat == 3) {
pino[3] = new Pino(700, 450); //oikean pelaajan pistekasa
pino[6] = new Pino(700, 300); //oikean pelaajan kortit
} else if(pelaajat == 4) {
pino[3] = new Pino(550, 100); //ylpelaajan pistekasa
pino[7] = new Pino(400, 100); //ylpelaajan kortit
pino[4] = new Pino(700, 450); //oikean pelaajan pistekasa
pino[8] = new Pino(700, 300); //oikean pelaajan kortit
}
}
lkm = pelaajat;
pino[0].siirtotapa = Pino.VINONELIN;
for(int i = 0; i < 1 + pelaajat; i++) {
pino[i].etupuoli = true;
pino[i].kokoa = false;
}
}
//toimii pelin moottorina pyritten vuoroja
public synchronized void pelaa() {
jaa();
try {
while(!pyt.onValmis()) wait();
} catch(InterruptedException ex) { }
int vuoro = 1;
while(!peliOhi()) {
if(vuoro == 1) pelaaja();
else tekoly(vuoro);
if(vuoro < pelaajat) vuoro++;
else vuoro = 1;
}
lopetus();
}
public void jaa() {
try {
while(pakka.getKoko() > 0) {
if(pelaajat == 3 && pakka.getKoko() == 1) {
pakka.x = 750;
pakka.y = 50;
pyt.siirr(pakka.nosta(), pakka);
break;
} else pyt.siirr(pakka.nosta(), pino[pakka.getKoko() % pelaajat + pelaajat + 1]);
Thread.sleep(40);
}
} catch(InterruptedException ex) { }
}
public void pelaaja() {
vuoro = true;
try {
synchronized(this) {
while(vuoro) {
wait();
}
}
} catch(InterruptedException ex) { }
}
public void tekoly(int pelaaja) {
try {
Thread.sleep(200);
} catch(InterruptedException ie) {}
pyt.siirr(pino[pelaajat + pelaaja].nosta(), pino[0]);
if(pelaaja == pelaajat) tutki();
}
private void tutki() {
int kerj = 1;
int suurin = pino[0].nyt(lkm - pelaajat).arvo();
int x;
for(int i = 2; i <= pelaajat; i++) {
x = pino[0].nyt(lkm - pelaajat - 1 + i).arvo();
if(x > suurin) {
suurin = x;
kerj = i;
riita = false;
} else if(x == suurin) {
riita = true;
}
}
if(riita) {
lkm += pelaajat;
riita = false;
} else {
try {
hertys.restart();
synchronized(this) {
while(!pyt.onValmis()) wait();
}
} catch(InterruptedException ex) { }
pyt.siirr(pino[0].nostaKaikki(), pino[kerj]);
lkm = pelaajat;
}
}
public int pinot() {
return pino.length;
}
public Pino getPino(int i) {
return pino[i];
}
public boolean peliOhi() {
return pino[pino.length - 1].getKoko() == 0;
}
//kertoo voittajan
public void lopetus() {
Object str = "Sin voitit!\n";
boolean tasapeli = false;
for(int i = 2; i <= pelaajat; i++) {
if(pino[i].getKoko() > pino[1].getKoko()) {
str = "Hvisit!\n";
tasapeli = false;
break;
} else if(pino[i].getKoko() == pino[1].getKoko()) tasapeli = true;
}
if(tasapeli) str = "Tasapeli!\n";
for(int i = 1; i < pelaajat; i++)
str += pino[i].getKoko() + " - ";
str += "" + pino[pelaajat].getKoko();
try {
while(!pyt.onValmis()) wait();
} catch(InterruptedException ex) { }
JOptionPane.showMessageDialog(null, str, "peli ohi", 1);
}
public synchronized void pinoaPainettu(int i, int kortti) {
if(pyt.onValmis()) {
if(vuoro && i == pelaajat + 1 && pino[pelaajat + 1].getKoko() > 0) {
vuoro = false;
pyt.siirr(pino[pelaajat + 1].nosta(), pino[0]);
}
notify();
}
}
public void hert() {
synchronized(this) {
notifyAll();
}
}
//sikeiden herttj
private Timer hertys = new Timer(2000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
hertys.stop();
hert();
}
});
}
\ No newline at end of file
File added
File added
package Korttipelit;
import javax.swing.*;
import static Korttipelit.Korttipelit.pyt;
public abstract class Kasa extends JComponent implements Cloneable {
protected Kortti[] kortit = new Kortti[0];
public int x, y, suunta = 0;
public static final int LJN = 0, //kortit siirretn epmriseen ljn
PINOON = 1, //kortit siirretn tasaiseen pinoon
RIVIIN = 2, //kortit siirretn viuhkaksi riviin
VINONELIN = 3, //kortit siirretn 4 kortin salmiakkikuvioon
VIEREKKIN = 4; //kortit siirretn vierekkin pariin riviin (esim. Kasino)
//tapa miten kortit siirretn ljn
public int siirtotapa = LJN;
public boolean etupuoli = false, //jos kortit ovat etupuoli ylspin
kokoa = true, //jos kortit kootaan tasaiseen pinoon
levit = false; //jos korttipino levitetn viuhkaan
public boolean valmis = true;
//ottaa kasasta plimmisen kortin
public Kortti nosta() {
if(kortit.length < 1) return null;
Kortti k = kortit[kortit.length - 1];
kortit = Pyt.pienennTaulua(kortit);
pyt.repaint();
return k;
}
//ottaa kasasta halutun kortin
public Kortti nosta(int index) {
if(index == kortit.length - 1) return nosta();
if(kortit.length < 1) return null;
Kortti k = kortit[index];
Kortti[] uusi = new Kortti[kortit.length - 1];
if(index == 0) System.arraycopy(kortit, 1, uusi, 0, uusi.length);
else {
System.arraycopy(kortit, 0, uusi, 0, index);
System.arraycopy(kortit, index + 1, uusi, index, uusi.length - index);
}
kortit = uusi;
pyt.repaint();
return k;
}
//ottaa kasasta kaikki kortit
public Kortti[] nostaKaikki() {
if(kortit.length < 1) return null;
Kortti[] kort = kortit;
kortit = new Kortti[0];
pyt.repaint();
return kort;
}
public int getKoko() {
return kortit.length;
}
public boolean onKortti() {
return kortit.length > 0 ? true : false;
}
//lis kasaan annetun kortin
public void lis(Kortti k) {
kortit = Pyt.kasvataTaulua(kortit, k);
}
//lis kasaan annetut kortit
public void lis(Kortti[] k) {
kortit = Pyt.kasvataTaulua(kortit, k);
}
public Kortti nyt(int i) {
return kortit[i];
}
public Object clone() {
try {
return super.clone();
} catch(CloneNotSupportedException e) { throw new InternalError(); }
}
}
\ No newline at end of file
File added
File added
File added
package Korttipelit.Katko;
import java.awt.event.*;
import java.awt.Color;
import javax.swing.*;
import java.util.Random;
import Korttipelit.Kortti;
import Korttipelit.Pino;
import Korttipelit.Korttipeli;
import Korttipelit.Korttipelit;
import Korttipelit.Teksti;
import static Korttipelit.Korttipelit.pyt;
import static Korttipelit.Korttipelit.pakka;
public class Katko implements Korttipeli {
private Pino[] pino;
private boolean omaVuoro = false;
private int pelaajat;
private Random rand = new Random();
private int vuoro;
private int[] tilanne;
private int er;
private final String[] asema = new String[]{"Mets", "Peli", "Korvat", "Poikki"};
private int voittaja = -1;
//maa, jota kierroksella pelataan
private int maa = -1;
//kierroksen aloittaja
private int aloittaja = 1;
public Katko(int pelaajat) {
this.pelaajat = pelaajat;
pino = new Pino[pelaajat + 2];
tilanne = new int[pelaajat];
//luodaan pistetekstit ja nimet
pyt.tekstit = new Teksti[pelaajat * 2];
//keskikasa, johon kortteja heitetn
pino[0] = new Pino(400, 300);
pino[0].siirtotapa = Pino.VINONELIN;
pino[0].etupuoli = true;
pino[0].kokoa = false;
//alapelaaja
pino[1] = new Pino(400, 500);
pino[1].etupuoli = true;
pyt.tekstit[0] = new Teksti("Mets", pino[1].x - 20, pino[1].y + 120, Color.blue, 18);
pyt.tekstit[pelaajat] = new Teksti(Korttipelit.nimet[0], pino[1].x - 20, pino[1].y + 136, Color.blue, 16);
//mritetn muiden pelaajien korttiljien paikat
if(pelaajat == 4) {
(pino[2] = new Pino(100, 300)).suunta = 2; //vasen pelaaja
(pino[3] = new Pino(400, 100)).suunta = 1; //ylpelaaja
(pino[4] = new Pino(700, 300)).suunta = 3; //oikea pelaaja
} else if(pelaajat == 3) {
(pino[2] = new Pino(100, 300)).suunta = 2; //vasen pelaaja
(pino[3] = new Pino(700, 300)).suunta = 3; //oikea pelaaja
} else {
(pino[2] = new Pino(400, 100)).suunta = 1; //ylpelaaja
}
//kytettyjen korttien kasa
pino[pelaajat + 1] = new Pino(150, 60);
pino[pelaajat + 1].kokoa = false;
pino[pelaajat + 1].etupuoli = true;
for(int i = 0; i < pelaajat; i++) {
pino[i + 1].levit = true;
tilanne[i] = 0;
if(i > 0) {
pyt.tekstit[i] = new Teksti("Mets",
pino[i + 1].x - 20, pino[i + 1].y - 66, Color.red, 18);
pyt.tekstit[i + pelaajat] = new Teksti(Korttipelit.nimet[i],
pino[i + 1].x - 20, pino[i + 1].y - 50, Color.red, 16);
}
}
}
//toimii pelin moottorina pyritten vuoroja
public synchronized void pelaa() {
er = 1;
vuoro = 1;
try {
while(!peliOhi()) {
//jaetaan kortit
jaa();
while(!pyt.onValmis()) wait();
//kydn vuorot lpi
while(!erOhi()) {
if(vuoro == 1) pelaaja();
else tekoly(vuoro);
if(maa == -1) maa = pino[0].nyt(pino[0].getKoko() - 1).maa;
if(vuoro < pelaajat) vuoro++;
else vuoro = 1;
//kun kaikki ovat heittneet kortin, tutkitaan kenell on suurin
if(pino[0].getKoko() % pelaajat == 0) tutki();
}
//pivitetn tilanne
tilanne[aloittaja - 1]++;
pyt.tekstit[aloittaja - 1].teksti = asema[tilanne[aloittaja - 1]];
while(!pyt.onValmis()) wait();
if(!peliOhi()) {
hertys.restart();
wait();
Korttipelit.kortitPakkaan();
while(!pyt.onValmis()) wait();
er++;
vuoro = (er - 1) % pelaajat + 1;
aloittaja = vuoro;
}
}
lopetus();
} catch(InterruptedException ex) { System.out.println("WIRHE! " + ex.toString()); }
}
public void jaa() {
int mones = 1; //vuoro, kenelle jaetaan
boolean uusiJako; //jos jollekin on tehtv uusi jako
try {
//jaetaan kaikille 5 korttia
while(pino[pelaajat].getKoko() < 5) {
pyt.siirr(pakka.nosta(), pino[mones]);
if(mones < pelaajat) mones++;
else mones = 1;
Thread.sleep(40);
}
//jos jollain on kaikki alle 10, jaetaan uudet
for(int i = 1; i <= pelaajat; i++) {
uusiJako = true;
while(!pyt.onValmis()) wait();
for(int j = 0; j < 5; j++)
if(pino[i].nyt(j).arvo() >= 9) {
uusiJako = false;
break;
}
if(uusiJako) {
pyt.siirr(pino[i].nostaKaikki(), pino[pelaajat + 1]);
while(pino[i].getKoko() < 5) {
pyt.siirr(pakka.nosta(), pino[i]);
Thread.sleep(40);
}
i--;
}
}
//siirretn loppu pakka sivuun
pakka.x = 750;
pakka.y = 50;
pyt.siirr(pakka.nostaKaikki(), pakka);
} catch(InterruptedException ex) { }
}
//tutkitaan kenell on suurin kortti pydss
private void tutki() {
//suurin kortti samaa maata
int suurin = pino[0].nyt(pino[0].getKoko() - pelaajat).arvo();
int uusiAloittaja = aloittaja;
int maa = pino[0].nyt(pino[0].getKoko() - pelaajat).maa;
int x;
for(int i = 2; i <= pelaajat; i++) {
//mennn seuraavaan, jos ei samaa maata
if(pino[0].nyt(pino[0].getKoko() - pelaajat - 1 + i).maa != maa) continue;
x = pino[0].nyt(pino[0].getKoko() - pelaajat - 1 + i).arvo();
if(x > suurin) {
System.out.println("Suurempi kortti "+x+" kuin "+suurin);
suurin = x;
uusiAloittaja = aloittaja + i - 1;
if(uusiAloittaja > pelaajat) uusiAloittaja -= pelaajat;
}
}
aloittaja = uusiAloittaja;
vuoro = aloittaja;
//nollataan pelattava maa
this.maa = -1;
try {
synchronized(this) {
while(!pyt.onValmis()) wait();
}
hertys.restart();
wait();
} catch(InterruptedException ex) { }
pyt.siirr(pino[0].nostaKaikki(), pino[pelaajat + 1]);
}
public void pelaaja() {
omaVuoro = true;
try {
synchronized(this) {
while(omaVuoro) {
wait();
}
}
} catch(InterruptedException ex) { }
}
public void tekoly(int pelaaja) {
try {
Thread.sleep(200);
} catch(InterruptedException ie) {}
//sallittujen heitettvien korttien indexit
int[] sallitut = new int[pino[pelaaja].getKoko()];
int lkm = 0;
int kortti;
for(int i = 0; i < pino[pelaaja].getKoko(); i++) {
if(maa == pino[pelaaja].nyt(i).maa) {
sallitut[lkm] = i;
lkm++;
}
}
//arvotaan siirrettv kortti sallituista
if(lkm == 0) kortti = rand.nextInt(pino[pelaaja].getKoko()); //jos ei ole samaa maata
else kortti = sallitut[rand.nextInt(lkm)];
pyt.siirr(pino[pelaaja].nosta(kortti), pino[0]);
}
public int pinot() {
return pino.length;
}
public Pino getPino(int i) {
return pino[i];
}
public boolean peliOhi() {
for(int i = 0; i < pelaajat; i++) {
if(tilanne[i] == 3) {
voittaja = i;
return true;
}
}
return false;
}
private boolean erOhi() {
return pino[pelaajat + 1].getKoko() + pakka.getKoko() == 52;
}
public void lopetus() {
Object str;
if(voittaja == 0) str = "Sin voitit!";
else str = Korttipelit.nimet[voittaja] + " voitti.";
System.out.println("Heppa1");
JOptionPane.showMessageDialog(null, str, "peli ohi", 1);
System.out.println("Heppa2");
}
//ajattelu ja siirrot
public synchronized void pinoaPainettu(int kasa, int kortti) {
if(omaVuoro && kasa == 1 && pino[1].getKoko() > 0) {
//jos kortiksi ei kelpaa mik tahansa
boolean eiKaikkiKelpaa = false;
for(int i = 0; i < pino[1].getKoko(); i++) {
if(maa == pino[1].nyt(i).maa) {
eiKaikkiKelpaa = true;
break;
}
}
//Jos valittu kortti ei kelpaa
if(eiKaikkiKelpaa && pino[1].nyt(kortti).maa != maa) return;
omaVuoro = false;
pyt.siirr(pino[1].nosta(kortti), pino[0]);
}
notify();
}
public void hert() {
synchronized(this) {
System.out.println("-hertetn (katko), onko pyt valmis? "+pyt.onValmis());
notify();
}
}
//ajastettu sikeiden herttj
private Timer hertys = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
hertys.stop();
hert();
}
});
}
\ No newline at end of file
File added
File added
package Korttipelit;
import java.awt.*;
import javax.swing.*;
public class Kortti {
//kortin maa (hertta = 0, pata = 1, ruutu = 2, risti = 3)
public final byte maa;
//kortin lukuarvo (0 - 12, palautettaessa 1 - 13 jossa 13 on ss)
private final byte arvo;
//kortin sijainti
int x = 0, y = 0;
//kortin kuva
final Image kortti;
public Kortti(int m, int a) {
maa = (byte)m;
arvo = (byte)a;
kortti = new ImageIcon(Kortti.class.getResource("kortit/" + m + "-" + a + ".png")).getImage();
}
public int arvo() {
return arvo > 0 ? arvo : 13;
}
}
\ No newline at end of file
File added
package Korttipelit;
import java.util.Random;
public class Korttipakka extends Kasa {
private Random rand = new Random();
public Korttipakka(int x, int y) {
this.x = x;
this.y = y;
siirtotapa = PINOON;
suunta = -1;
lisKortit();
sekoita();
for(int i = 0; i < 52; i++) {
nyt(i).x = x + i / 5;
nyt(i).y = y + i / 5;
}
}
public void lisKortit() {
kortit = new Kortti[52];
for(int i = 0; i < kortit.length; i++) {
kortit[i] = new Kortti((i - i % 13) / 13, i % 13);
}
}
public void sekoita() {
for (int i = 0; i < kortit.length; i++) {
int kortti = rand.nextInt(kortit.length);
Kortti kop = kortit[kortti];
kortit[kortti] = kortit[i];
kortit[i] = kop;
}
}
}
\ No newline at end of file
File added
package Korttipelit;
public interface Korttipeli {
//palauttaa pinojen lukumrn
public int pinot();
//palauttaa kysytyn pinon
public Pino getPino(int i);
//kun jotain pinoa painetaan
public void pinoaPainettu(int pino, int kortti);
//toimii pelin moottorina pyritten vuoroja
public void pelaa();
//tekee vastustajan (tekolyn) vuoron
public void tekoly(int pelaaja);
//tekee pelaajan vuoron
public void pelaaja();
//tosi, jos peli on ohi
public boolean peliOhi();
//nytt lopputuloksen jne.
public void lopetus();
//hertt sikeet
public void hert();
}
\ No newline at end of file
File added
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment