Advertisement
jpvain

teht3

Feb 17th, 2013
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.02 KB | None | 0 0
  1. package pokeritesti;
  2.  
  3. import java.util.List;
  4. import java.util.Random;
  5. import java.util.Stack;
  6. import java.util.Collections;
  7. import java.util.ArrayList;
  8. import pokeritesti.KorttiPakka.DuplikaattiKorttiPoikkeus;
  9.  
  10.  
  11. class PokeriPeli {
  12.  
  13.  
  14.  
  15. private double stake;
  16. private ArrayList<Pelaaja> players;
  17. private KorttiPakka deck;
  18.  
  19. public PokeriPeli() {
  20. stake = 0.0;
  21. deck = new KorttiPakka();
  22. players = new ArrayList<Pelaaja>();
  23. }
  24.  
  25. public void addPlayer(String name, double credit) {
  26. players.add(new Pelaaja(name, credit, this));
  27. }
  28.  
  29. public void play() {
  30. // pelin aloitus
  31. deck.sekoita();
  32. dealCards();
  33. // pelin kulku toteutetaan myöhemmin
  34. }
  35.  
  36. public void dealCards() {
  37. // Jaetaan viisi korttia jokaiselle pelaajalle
  38. for(int i=0; i < 5; i++) {
  39. for(Pelaaja player : players) {
  40. player.takeCard(deck.annaKortti());
  41. }
  42. }
  43. }
  44.  
  45. public Kortti getCard() {
  46. return deck.annaKortti();
  47. }
  48.  
  49. public void raiseStake(double amount) {
  50. stake = stake + amount;
  51. }
  52.  
  53. public boolean playerRaise(Pelaaja player, double amount) {
  54. return player.raiseStake(amount);
  55. }
  56.  
  57. public boolean playerChangeCards(Pelaaja player, int[] cardsToChange) {
  58. return player.changeCards(cardsToChange);
  59. }
  60.  
  61. public String toString() {
  62. String gameStatus = "Panos: " + stake + "\n";
  63. for(Pelaaja player : players) {
  64. gameStatus += player + "\n";
  65. }
  66. return gameStatus;
  67. }
  68. }
  69.  
  70. class Pelaaja {
  71. private String name;
  72. private double money;
  73. private PokeriPeli game;
  74. private ArrayList<Kortti> hand;
  75.  
  76. public Pelaaja(String playerName, double credit, PokeriPeli playes) {
  77. name = playerName;
  78. money = credit;
  79. game = playes;
  80. hand = new ArrayList<Kortti>();
  81. }
  82.  
  83. public String getName() {
  84. return name;
  85. }
  86.  
  87. public boolean takeCard(Kortti card) {
  88. if (hand.size() < 5) {
  89. hand.add(card);
  90. return true;
  91. }
  92. else
  93. return false;
  94. }
  95.  
  96. public boolean raiseStake(double amount) {
  97. if( amount <= money ) {
  98. money = money - amount;
  99. game.raiseStake(amount);
  100. return true;
  101. }
  102. else
  103. return false;
  104. }
  105.  
  106. public boolean changeCards(int[] cardsToChange) {
  107. if( cardsToChange.length > 0 && cardsToChange.length < 6 ) {
  108. for( int i=0; i < cardsToChange.length; i++ ) {
  109. Kortti card = game.getCard();
  110. hand.set(cardsToChange[i], card);
  111. }
  112. return true;
  113. }
  114. else
  115. return false;
  116.  
  117. }
  118.  
  119. public String playersHand() {
  120. String playersHand = hand.get(0).toString();
  121. for( int i=1; i < hand.size(); i++ ) {
  122. playersHand = playersHand + "\n" + hand.get(i).toString();
  123. }
  124. return playersHand;
  125. }
  126.  
  127. public String toString() {
  128. String player = "Nimi: " + name + "\n";
  129. player = player + "Rahaa: " + money + "\n";
  130. player = player + "Kortit:\n" + playersHand();
  131. return player;
  132. }
  133. }
  134.  
  135.  
  136.  
  137. class KorttiPakka {
  138.  
  139.  
  140.  
  141. private Stack<Kortti> kortit;
  142.  
  143. /**
  144. * Alustaa korttipakkaolion ja täyttää sen korteilla
  145. */
  146. KorttiPakka() {
  147. kortit = new Stack<Kortti>();
  148. uusiPakka();
  149. }
  150.  
  151. /**
  152. * Tyhjentää korttipakan ja luo uuden, jossa kortit ovat neljää maata.
  153. * Jokaisella maalla on arvot 1-13. Järjestys on pata, hertta, ruutu, risti.
  154. */
  155. public void uusiPakka() {
  156. // tyhjentää korttipakan
  157. kortit.clear();
  158. // korttien maat
  159. int[] suites = {Kortti.PATA, Kortti.HERTTA, Kortti.RUUTU, Kortti.RISTI};
  160. // laittaa pakkaan jokaista maata kohti kortit arvoilla 1-13
  161. for(int i=0; i < 4; i++) {
  162. for(int j=1; j < 14; j++) {
  163. kortit.add(new Kortti(suites[i], j));
  164. }
  165. }
  166. }
  167.  
  168. /** Sekoittaa korttipakan satunnaiseen järjestykseen */
  169. public void sekoita() {
  170. Collections.shuffle(kortit);
  171. }
  172.  
  173. /** Palauttaa korttipakan päällimmäisen kortin ja poistaa sen pakasta */
  174. public Kortti annaKortti() {
  175. if(!kortit.empty()){
  176. return kortit.pop();
  177. } else{
  178. return null;
  179. }
  180. }
  181.  
  182. /** Palautta korttipakan päälimmäisen kortin, mutta jättää sen pakkaan. */
  183. public Kortti naytaKortti(){
  184. if(!kortit.empty()){
  185. return kortit.peek();
  186. } else {
  187. return null;
  188. }
  189. }
  190.  
  191.  
  192.  
  193. public String toString(){
  194. StringBuilder builder = new StringBuilder();
  195. for(Kortti kortti : kortit) {
  196. builder.append(kortti);
  197. builder.append("\n");
  198. }
  199. return builder.toString();
  200. }
  201.  
  202.  
  203. public void lisaaKortti(Kortti kortti) throws DuplikaattiKorttiPoikkeus {
  204. kortit.add(kortti);
  205. if (kortit.contains(kortti)) {
  206. throw new DuplikaattiKorttiPoikkeus();
  207. }
  208. }
  209.  
  210.  
  211. class DuplikaattiKorttiPoikkeus extends Exception{
  212. public DuplikaattiKorttiPoikkeus(){
  213. super("kortti jo pakassa");
  214. }
  215.  
  216. }
  217.  
  218. }
  219.  
  220.  
  221. /*class Kortti {
  222.  
  223. // Luokkamuuttujat eri maille
  224. public static final int PATA = 1;
  225. public static final int HERTTA = 2;
  226. public static final int RUUTU = 3;
  227. public static final int RISTI = 4;
  228.  
  229. // Attribuutit vakiota (final), koska kortin maan ja arvon vaihtoa ei sallita luonnin jälkeen
  230. private final int maa;
  231. private final int arvo;
  232.  
  233. public Kortti(int suit, int value) {
  234. this.maa = suit;
  235. this.arvo = value;
  236. }
  237.  
  238. public int annaMaa(){
  239. return maa;
  240. }
  241. public int annaArvo(){
  242. return arvo;
  243. }
  244.  
  245. public String toString(){
  246. switch(maa){
  247. case Kortti.PATA:
  248. return "Pata" + arvo;
  249. case Kortti.HERTTA:
  250. return "Hertta" + arvo;
  251. case Kortti.RUUTU:
  252. return "Ruutu" + arvo;
  253. case Kortti.RISTI:
  254. return "Risti" + arvo;
  255. }
  256. return null;
  257. }
  258. }
  259. */
  260. class Pokerikasi implements Comparable<Pokerikasi>{
  261.  
  262. /** Eri arvoisten käsien tyypit. Tyypeille asetetaan myös kokonaislukuarvot,
  263. * jotka kuvaavat käden paremmuuttaa. */
  264. public enum Kasi{
  265. HAI(1),PARI(2),KAKSI_PARIA(3),KOLME_SAMAA(4),
  266. SUORA(5),VARI(6),TAYSKASI(7),NELJA_SAMAA(8),VARISUORA(9);
  267.  
  268. /** Käden arvo kokonaislukuna. */
  269. private final int arvo;
  270.  
  271. Kasi(int arvo){
  272. this.arvo = arvo;
  273. }
  274.  
  275. public int arvo(){
  276. return arvo;
  277. }
  278.  
  279. }
  280.  
  281. private List<Kortti> kortit;
  282.  
  283. private Kasi tyyppi;
  284.  
  285. /** Mikä korteista on käden arvoltaan merkitsevin kortti.
  286. * Esim. kädessä 3,3,3,2,2, merkitsevin kortti on 3
  287. */
  288. private Kortti merkitseva1;
  289.  
  290. /** Mikä korteista on käden arvoltaan toiseksi merkitsevin kortti.
  291. * Esim. kädessä 3,3,3,2,2, toiseksi merkitsevin kortti on 2
  292. */
  293. private Kortti merkitseva2;
  294.  
  295. public Pokerikasi(){
  296. kortit = new ArrayList<Kortti>();
  297. }
  298.  
  299. public void lisaaKortti(Kortti kortti){
  300. kortit.add(kortti);
  301. }
  302.  
  303. public Kasi annaKadenTyyppi(){
  304. return tyyppi;
  305. }
  306.  
  307. public String toString(){
  308. String tulos = "";
  309. for(Kortti kortti : kortit){
  310. tulos += kortti + " ";
  311. }
  312. return tulos;
  313. }
  314.  
  315. /** Selvittää käden tyypin ja tallentaa sen attribuuttin tyyppi.
  316. * @return Pokerikäden tyyppi (Kasi.VARISUORA, ...)
  317. */
  318. public Kasi selvitaKadenTyyppi(){
  319. // Kortit järjestykseen pienimmästä suurimpaan
  320. // Ässä on Kortti-luokkaa tehdyssä compareTo-metodissa märitelty suurin kortit,
  321. // joten mikäli käsi sisältää ässiä, ne ovat listassa viimeisinä
  322. Collections.sort(kortit);
  323. if(onkoVariSuora()){
  324. tyyppi = Kasi.VARISUORA;
  325. } else if(onkoNeljaSamaa()){
  326. tyyppi = Kasi.NELJA_SAMAA;
  327. } else if(onkoTaysKasi()){
  328. tyyppi = Kasi.TAYSKASI;
  329. } else if(onkoVari()){
  330. tyyppi = Kasi.VARI;
  331. } else if(onkoSuora()){
  332. tyyppi = Kasi.SUORA;
  333. } else if(onkoKolmeSamaa()){
  334. tyyppi = Kasi.KOLME_SAMAA;
  335. } else if(onkoKaksiParia()){
  336. tyyppi = Kasi.KAKSI_PARIA;
  337. } else if(onkoPari()){
  338. tyyppi = Kasi.PARI;
  339. } else {
  340. tyyppi = Kasi.HAI;
  341. merkitseva1 = kortit.get(kortit.size()-1);
  342. }
  343. return tyyppi;
  344. }
  345.  
  346. public int compareTo(Pokerikasi kasi){
  347. selvitaKadenTyyppi();
  348. kasi.selvitaKadenTyyppi();
  349.  
  350. // Käsien tyyppi sama, joten selvitetään, kumman merkitsevät kortit ovat suurempia
  351. if(this.annaKadenTyyppi() == kasi.annaKadenTyyppi()){
  352. if(this.merkitseva1 == kasi.merkitseva1){
  353. if(this.merkitseva2 == kasi.merkitseva2){
  354. // Molemmat merkitsevät kortit yhtäsuuria, joten selvitetään
  355. // kummassa kädessä on suurempi hai
  356. return parempiHai(kasi);
  357. } else {
  358. // Toiseksi merkitsevimmät kortit erisuuria, joten
  359. // palautetaan korttien vertailu
  360. return this.merkitseva2.compareTo(kasi.merkitseva2);
  361. }
  362. } else {
  363. // Merkitsevimmät kortit erisuuria, joten
  364. // palautetaan korttien vertailu
  365. return this.merkitseva1.compareTo(kasi.merkitseva1);
  366. }
  367. }
  368.  
  369. // Muuten palautetaan tämän käden tyypin arvo - verrattaven käden tyypin arvo.
  370. // Esim. Kasi.PARI - Kasi.KAKSI_PARIA (2 - 3 = -1), eli verrattava käsi isompi, joten
  371. // palautetaan negatiivinen arvo
  372. return this.tyyppi.arvo() - kasi.tyyppi.arvo();
  373. }
  374.  
  375.  
  376. /** Palauttaa positiivisen luvun, jos tässä kädessä suurempi hai,
  377. * 0, jos molempien käsien hai-kortit samoja ja negatiivisen, jos
  378. * tässä kädessä olevat hait ovat pienempiä. Merkitseviä kortteja
  379. * ei vertailla.
  380. */
  381. private int parempiHai(Pokerikasi kasi){
  382. List<Kortti> hait1 = new ArrayList<Kortti>();
  383. List<Kortti> hait2 = new ArrayList<Kortti>();
  384. // Otetaan talteen tämän käden hai-kortit
  385. for(Kortti kortti : kortit){
  386. if(merkitseva1.compareTo(kortti) != 0 && merkitseva2.compareTo(kortti) != 0){
  387. hait1.add(kortti);
  388. }
  389. }
  390. // Otetaan talteen parametrikäden hai-kortit
  391. for(Kortti kortti : kasi.kortit){
  392. if(kasi.merkitseva1.compareTo(kortti) != 0 && kasi.merkitseva2.compareTo(kortti) != 0){
  393. hait2.add(kortti);
  394. }
  395. }
  396. for(int i = 0; i < hait1.size(); i++){
  397. int vertailu = hait1.get(i).compareTo(hait2.get(i));
  398. if(vertailu != 0){
  399. return vertailu;
  400. }
  401. }
  402. return 0;
  403. }
  404.  
  405. private boolean onkoVariSuora(){
  406. // Testataan, että käsi on sekä väri että suora
  407. return onkoVari() && onkoSuora();
  408. }
  409.  
  410. private boolean onkoSuora(){
  411. int viimeinen = kortit.size();
  412. // Testataan viimeinen kortti erikseen, koska se voi olla ässä
  413. if(kortit.get(kortit.size()-1).annaArvo() == 1){
  414. // Toiseksi viimeisen kortin tulee olla kuningas
  415. if(kortit.get(kortit.size()-2).annaArvo() != 13){
  416. return false;
  417. }
  418. viimeinen--;
  419. }
  420. for(int i = 1; i < viimeinen; i++){
  421. if(kortit.get(i).annaArvo() != kortit.get(i-1).annaArvo() + 1){
  422. return false;
  423. }
  424. }
  425. return true;
  426. }
  427.  
  428. private boolean onkoVari(){
  429. // Tarkastetaan, ovatko peräkkäiset kortit samaa maata
  430. for(int i = 1; i < kortit.size(); i++){
  431. if(kortit.get(i).annaMaa() != kortit.get(i-1).annaMaa()){
  432. return false;
  433. }
  434. }
  435. merkitseva1 = kortit.get(kortit.size()-1);
  436. return true;
  437. }
  438.  
  439. private boolean onkoNeljaSamaa(){
  440. // Neljä samaa joko muodossa 8,8,8,8,12 tai 6,8,8,8,8
  441. // joka tapauksessa käsi voidaan tarkastaa esimerkiksi toisen kortin
  442. // arvon frekvenssin mukaan
  443. if(laskeFrekvenssi(kortit.get(1).annaArvo()) == 4){
  444. merkitseva1 = kortit.get(1);
  445. return true;
  446. }
  447. return false;
  448. }
  449.  
  450. private boolean onkoTaysKasi(){
  451. // Täyskäsi muotoa 3,3,3,8,8
  452. if(laskeFrekvenssi(kortit.get(0).annaArvo()) == 3 && laskeFrekvenssi(kortit.get(3).annaArvo()) == 2){
  453. merkitseva1 = kortit.get(0);
  454. merkitseva2 = kortit.get(3);
  455. return true;
  456. // Täyskäsi muotoa 3,3,8,8,8
  457. } else if(laskeFrekvenssi(kortit.get(0).annaArvo()) == 2 && laskeFrekvenssi(kortit.get(3).annaArvo()) == 3){
  458. merkitseva1 = kortit.get(3);
  459. merkitseva2 = kortit.get(0);
  460. return true;
  461. }
  462. return false;
  463. }
  464.  
  465. private boolean onkoKolmeSamaa(){
  466. // Kolme samaa joko muodossa 8,8,8,10,11, 3,8,8,8,13 tai 3,6,8,8,8
  467. // Merkitsevä kortti on joka tapauksessa kolmas korteista
  468. if(laskeFrekvenssi(kortit.get(2).annaArvo()) == 3){
  469. merkitseva1 = kortit.get(2);
  470. return true;
  471. }
  472. return false;
  473. }
  474.  
  475.  
  476. private boolean onkoKaksiParia(){
  477. // Kaksi paria muodossa 2,2,5,7,7
  478. if(laskeFrekvenssi(kortit.get(0).annaArvo()) == 2 && laskeFrekvenssi(kortit.get(kortit.size()-1).annaArvo()) == 2){
  479. merkitseva1 = kortit.get(kortit.size()-1);
  480. merkitseva2 = kortit.get(0);
  481. return true;
  482. // Kaksi paria muodossa 2,5,5,7,7
  483. } else if(laskeFrekvenssi(kortit.get(2).annaArvo()) == 2 && laskeFrekvenssi(kortit.get(kortit.size()-1).annaArvo()) == 2){
  484. merkitseva1 = kortit.get(kortit.size()-1);
  485. merkitseva2 = kortit.get(2);
  486. return true;
  487. // Kaksi paria muodossa 2,2,5,5,7
  488. } else if(laskeFrekvenssi(kortit.get(0).annaArvo()) == 2 && laskeFrekvenssi(kortit.get(2).annaArvo()) == 2){
  489. merkitseva1 = kortit.get(2);
  490. merkitseva2 = kortit.get(0);
  491. return true;
  492. }
  493. return false;
  494. }
  495.  
  496. private boolean onkoPari(){
  497. // Tarkistetaan, löytyykö kaksi peräkkäistä saman arvoista korttia
  498. for(int i = 1; i < kortit.size(); i++){
  499. if(kortit.get(i).annaArvo() == kortit.get(i-1).annaArvo()){
  500. merkitseva1 = kortit.get(i);
  501. return true;
  502. }
  503. }
  504. return false;
  505. }
  506.  
  507. /** Laskee tietyn arvoisten korttien lukumäärän kädessä. */
  508. private int laskeFrekvenssi(int kortinArvo){
  509. int frekvenssi = 0;
  510. for(Kortti kortti : kortit){
  511. if(kortti.annaArvo() == kortinArvo){
  512. frekvenssi++;
  513. }
  514. }
  515. return frekvenssi;
  516. }
  517. }
  518.  
  519.  
  520.  
  521.  
  522. class Kortti implements Comparable<Kortti>{
  523.  
  524. // Luokkaamuuttujat eri maille
  525. public static final int PATA = 1;
  526. public static final int HERTTA = 2;
  527. public static final int RUUTU = 3;
  528. public static final int RISTI = 4;
  529.  
  530. // Attribuutit vakiota (final), koska kortin maan ja arvon vaihtoa ei sallita luonnin jälkeen
  531. private final int maa;
  532. private final int arvo;
  533.  
  534. public Kortti(int maa, int arvo) {
  535. this.maa = maa;
  536. this.arvo = arvo;
  537. }
  538.  
  539. public int annaMaa(){
  540. return maa;
  541. }
  542. public int annaArvo(){
  543. return arvo;
  544. }
  545.  
  546. public String toString(){
  547. switch(maa){
  548. case Kortti.PATA:
  549. return ("pata " + arvo);
  550. case Kortti.HERTTA:
  551. return ("hertta " + arvo);
  552. case Kortti.RUUTU:
  553. return ("ruutu " + arvo);
  554. case Kortti.RISTI:
  555. return ("risti " + arvo);
  556. }
  557. return null;
  558. }
  559.  
  560. public int compareTo(Kortti card){
  561. int value1 = this.arvo;
  562. int value2 = card.annaArvo();
  563. // Ässä vertailussa suurin kortti
  564. if(value1 == 1){
  565. value1 = 14;
  566. }
  567. if(value2 == 1){
  568. value2 = 14;
  569. }
  570. return value1 - value2;
  571. }
  572. }
  573.  
  574. public class PokeriTesti {
  575.  
  576. public static void main(String[] args) throws DuplikaattiKorttiPoikkeus{
  577. System.out.println("Luodaan pakka");
  578. KorttiPakka dc = new KorttiPakka();
  579. System.out.println(dc);
  580. dc.uusiPakka();
  581. dc.sekoita();
  582. Kortti k1=new Kortti(1,1);
  583. System.out.println(dc);
  584. try{
  585.  
  586. dc.lisaaKortti(k1);
  587.  
  588. } catch (IllegalArgumentException iae){
  589.  
  590. }
  591. }
  592. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement