ChessPanel.java
上传用户:sjjz88
上传日期:2013-04-10
资源大小:452k
文件大小:6k
源码类别:

游戏

开发平台:

Java

  1. //杨建国:ChessPanel.java
  2. // Drawing a Chess Map.
  3. import javax.swing.*;
  4. import javax.swing.event.*;
  5. import java.awt.*;
  6. import java.awt.event.*;
  7. import java.net.*;
  8. public class ChessPanel extends JPanel{
  9. private ImageIcon map; //棋盘背景位图
  10.    private ImageIcon blackchess; //黑子位图
  11.    private ImageIcon whitechess; //白子位图
  12.    private int isChessOn [][]; //棋局图
  13.    private int h; //棋子长
  14.   private int w; //棋子宽
  15.   private int insx; //插入棋子的位置
  16.   private int insy;
  17.   private Point mousePoint; //鼠标当前位置
  18.   private int winer; //谁赢了
  19.   private Point last[]; //缓存上一步棋,为了悔棋
  20.   private int plast=0; //走了几步了,
  21.   public int BLACK_ONE; //1表黑子
  22.   public int WHITE_ONE; //-1表白子
  23.   public int NONE_ONE; //0表无子
  24.   public int N; //棋盘边长
  25.   //winer
  26.   ChessPanel(ImageIcon r_map,ImageIcon r_blackchess,ImageIcon r_whitechess) 
  27.   {
  28.   N=15;
  29.   map=new ImageIcon();
  30.   blackchess=new ImageIcon();
  31.   whitechess=new ImageIcon();
  32.   last=new Point[2];
  33.    map=r_map;
  34.    blackchess=r_blackchess;
  35.    whitechess=r_whitechess;
  36.    NONE_ONE=0;
  37.    BLACK_ONE=1;
  38.    WHITE_ONE=-1;
  39.    winer=NONE_ONE;
  40.     isChessOn=new int[N][N];
  41.      h=blackchess.getIconHeight()*(N-1);
  42.      w=blackchess.getIconWidth()*(N-1);
  43.      insx=0;
  44.      insy=0;
  45.      mousePoint=new Point();
  46.          
  47.   }
  48.   public void reset() //重开一局
  49.   {
  50.    winer=NONE_ONE;
  51.    for(int i=0;i<N;i++)
  52.    for(int j=0;j<N;j++)
  53.    {
  54.    isChessOn[i][j]=NONE_ONE;
  55.    }
  56.    repaint();
  57.   }
  58.   public void rollback() //悔一步棋
  59.   {
  60.    for(int i=0;i<2;i++)
  61.    {
  62.    isChessOn[last[i].x][last[i].y]=NONE_ONE;
  63.    }
  64.   }
  65.   public void showMousePos(Point p) //调试用,显示鼠标位置
  66.   {
  67.    int cw;
  68.    cw=h/N;
  69.    mousePoint.x=p.x/cw;
  70.    mousePoint.y=p.y/cw;
  71.    repaint();
  72.   }
  73.   public Point addChess(int x,int y,int type) //下一步棋,参数为插入点像素坐标
  74.   {
  75.    int cw;
  76.    insx=x;
  77.    insy=y;
  78.    cw=h/N;
  79.    if(x<=w+cw/2&&y<=h+cw/2&&isChessOn[x/cw][y/cw]==NONE_ONE&&winer==NONE_ONE)
  80.    {
  81.    isChessOn[x/cw][y/cw]=type;
  82.    // System.out.println("add ("+x/cw+","+y/cw+")ttype="+type);
  83.    last[(plast++)%2]=new Point(x/cw,y/cw);
  84.    }
  85.    else
  86.    {
  87.    System.out.println("add Chess error");
  88.    }
  89.    repaint();
  90.    Point r=new Point(x/cw,y/cw);
  91.    return r;
  92.   }
  93.   public Point addChess(int x,int y,int type,boolean isMatrix)//下一步棋,isMatrix位true参数为插入点棋格坐标,否则参数为插入点像素坐标
  94.   {
  95.    if(isMatrix==true)
  96.    {
  97.    if(x<N&&y<N&&isChessOn[x][y]==NONE_ONE&&winer==NONE_ONE)
  98.    {
  99.    isChessOn[x][y]=type;
  100.    // System.out.println("add ("+x+","+y+")ttype="+type+"isChessOn[][]="+isChessOn[x][y]);
  101.    last[(plast++)%2]=new Point(x,y);
  102.    }
  103.    else
  104.    {
  105.    System.out.println("add Chess error");
  106.    }
  107.    repaint();
  108.    Point r=new Point(x,y);
  109.    return r;
  110.    }
  111.    else
  112.    {
  113.    int cw;
  114.    insx=x;
  115.    insy=y;
  116.    cw=h/N;
  117.    if(x<=w+cw/2&&y<=h+cw/2&&isChessOn[x/cw][y/cw]==NONE_ONE&&winer==NONE_ONE)
  118.    {
  119.    isChessOn[x/cw][y/cw]=type;
  120.    }
  121.    repaint();
  122.    Point r=new Point(x/cw,y/cw);
  123.    return r;
  124.    }
  125.   
  126.   }
  127.   public boolean isSuccess(int type) //判断是否有一方胜利
  128.   {
  129.    int i=0;
  130.    int j=0;
  131.    int i1,j1;
  132.    int successFactor_v=0; //横向五子连珠
  133.    int successFactor_h=0; //纵向五子连珠
  134.    int successFactor_l=0; //左斜线五子连珠
  135.    int successFactor_r=0; //右斜线五子连珠
  136.    for(i=0;i<N;i++)
  137.    for(j=0;j<N;j++)
  138.    {
  139.    successFactor_v=0;
  140.    successFactor_h=0;
  141.    successFactor_l=0;
  142.    successFactor_r=0;
  143.    i1=i;
  144.    j1=j;
  145.    while(i1++<N)
  146.    {
  147.    if(isChessOn[i1-1][j]==type) successFactor_v++;
  148.    else i1=N;
  149.    }
  150.    i1=i;
  151.    j1=j;
  152.    while(j1++<N)
  153.    {
  154.    if(isChessOn[i][j1-1]==type) successFactor_h++;
  155.    else j1=N;
  156.    }
  157.    i1=i;
  158.    j1=j;
  159.    while(i1++<N&&j1++<N)
  160.    {
  161.    if(isChessOn[i1-1][j1-1]==type) successFactor_r++;
  162.    else i1=N;
  163.    }
  164.    i1=i;
  165.    j1=j;
  166.    while(i1++<N&&j1-->=0)
  167.    {
  168.    if(isChessOn[i1-1][j1+1]==type) successFactor_l++;
  169.    else i1=N;
  170.    }
  171.    if(successFactor_v>0||successFactor_h>0||successFactor_l>0||successFactor_r>0)
  172.    // System.out.println(type+"t"+i+"--"+j+"tsv="+successFactor_v+"tsh="+successFactor_h+"tsl="+successFactor_l+"tsr="+successFactor_r);
  173.    if(successFactor_v==5||successFactor_h==5||successFactor_l==5||successFactor_r==5)
  174.    return true;
  175.    }
  176.   
  177.   
  178.    return false;
  179.   
  180.   }
  181.   public void gameOver(int r_winer) //游戏胜负已分
  182.   {
  183.    winer=r_winer;
  184.   }
  185.   public void paint(Graphics g) //画客户区
  186.   {
  187.     super.paint(g);
  188.     paintChessMap(g); 
  189.     paintChess(g);
  190.     if(winer==BLACK_ONE)
  191.     {
  192.      g.drawString(new String("Game Over!Black Win!"),500,200);
  193.     
  194.     }
  195.     else if(winer==WHITE_ONE)
  196.     {
  197.      g.drawString(new String("Game Over!White Win!"),500,200);
  198.     
  199.     }
  200.   }
  201.   private void paintChessMap(Graphics g) //画棋盘
  202.   {
  203.    map.paintIcon(this,g,10,10);
  204.    int j;
  205.     g.setColor(Color.BLACK);
  206.     for(j=0;j<N;j++) //画线
  207.     {
  208.      g.drawLine(h/N/2,h/N*j+h/N/2,w-w/N+(N%2)*(h/N/2),h/N*j+h/N/2);
  209.      g.drawLine(w/N*j+h/N/2,h/N/2,w/N*j+h/N/2,h-h/N+(N%2)*(h/N/2));
  210.     
  211.     }
  212.     g.fillRect(w/N*7+h/N/2-3,h/N*7+h/N/2-3,6,6);//画5个黑方块
  213.     g.fillRect(w/N*3+h/N/2-3,h/N*3+h/N/2-3,6,6);
  214.     g.fillRect(w/N*11+h/N/2-3,h/N*3+h/N/2-3,6,6);
  215.     g.fillRect(w/N*3+h/N/2-3,h/N*11+h/N/2-3,6,6);
  216.     g.fillRect(w/N*11+h/N/2-3,h/N*11+h/N/2-3,6,6);
  217.   }
  218.   private void paintChess(Graphics g) //画棋子
  219.   {
  220.    int i,j;
  221.    for(i=0;i<N;i++)
  222.    for(j=0;j<N;j++)
  223.    {
  224.    if(isChessOn[i][j]==BLACK_ONE)
  225.    {
  226.    blackchess.paintIcon(this,g,w/N*i,h/N*j);
  227.    }
  228.    else if(isChessOn[i][j]==WHITE_ONE)
  229.    {
  230.    whitechess.paintIcon(this,g,w/N*i,h/N*j);
  231.    }
  232.    }
  233.   }
  234. }