import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.*; import javax.swing.*; import javax.imageio.ImageIO; /** * IgoGraphicPanel クラスは、グラフィック描画の碁盤を提供します。 * @author Jiro Suzuki */ public class IgoGraphicPanel extends IgoPanel{ private static final int BOX=32; private static final int ROSU=19; private IntBoard intBoard; private BufferedImage board; private BufferedImage blackStone; private BufferedImage whiteStone; private BufferedImage lastPoint; private IgoModel controller; private boolean isPutable; /** * 石が置かれていない碁盤イメージのインスタンスを生成します。 */ IgoGraphicPanel(){ intBoard=new IntBoard(); board=new BufferedImage(602,602,BufferedImage.TYPE_3BYTE_BGR); try{ board=ImageIO.read(new File("碁盤.png")); }catch(Exception e) { e.printStackTrace(); board = null; } blackStone = new BufferedImage(100,100,BufferedImage.TYPE_3BYTE_BGR); try{ blackStone=ImageIO.read(new File("黒石.png")); } catch (Exception e) { e.printStackTrace(); blackStone = null; } whiteStone = new BufferedImage(100,100,BufferedImage.TYPE_3BYTE_BGR); try{ whiteStone=ImageIO.read(new File("白石.png")); } catch (Exception e) { e.printStackTrace(); whiteStone = null; } lastPoint = new BufferedImage(100,100,BufferedImage.TYPE_3BYTE_BGR); try{ lastPoint=ImageIO.read(new File("最終手.gif")); } catch (Exception e) { e.printStackTrace(); lastPoint = null; } isPutable=false; addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent me){ if(isPutable){ boolean isOnBoardRow=false; boolean isOnBoardCol=false; int x=me.getX(); int y=me.getY(); int minX,minY,row,col; for(row=0;row<ROSU;row++){ minY=row*BOX+11; if(y>=minY && y<minY+BOX){ isOnBoardRow=true; break; } } for(col=0;col<ROSU;col++){ minX=col*BOX+11; if(x>=minX && x<minX+BOX){ isOnBoardCol=true; break; } } if(isOnBoardRow && isOnBoardCol){ controller.putStone(row,col); } } } }); } /** * グラフィック描画の碁盤を描画します。 * @param g 保護対象の Graphics オブジェクト */ public void paintComponent(Graphics g){ super.paintComponent(g); //碁盤の描画 g.drawImage(board,0,0,this); //石の描画 int[][] ban=intBoard.getIntBoard(); for(int row=0;row<ROSU;row++){ for(int col=0;col<ROSU;col++){ switch (ban[row][col]){ case 1: //黒石の描画 g.drawImage(blackStone,col*BOX+11,row*BOX+11,this); break; case 2: //白石の描画 g.drawImage(whiteStone,col*BOX+11,row*BOX+11,this); break; case 11: //最終手黒の描画 g.drawImage(blackStone,col*BOX+11,row*BOX+11,this); g.drawImage(lastPoint,col*BOX+11,row*BOX+11,this); break; case 12: //最終手白の描画 g.drawImage(whiteStone,col*BOX+11,row*BOX+11,this); g.drawImage(lastPoint,col*BOX+11,row*BOX+11,this); break; } } } } /** * グラフィック描画の碁盤を更新します。 * @param intBoard 碁盤に見立てた行列に、石の色を配置した碁盤データ */ public void update(IntBoard intBoard){ this.intBoard=intBoard; repaint(); } /** * コントローラーを設定します。 * @param controller コントローラー */ public void setIgoGameController(IgoModel controller){ this.controller=controller; isPutable=true; } }