Exercises in this lecture   Go to the notes, in which this exercise belongs -- Keyboard shortcut: 'u'   Alphabetic index   Course home   

Exercise solution 11.2
Krig - et simpelt kortspil


Her følger min udgave af spillet 'Krig':

import java.util.*;

class Krig {

  /* Et program som adminstrerer et spil kort og to spillere med hver sine kort.
     Programmet gennemfører et simpelt spil, som mange børn kalder 'Krig'.
     Denne version af programmet er basert på klassen Kortbunke
  */

  // Stakkene af kort repræsenteres som Kortbunkt objekter
  static Kortbunke kortSpil = new Kortbunke(Kortbunke.HELT_KORTSPIL);  // et fuld spil kort
  static Kortbunke spillerEt = new Kortbunke();
  static Kortbunke spillerTo = new Kortbunke();

  // En stak af kort der bruges når der opstår en krigssituation.
  static Kortbunke krigsPulje = new Kortbunke();
 
  // En variabel der peger på næste spillers Kortbunke.
  // Dette for at holde styr på, hvem der skal have næste kort når kortene deles ud mv.
  static Kortbunke næsteSpiller; 

  // Skift fra en spiller til den anden
  private static void skift(){
    if (næsteSpiller == spillerEt)
       næsteSpiller = spillerTo;
    else næsteSpiller = spillerEt;
  }

  // Udskriv situtationen for spillerne i termer af øverste kort og antal kort
  private static void situation(Spillekort k1, int n1, Spillekort k2, int n2){
    System.out.print("Spiller 1: " + k1 + "(" + n1 + ")" +  "   " + "Spiller 2: " + k2 + "(" + n2 + ")" + "     ");
  }
  
  public static void main (String[] args){

    // Bland kortene i hele spillet...
    kortSpil.bland();

    næsteSpiller = spillerEt;
    
    // Skriv dem lige ud så vi kan se dem...
    System.out.println("Kortbunken:"); 
    System.out.println(kortSpil);

    // Del kortene ud til spiller et og to:
    for (int i = 1; i <= 52; i++){
      Spillekort etKort = kortSpil.tagØverste();
      næsteSpiller.lægØverst(etKort);
      skift();
    }

    System.out.println("Spiller et's kort:");
    System.out.println(spillerEt);

    System.out.println("Spiller to's kort:");
    System.out.println(spillerTo);

    // Skriv dem lige ud så vi kan se at bunken nu er tom...
    System.out.println("Kortbunken:");
    System.out.println(kortSpil);


    // Og nu igang med spillet:
    while (!spillerEt.erTom() && !spillerTo.erTom()){
      Spillekort spillerEtsKort = spillerEt.tagØverste();
      Spillekort spillerTosKort = spillerTo.tagØverste();

      situation(spillerEtsKort, spillerEt.antalKort()+1, spillerTosKort, spillerTo.antalKort()+1); 

      if (spillerEtsKort.mindreEnd(spillerTosKort)){
         // Spiller to vinder de to kort. Læg de to kort nederst i bunken.
         spillerTo.lægNederst(spillerEtsKort);  spillerTo.lægNederst(spillerTosKort);
         System.out.println("Spiller to vinder");}
      else if (spillerTosKort.mindreEnd(spillerEtsKort)){
         // Spiller et vinder de to kort. Læg de to kort nederst i bunken.
         spillerEt.lægNederst(spillerTosKort);  spillerEt.lægNederst(spillerEtsKort);
         System.out.println("Spiller et vinder");}
      else {
         // Krig:
         System.out.println("KRIG KRIG KRIG KRIG KRIG KRIG KRIG");
 
         // Læg de to kort i krigsPuljen
         krigsPulje.lægØverst(spillerEtsKort);  krigsPulje.lægØverst(spillerTosKort); 
          
         // Hver spiller putter to kort mere i krigsPuljen (hvis de har to kort, vel at mærke)...
         if (!spillerEt.erTom()) krigsPulje.lægØverst(spillerEt.tagØverste());
         if (!spillerEt.erTom()) krigsPulje.lægØverst(spillerEt.tagØverste());
         if (!spillerTo.erTom()) krigsPulje.lægØverst(spillerTo.tagØverste());
         if (!spillerTo.erTom()) krigsPulje.lægØverst(spillerTo.tagØverste());


         // Afgør krigen ved at trække et kort mere og sammenlign:
         if (!spillerEt.erTom() && !spillerTo.erTom()){
            Spillekort spillerEtsAfgørendeKort = spillerEt.tagØverste();
            Spillekort spillerTosAfgørendeKort = spillerTo.tagØverste();
            
            if (spillerEtsAfgørendeKort.mindreEnd(spillerTosAfgørendeKort)){
               // Spiller to får krigsPuljen og de afgørende kort
               krigsPulje.lægØverst(spillerEtsAfgørendeKort); krigsPulje.lægØverst(spillerTosAfgørendeKort); 
               krigsPulje.bland();
               spillerTo.lægNederst(krigsPulje);
               krigsPulje.tøm();
               System.out.println("Spiller to vinder krigen");}
            else if (spillerTosAfgørendeKort.mindreEnd(spillerEtsAfgørendeKort)){
               // Spiller et får krigsPuljen og de afgørende kort
               krigsPulje.lægØverst(spillerEtsAfgørendeKort); krigsPulje.lægØverst(spillerTosAfgørendeKort); 
               krigsPulje.bland();
               spillerEt.lægNederst(krigsPulje);
               krigsPulje.tøm();
               System.out.println("Spiller et vinder krigen");}
            else {
               System.out.print("GENTAGEN KRIG: "); 
               System.out.println(spillerEtsAfgørendeKort + " vs " + spillerTosAfgørendeKort);

               // Vi laver en iterativ løsning på dobbeltkrigsproblemet.
               // De to afgørende kort lægges tilbage til spiller et og to.
               // Når spillet kører næste runde vil der umiddelbar opstå krig igen
               // Bemærk at puljen kun nulstilles når en af spillerne har vundet krigen.

               spillerEt.lægØverst(spillerEtsAfgørendeKort);
               spillerTo.lægØverst(spillerTosAfgørendeKort);
            }
         }

      }

   }

   if (spillerEt.erTom()) System.out.println("SPILLER TO ER VINDER");
   else System.out.println("SPILLER ET ER VINDER");
         
  }
}

Her er endvidere et link til det rene Java program med alle klasser samlet på én fil .