FiveCanvas.java
上传用户:gyyuli
上传日期:2013-07-09
资源大小:3050k
文件大小:10k
源码类别:

J2ME

开发平台:

Java

  1. import java.io.IOException;
  2. import javax.microedition.lcdui.*;
  3. public class FiveCanvas extends Canvas
  4.     implements CommandListener
  5. {
  6.     public static int BLACK = 0;
  7.     public static int WHITE = 0xffffff;
  8.     public static int RED = 0xff0000;
  9.     public static int GREEN = 65280;
  10.     public static int BLUE = 255;
  11.     public static int WOOD = 0xffd020;
  12.     private FiveMIDlet midFive;
  13.     private Reg reg;
  14.     private Command cmdStop;
  15.     private Command cmdNew;
  16.     private Command cmdUndo;
  17.     private FiveLogic logic;
  18.     private int borderSize;
  19.     private boolean computerFirst;
  20.     private int degree;
  21.     private int cavWidth;
  22.     private int cavHeight;
  23.     private int cWidth;
  24.     private int cHeight;
  25.     private Font font;
  26.     private int fWidth;
  27.     private int fHeight;
  28.     private int borderX;
  29.     private int borderY;
  30.     private int borderLength;
  31.     private int gridLength;
  32.     private int stoneLength;
  33.     private int statusY;
  34.     private String status;
  35.     private int statusColor;
  36.     private boolean statusUpSide;
  37.     private final Image imgStatus[] = new Image[4];
  38.     private int statusImage;
  39.     public static int THINK = 0;
  40.     public static int SMILE = 1;
  41.     public static int CRY = 2;
  42.     public static int NONE = 3;
  43.     private boolean isColor;
  44.     static 
  45.     {
  46.         BLACK = 0;
  47.         WHITE = 0xffffff;
  48.         RED = 0xff0000;
  49.         GREEN = 65280;
  50.         BLUE = 255;
  51.         WOOD = 0xffd020;
  52.         THINK = 0;
  53.         SMILE = 1;
  54.         CRY = 2;
  55.         NONE = 3;
  56.     }
  57.     public FiveCanvas(FiveMIDlet m, Reg r)
  58.     {
  59.         midFive = m;
  60.         reg = r;
  61.         cmdNew = new Command("重玩", 4, 2);
  62.         cmdStop = new Command("退出", 2, 1);
  63.         cmdUndo = new Command("悔棋", 1, 3);
  64.         addCommand(cmdNew);
  65.         addCommand(cmdStop);
  66.         setCommandListener(this);
  67.         cavWidth = getWidth();
  68.         cavHeight = getHeight();
  69.         status = "";
  70.         statusColor = 0;
  71.         statusUpSide = true;
  72.         for(int i = 0; i < 4; i++)
  73.             imgStatus[i] = Image.createImage(1, 1);
  74.         try
  75.         {
  76.             imgStatus[0] = Image.createImage("/Think.png");
  77.         }
  78.         catch(IOException _ex) { }
  79.         try
  80.         {
  81.             imgStatus[1] = Image.createImage("/Smile.png");
  82.         }
  83.         catch(IOException _ex) { }
  84.         try
  85.         {
  86.             imgStatus[2] = Image.createImage("/Cry.png");
  87.         }
  88.         catch(IOException _ex) { }
  89.         statusImage = 3;
  90.         isColor = Display.getDisplay(midFive).numColors() > 2;
  91.     }
  92.     private void calcSize()
  93.     {
  94.         font = Font.getDefaultFont();
  95.         fWidth = font.charWidth('字');
  96.         fHeight = font.getHeight();
  97.         statusUpSide = cavHeight > cavWidth;
  98.         if(statusUpSide)
  99.         {
  100.             cWidth = cavWidth;
  101.             cHeight = cavHeight - fHeight;
  102.         } else
  103.         {
  104.             cWidth = cavWidth - fWidth;
  105.             cHeight = cavHeight;
  106.         }
  107.         borderLength = cWidth > cHeight ? cHeight : cWidth;
  108.         gridLength = borderLength / borderSize;
  109.         borderLength = gridLength * borderSize;
  110.         borderX = (cWidth - borderLength) / 2;
  111.         borderY = (cHeight - borderLength) / 2;
  112.         if(statusUpSide)
  113.             borderY += fHeight;
  114.         stoneLength = gridLength - 2;
  115.     }
  116.     public void paint(Graphics g)
  117.     {
  118.         g.setColor(0xffffff);
  119.         g.fillRect(0, 0, cavWidth, cavHeight);
  120.         if(isColor)
  121.         {
  122.             g.setColor(219,219,0);
  123.             g.fillRect(borderX, borderY, borderLength, borderLength);
  124.         }
  125.         g.setColor(isColor ? 255 : 0);
  126.         int y;
  127.         for(int r = 0; r < borderSize; r++)
  128.         {
  129.             int x1 = borderX + gridLength / 2;
  130.             int x2 = (x1 + borderLength) - gridLength;
  131.             y = borderY + r * gridLength + gridLength / 2;
  132.             g.drawLine(x1, y, x2, y);
  133.         }
  134.         int x;
  135.         for(int c = 0; c < borderSize; c++)
  136.         {
  137.             x = borderX + c * gridLength + gridLength / 2;
  138.             int y1 = borderY + gridLength / 2;
  139.             int y2 = (y1 + borderLength) - gridLength;
  140.             g.drawLine(x, y1, x, y2);
  141.         }
  142.         int computerColor;
  143.         int manColor;
  144.         if(computerFirst)
  145.         {
  146.             computerColor = 0;
  147.             manColor = 0xffffff;
  148.         } else
  149.         {
  150.             computerColor = 0xffffff;
  151.             manColor = 0;
  152.         }
  153.         Dot triedDot = logic.triedDot();
  154.         int triedRow = triedDot.row;
  155.         int triedCol = triedDot.col;
  156.         for(int r = 0; r < borderSize; r++)
  157.         {
  158.             for(int c = 0; c < borderSize; c++)
  159.                 if(r != triedRow || c != triedCol)
  160.                 {
  161.                     int stone = logic.stones()[r][c];
  162.                     if(stone != 0)
  163.                     {
  164.                         x = xByCol(c) - stoneLength / 2;
  165.                         y = yByRow(r) - stoneLength / 2;
  166.                         g.setColor(stone == 1 ? computerColor : manColor);
  167.                         g.fillArc(x, y, stoneLength, stoneLength, 0, 360);
  168.                         g.setColor(0);
  169.                         g.drawArc(x, y, stoneLength, stoneLength, 0, 360);
  170.                     }
  171.                 }
  172.         }
  173.         Dot lastDot = logic.lastDot();
  174.         int lastRow = lastDot.row;
  175.         int lastCol = lastDot.col;
  176.         int cLast;
  177.         if(isColor)
  178.         {
  179.             cLast = 0xff0000;
  180.         } else
  181.         {
  182.             cLast = 0;
  183.             switch(logic.stones()[lastRow][lastCol])
  184.             {
  185.             case 1: // '01'
  186.                 cLast = manColor;
  187.                 break;
  188.             case 2: // '02'
  189.                 cLast = computerColor;
  190.                 break;
  191.             }
  192.         }
  193.         g.setColor(cLast);
  194.         x = xByCol(lastCol) - 3;
  195.         y = yByRow(lastRow) - 3;
  196.         g.drawRect(x, y, 6, 6);
  197.         g.setFont(font);
  198.         g.setColor(isColor ? statusColor : 0);
  199.         if(statusUpSide)
  200.         {
  201.             g.drawImage(imgStatus[statusImage], 0, 0, 20);
  202.             x = imgStatus[statusImage].getWidth();
  203.             g.drawString(status, x, 0, 20);
  204.         } else
  205.         {
  206.             x = cWidth + fWidth;
  207.             g.drawImage(imgStatus[statusImage], x, 0, 24);
  208.             x = cWidth + fWidth / 2;
  209.             y = imgStatus[statusImage].getHeight();
  210.             for(int i = 0; i < status.length(); i++)
  211.             {
  212.                 char c = status.charAt(i);
  213.                 g.drawChar(c, x, y, 17);
  214.                 y += fHeight;
  215.             }
  216.         }
  217.     }
  218.     private int xByCol(int col)
  219.     {
  220.         return borderX + col * gridLength + gridLength / 2;
  221.     }
  222.     private int yByRow(int row)
  223.     {
  224.         return borderY + row * gridLength + gridLength / 2;
  225.     }
  226.     protected void keyPressed(int keyCode)
  227.     {
  228.         if(!logic.gameEnd() && !logic.thinking())
  229.         {
  230.             int bs = borderSize;
  231.             Dot lastDot = logic.lastDot();
  232.             int r = lastDot.row;
  233.             int c = lastDot.col;
  234.             repaintAt(r, c);
  235.             int ga = getGameAction(keyCode);
  236.             if(ga == Canvas.LEFT || keyCode == 52)
  237.             {
  238.                 if(--c < 0)
  239.                     c = bs - 1;
  240.                 lastDot.setRowCol(r, c);
  241.                 repaintAt(r, c);
  242.             } else
  243.             if(ga == Canvas.RIGHT || keyCode == 54)
  244.             {
  245.                 if(++c >= bs)
  246.                     c = 0;
  247.                 lastDot.setRowCol(r, c);
  248.                 repaintAt(r, c);
  249.             } else
  250.             if(ga == Canvas.UP || keyCode == 50)
  251.             {
  252.                 if(--r < 0)
  253.                     r = bs - 1;
  254.                 lastDot.setRowCol(r, c);
  255.                 repaintAt(r, c);
  256.             } else
  257.             if(ga == Canvas.DOWN || keyCode == 56)
  258.             {
  259.                 if(++r >= bs)
  260.                     r = 0;
  261.                 lastDot.setRowCol(r, c);
  262.                 repaintAt(r, c);
  263.             } else
  264.             if(ga == Canvas.FIRE || keyCode == 53)
  265.                 logic.manGo(r, c);
  266.         }
  267.     }
  268.     protected void keyRepeated(int keyCode)
  269.     {
  270.         keyPressed(keyCode);
  271.     }
  272.     protected void pointerPressed(int x, int y)
  273.     {
  274.         if(!logic.gameEnd() && !logic.thinking())
  275.         {
  276.             int row = (y - borderY) / gridLength;
  277.             int col = (x - borderX) / gridLength;
  278.             logic.manGo(row, col);
  279.         }
  280.     }
  281.     public void commandAction(Command c, Displayable s)
  282.     {
  283.         if(!logic.thinking())
  284.             if(c == cmdStop)
  285.                 midFive.backHome();
  286.             else
  287.             if(c == cmdNew)
  288.                 newStage();
  289.             else
  290.             if(c == cmdUndo && !logic.undo())
  291.                 setStatus("不能悔棋!");
  292.     }
  293.     public void setOptions(int borderSize, boolean computerFirst, int degree)
  294.     {
  295.         this.borderSize = borderSize;
  296.         this.computerFirst = computerFirst;
  297.         this.degree = degree;
  298.     }
  299.     public boolean newStage()
  300.     {
  301.         addCommand(cmdUndo);
  302.         addCommand(cmdStop);
  303.         removeCommand(cmdNew);
  304.         calcSize();
  305.         logic = new FiveLogic(this, borderSize, computerFirst, degree);
  306.         if(computerFirst)
  307.             logic.computerGo();
  308.         else
  309.             setStatus("请下子:");
  310.         repaint();
  311.         return true;
  312.     }
  313.     public void notifyGameEnd()
  314.     {
  315.         addCommand(cmdNew);
  316.         addCommand(cmdStop);
  317.         removeCommand(cmdUndo);
  318.     }
  319.     public void setStatus(String s)
  320.     {
  321.         setStatus(s, 0, 3);
  322.     }
  323.     public void setStatus(String s, int color, int image)
  324.     {
  325.         status = s;
  326.         statusColor = color;
  327.         statusImage = image;
  328.         int x;
  329.         int y;
  330.         int w;
  331.         int h;
  332.         if(statusUpSide)
  333.         {
  334.             x = 0;
  335.             y = 0;
  336.             w = cavWidth;
  337.             h = fHeight;
  338.         } else
  339.         {
  340.             x = cWidth;
  341.             y = 0;
  342.             w = fWidth;
  343.             h = cavHeight;
  344.         }
  345.         repaint(x, y, w, h);
  346.     }
  347.     public void repaintAt(int row, int col)
  348.     {
  349.         int pX = borderX + (col - 1) * gridLength;
  350.         int pY = borderY + (row - 1) * gridLength;
  351.         int pW = gridLength * 2;
  352.         int pH = pW;
  353.         repaint(pX, pY, pW, pH);
  354.     }
  355. }