visidor/src/main/java/cz/xelfi/quoridor/visidor/Viewer.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 04 Sep 2010 21:58:56 +0200
changeset 248 9bbf25021886
parent 178 4b78d4f028b3
child 249 47d62a3afe63
permissions -rw-r--r--
Using Java2D to display the board
     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * The contents of this file are subject to the terms of either the GNU
     5  * General Public License Version 2 only ("GPL") or the Common
     6  * Development and Distribution License("CDDL") (collectively, the
     7  * "License"). You may not use this file except in compliance with the
     8  * License. You can obtain a copy of the License at
     9  * http://www.netbeans.org/cddl-gplv2.html
    10  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
    11  * specific language governing permissions and limitations under the
    12  * License.  When distributing the software, include this License Header
    13  * Notice in each file and include the License file at
    14  * nbbuild/licenses/CDDL-GPL-2-CP.  Sun designates this
    15  * particular file as subject to the "Classpath" exception as provided
    16  * by Sun in the GPL Version 2 section of the License file that
    17  * accompanied this code. If applicable, add the following below the
    18  * License Header, with the fields enclosed by brackets [] replaced by
    19  * your own identifying information:
    20  * "Portions Copyrighted [year] [name of copyright owner]"
    21  *
    22  * Contributor(s):
    23  *
    24  * Portions Copyrighted 2009 Jaroslav Tulach
    25  */
    26 package cz.xelfi.quoridor.visidor;
    27 
    28 import cz.xelfi.quoridor.Board;
    29 import cz.xelfi.quoridor.Fence;
    30 import cz.xelfi.quoridor.Fence.Orientation;
    31 import cz.xelfi.quoridor.IllegalPositionException;
    32 import cz.xelfi.quoridor.Move;
    33 import cz.xelfi.quoridor.Player;
    34 import java.awt.Color;
    35 import java.awt.Font;
    36 import java.awt.Graphics;
    37 import java.awt.Graphics2D;
    38 import java.awt.Rectangle;
    39 import javax.swing.JFrame;
    40 import javax.swing.JPanel;
    41 
    42 /**
    43  *
    44  * @author Jaroslav Tulach <jtulach@netbeans.org>
    45  */
    46 final class Viewer extends JPanel {
    47     private Board board;
    48 
    49     public Viewer() {
    50         this(Board.empty());
    51     }
    52 
    53     private Viewer(Board b) {
    54         this.board = b;
    55     }
    56 
    57 
    58     /**
    59      * @param args the command line arguments
    60      */
    61     public static void main(String[] args) throws IllegalPositionException {
    62         Board b = Board.empty();
    63         for (int i = 1; i <= 8; i++) {
    64             b = b.apply(Move.fence('A', i, Orientation.values()[i % 2]));
    65         }
    66         for (int i = 1; i <= 8; i++) {
    67             b = b.apply(Move.fence('H', i, Orientation.values()[(i + 1) % 2]));
    68         }
    69 
    70         JFrame f = new JFrame();
    71         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    72         f.add(new Viewer(b));
    73         f.pack();
    74         f.setVisible(true);
    75     }
    76 
    77     @Override
    78     protected void paintComponent(Graphics gg) {
    79         int fieldSize = Math.min(getSize().width, getSize().height) / 9;
    80         int fifth = fieldSize / 10;
    81         Graphics2D g = (Graphics2D) gg;
    82         
    83         int xdelta = getSize().width - fieldSize * 9;
    84         int ydelta = getSize().height - fieldSize * 9;
    85         
    86         g.translate(xdelta / 2, ydelta / 2);
    87 
    88         g.setColor(Color.lightGray);
    89         for (int i = 0; i < 9; i++) {
    90             for (int j = 0; j < 9; j++) {
    91                 final Rectangle r = new Rectangle(i * fieldSize, j * fieldSize, fieldSize, fieldSize);
    92                 g.fillRect(r.x + fifth, r.y + fifth, r.width - fifth * 2, r.height - fifth * 2);
    93             }
    94         }
    95 
    96 
    97         g.setColor(Color.BLACK);
    98         for (Fence f : board.getFences()) {
    99             int w, h;
   100             switch (f.getOrientation()) {
   101                 case HORIZONTAL: w = fieldSize - fifth; h = fifth; break;
   102                 case VERTICAL: w = fifth; h = fieldSize - fifth; break;
   103                 default: throw new IllegalStateException();
   104             }
   105             int column = (f.getColumn() - 'A') + 1;
   106             int row = 9 - f.getRow();
   107             Rectangle r = new Rectangle(
   108                 column * fieldSize - w,
   109                 row * fieldSize - h,
   110                 2 * w,
   111                 2 * h
   112             );
   113             g.fill(r);
   114         }
   115 
   116         int cnt = 0;
   117         Color[] colors = { Color.WHITE, Color.BLACK, Color.ORANGE, Color.MAGENTA };
   118         int diametr = fieldSize - fifth * 4;
   119         for (Player p : board.getPlayers()) {
   120             int column = p.getColumn();
   121             int row = 8 - p.getRow();
   122             final Rectangle r = new Rectangle(
   123                 column * fieldSize + 2 * fifth,
   124                 row * fieldSize + 2 * fifth,
   125                 diametr,
   126                 diametr
   127             );
   128             g.setColor(colors[cnt]);
   129             g.fillOval(r.x, r.y, r.width, r.height);
   130             if (p == board.getCurrentPlayer()) {
   131                 g.setColor(Color.lightGray);
   132                 g.fillOval(r.x + r.width / 3, r.y + r.height / 3, r.width / 3, r.height / 3);
   133             }
   134             cnt++;
   135         }
   136 
   137         g.setColor(Color.BLACK);
   138         final Font f = new Font("Monospace", Font.BOLD, fifth * 2);
   139         g.setFont(f);
   140         for (int i = 0; i < 8; i++) {
   141             final char ch = (char) ('A' + i);
   142             g.drawString(Character.toString(ch), i * fieldSize + fieldSize - fifth, fifth + f.getSize() - f.getBaselineFor(ch));
   143         }
   144         for (int i = 0; i < 8; i++) {
   145             String s = "" + (8 - i);
   146             g.drawString(s, fifth, i * fieldSize + fieldSize - fifth + f.getSize() - f.getBaselineFor(s.charAt(0)));
   147         }
   148     }
   149 
   150 }