Guest User

Untitled

a guest
Feb 21st, 2018
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.06 KB | None | 0 0
  1. package week8;
  2.  
  3. /**
  4.  * Bord voor het Boter-Kaas-Eieren spel.
  5.  * Practicumopdracht P1.
  6.  * @author  Theo Ruys en Arend Rensink
  7.  * @version $Revision: 1.4 $
  8.  */
  9. public class Bord {
  10.  
  11.     // -- Constants --------------------------------------------------
  12.  
  13.     public  static final int      DIM       = 3 ;
  14.     private static final String[] NUMMERING = { " 0 | 1 | 2 ",
  15.                                                 "---+---+---",
  16.                                                 " 3 | 4 | 5 ",
  17.                                                 "---+---+---",
  18.                                                 " 6 | 7 | 8 " } ;
  19.     private static final String   LINE      = NUMMERING[1];
  20.     private static final String   DELIM     = "     " ;
  21.  
  22.     // -- Instance variables -----------------------------------------
  23.  
  24.     /**
  25.      * De DIM*DIM vakjes die het Boter-Kaas-Eieren bord vormen.
  26.      * Zie NUMMERING voor de codering van de vakjes.
  27.      * @invariant vakjes.length = DIM*DIM
  28.      *            for 0<=i<vakjes.length:
  29.      *              vakjes[i] == Mark.LEEG | Mark.XX | Mark.OO
  30.      */
  31.     private Mark[] vakjes;
  32.  
  33.     // -- Constructors -----------------------------------------------
  34.  
  35.     /**
  36.      * Creeert een leeg bord.
  37.      * @ensure for <code>0<=i<DIM*DIM: this.getVakje(i) == Mark.LEEG</code>
  38.      */
  39.     public Bord() {
  40.         vakjes = new Mark[DIM*DIM];
  41.         for(int i = 0; i < DIM*DIM; i++) {
  42.             vakjes[i] = Mark.LEEG;
  43.         }
  44.     }
  45.  
  46.     // -- Queries ----------------------------------------------------
  47.  
  48.     /**
  49.      * Creeert een deepcopy van dit bord.
  50.      * @ensure <code>result != this</code><br>
  51.      *         for <code>0 <= i < DIM*DIM:
  52.      *             result.getVakje(i) == this.getVakje(i)</code>
  53.      */
  54.     public Bord deepCopy() {
  55.         Bord b = new Bord();
  56.         for(int i = 0; i < vakjes.length; i++) {
  57.             b.setVakje(i, vakjes[i]);
  58.         }
  59.         return b;
  60.     }
  61.  
  62.     /**
  63.      * Berekent de index in de lineaire array van vakjes van
  64.      * een (rij,kol)-paar.
  65.      * @require <code>0 <= i,j < DIM</code>
  66.      * @return  de index behorende bij het (rij,kol)-vakje
  67.      */
  68.     public int index(int rij, int kol) {
  69.         return rij*DIM + kol;
  70.     }
  71.  
  72.     /**
  73.      * Levert true op als de <code>ix</code> een geldige index
  74.      * is van een vakje op dit speelbord.
  75.      * @ensure  <code>result == 0 <= ix < DIM*DIM</code>
  76.      * @return  <code>true</code> als <code>0 <= ix < DIM*DIM</code>
  77.      */
  78.     public boolean isVakje(int ix) {
  79.         return ix >= 0 && ix < DIM*DIM;
  80.     }
  81.  
  82.     /**
  83.      * Levert true op als de (rij,kol)-addressering geldig is voor
  84.      * een vakje op het speelbord.
  85.      * @ensure  <code>result == 0 <= rij,kol < DIM</code>
  86.      * @return  true als <code>0 <= rij < DIM && 0 <= kol < DIM</code>
  87.      */
  88.     public boolean isVakje(int rij, int kol) {
  89.         return isVakje(index(rij, kol));
  90.     }
  91.  
  92.     /**
  93.      * Levert de inhoud van vakje <code>i</code>.
  94.      * @require <code>this.isVakje(i)</code>
  95.      * @ensure  <code>result == Mark.LEEG | Mark.XX | Mark.OO</code>
  96.      * @param   i het nummer van het vakje (zie NUMMERING)
  97.      * @return  de markering van het i-de vakje
  98.      */
  99.     public Mark getVakje(int i) {
  100.         return vakjes[i];
  101.     }
  102.  
  103.     /**
  104.      * Levert de inhoud van vakje van rij <code>rij</code> en
  105.      * kolom <code>kol</code>.
  106.      * @require <code>this.isVakje(rij,kol)</code>
  107.      * @ensure  <code>result == Mark.LEEG | Mark.XX | Mark.OO</code>
  108.      * @param   rij de rij van het vakje
  109.      * @param   kol de kolom van het vakje
  110.      * @return  de markering van het (rij,kol)-de vakje
  111.      */
  112.     public Mark getVakje(int rij, int kol) {
  113.         return getVakje(index(rij, kol));
  114.     }
  115.  
  116.     /**
  117.      * Levert true op als het vakje <code>i</code> leeg is.
  118.      * @require <code>this.isVakje(i)</code>
  119.      * @ensure  <code>result == (this.getVakje(i) == LEEG)</code>
  120.      * @param   i het nummer van het vakje (zie NUMMERING)
  121.      * @return  true als het vakje leeg is.
  122.      */
  123.     public boolean isLeegVakje(int i) {
  124.         return getVakje(i) == Mark.LEEG;
  125.     }
  126.  
  127.     /**
  128.      * Levert true op als het vakje van rij <code>rij</code> en
  129.      * kolom <code>kol</code> leeg is.
  130.      * @require <code>this.isVakje(rij,kol)</code>
  131.      * @ensure  <code>result == Mark.LEEG | Mark.XX | Mark.OO</code>
  132.      * @param   rij de rij van het vakje
  133.      * @param   kol de kolom van het vakje
  134.      * @return  true als het (rij,kol)-de vakje leeg is.
  135.      */
  136.     public boolean isLeegVakje(int rij, int kol) {
  137.         return isLeegVakje(index(rij, kol));
  138.     }
  139.  
  140.     /**
  141.      * Test of het gehele bord vol is.
  142.      * @ensure <code>result == for all 0 <= i < DIM*DIM:
  143.      *                                 this.getVakje(i) != LEEG</code>
  144.      * @return true als alle vakjes bezet zijn.
  145.      */
  146.     public boolean isVol() {
  147.         int count = 0;
  148.         for(int i = 0; i < vakjes.length; i++) {
  149.             if(!isLeegVakje(i)) {
  150.                 count++;
  151.             }
  152.         }
  153.         return count == vakjes.length;
  154.     }
  155.  
  156.     /**
  157.      * Levert true op als het spel afgelopen is. <br>
  158.      * Het is spel is afgelopen als er een winnaar is of als
  159.      * het gehele bord vol is.
  160.      * @ensure result == this.isVol() || this.heeftWinnaar()
  161.      * @return true als het spel afgelopen is.
  162.      */
  163.     public boolean gameOver() {
  164.         return isVol() || heeftWinnaar();
  165.     }
  166.  
  167.     /**
  168.      * Controleert of er een <b>rij</b> is die geheel uit
  169.      * <code>m</code>'s bestaat.
  170.      * @require <code>m == Mark.LEEG | Mark.XX | Mark.OO</code>
  171.      * @ensure  <code>result == true</code> als er een rij is die
  172.      *          alleen uit <code>m</code>'s bestaat.
  173.      * @param   m de markering die gecontroleerd wordt
  174.      * @return  true als er een rij is met alleen maar <code>m</code>'s
  175.      */
  176.     public boolean heeftRij(Mark m) {
  177.         boolean heeft = false;
  178.         int count = 0;
  179.         for(int rij = 0; !heeft && rij < DIM; rij++) {
  180.             count = 0;
  181.             for(int kol = 0; !heeft && kol < DIM; kol++) {
  182.                 if(getVakje(index(rij, kol)) == m) {
  183.                     count++;
  184.                 }
  185.             }
  186.             heeft = (count == DIM);
  187.         }
  188.         return heeft;
  189.     }
  190.  
  191.     /**
  192.      * Controleert of er een <b>kolom</b> is die geheel uit
  193.      * <code>m</code>'s bestaat.
  194.      * @require <code>m == Mark.LEEG | Mark.XX | Mark.OO</code>
  195.      * @ensure  <code>result == true</code> als er een kolom is die
  196.      *          alleen uit <code>m</code>'s bestaat.
  197.      * @param   m de markering die gecontroleerd wordt
  198.      * @return  true als er een kolom is met alleen maar <code>m</code>'s
  199.      */
  200.     public boolean heeftKolom(Mark m) {
  201.         boolean heeft = false;
  202.         int count = 0;
  203.         for(int kol = 0; !heeft && kol < DIM; kol++) {
  204.             count = 0;
  205.             for(int rij = 0; !heeft && rij < DIM; rij++) {
  206.                 if(getVakje(index(rij, kol)) == m) {
  207.                     count++;
  208.                 }
  209.             }
  210.             heeft = (count == DIM);
  211.         }
  212.         return heeft;
  213.     }
  214.  
  215.     /**
  216.      * Controleert of er <b>diagonaal</b> is die geheel uit
  217.      * <code>m</code>'s bestaat.
  218.      * @require <code>m == Mark.LEEG | Mark.XX | Mark.OO</code>
  219.      * @ensure  <code>result == true</code> als er een diagonaal is die
  220.      *          alleen uit <code>m</code>'s bestaat.
  221.      * @param   m de markering die gecontroleerd wordt
  222.      * @return  true als er een diagonaal is met alleen maar <code>m</code>'s
  223.      */
  224.     public boolean heeftDiagonaal(Mark m) {
  225.         boolean diagonaal = false;
  226.         int count = 0;
  227.         for(int rij = 0, kol = 0; rij < DIM && kol < DIM; rij++, kol++) {
  228.             if(getVakje(index(rij, kol)) == m) {
  229.                 count++;
  230.             }
  231.         }
  232.         diagonaal = (count == DIM);
  233.         count = 0;
  234.         if(!diagonaal) {
  235.             for(int rij = DIM-1, kol = 0; rij >= 0 && kol < DIM; rij--, kol++) {
  236.                 if(getVakje(index(rij, kol)) == m) {
  237.                     count++;
  238.                 }
  239.             }
  240.             diagonaal = (count == DIM);
  241.         }
  242.         return diagonaal;
  243.     }
  244.  
  245.     /**
  246.      * Controleert of de markering <code>m</code> gewonnen heeft. <br>
  247.      * Een markering <code>m</code> heeft gewonnen dit Bord minstens
  248.      * een rij, een kolom, of diagonaal heeft die alleen maar uit
  249.      * <code>m</code>'s bestaat.
  250.      * @require <code>m == Mark.XX | Mark.OO</code>
  251.      * @ensure  <code>result == this.heeftRij(m) ||
  252.      *                          this.heeftKolom(m) ||
  253.      *                          this.heeftDiagonaal(m)</code>
  254.      * @param   m de markering die gecontroleerd gaat worden
  255.      * @return  true als de markering <code>m</code> gewonnen heeft
  256.      */
  257.     public boolean isWinnaar(Mark m) {
  258.         return heeftRij(m) || heeftKolom(m) || heeftDiagonaal(m);
  259.     }
  260.  
  261.     /**
  262.      * Levert true op als het spel een winnaar heeft. <br>
  263.      * Er is een winnaar als er een markering is die minstens
  264.      * een rij, kolom of diagonaal in zijn bezit heeft.
  265.      * @ensure <code>result == isWinnaar(XX) || isWinnaar(OO)</code>
  266.      * @return true als dit Bord een winnaar heeft.
  267.      */
  268.     public boolean heeftWinnaar() {
  269.         return isWinnaar(Mark.XX) || isWinnaar(Mark.OO);
  270.     }
  271.  
  272.     /**
  273.      * Levert een String-representatie van dit Bord op. <br>
  274.      * Naast de huidige toestand van het Bord, schrijft de methode
  275.      * ook de <code>NUMMERING</code> van de vakjes naast het Bord.
  276.      * @return de toestand van dit Bord als String.
  277.      */
  278.     public String toString() {
  279.         String s = "";
  280.         for (int i=0; i<DIM; i++) {
  281.             String rij = "";
  282.             for (int j=0; j<DIM; j++) {
  283.                 rij = rij + " " + getVakje(i,j).toString() + " " ;
  284.                 if (j<DIM-1) rij = rij + "|" ;
  285.             }
  286.             s = s + rij + DELIM + NUMMERING[i*2] ;
  287.             if (i<DIM-1)
  288.                 s = s + "\n" + LINE + DELIM + NUMMERING[i*2+1] + "\n";
  289.         }
  290.         return s;
  291.     }
  292.  
  293.     // -- Commands ---------------------------------------------------
  294.  
  295.     /**
  296.      * Maakt alle vakjes van dit bord leeg (d.w.z. LEEG).
  297.      * @ensure for <code>0 <= i < DIM*DIM: this.getVakje(i) == LEEG</code>
  298.      */
  299.     public void reset() {
  300.         for(int i = 0; i < DIM*DIM; i++) {
  301.             vakjes[i] = Mark.LEEG;
  302.         }
  303.     }
  304.  
  305.     /**
  306.      * Zet de inhoud van vakje <code>i</code> op markering <code>m</code>.
  307.      * @require <code>this.isVakje(i)</code>
  308.      *          <code>m == Mark.LEEG | Mark.XX | Mark.OO</code><br>
  309.      * @ensure  <code>this.getVakje(i) == m</code>
  310.      * @param   i het nummer van het vakje (zie NUMMERING)
  311.      * @param   m de gewenste markering van het i-de vakje
  312.      */
  313.     public void setVakje(int i, Mark m) {
  314.         vakjes[i] = m;
  315.     }
  316.  
  317.     /**
  318.      * Zet de inhoud van het vakje van rij <code>rij</code> en kolom
  319.      * <code>kol</code> op markering <code>m</code>. <br>
  320.      * @require <code>this.isVakje(rij,kol)</code>
  321.      *          <code>m == Mark.LEEG | Mark.XX | Mark.OO</code><br>
  322.      * @ensure  <code>this.getVakje(i) == m</code>
  323.      * @param   rij de rij van het vakje
  324.      * @param   kol de kolom van het vakje
  325.      * @param   m de gewenste markering van het (rij,kol)-de vakje
  326.      */
  327.     public void setVakje(int rij, int kol, Mark m) {
  328.         vakjes[index(rij, kol)] = m;
  329.     }
  330.  
  331. } // end of class Bord
Add Comment
Please, Sign In to add comment