五子棋(初学JAVA实训)

这只是一个非常简易的五子棋,仅仅作为初学JAVA者的编程锻炼

来张效果图:

下面的完整的源码:

  
  
  
  
  1. import java.awt.*;  
  2. import java.awt.event.*;  
  3. import javax.swing.*;  
  4.  
  5. public class hcj extends JFrame implements ChessmanListener  
  6. {  
  7.  Container contentPane;  
  8.  
  9.  Block[] blocks = new Block[15 * 15];  
  10.  
  11.  JPanel chessBoard = new JPanel();  
  12.  JLabel labHeiQi = new JLabel();  
  13.  JLabel labBaiQi = new JLabel();  
  14.  JLabel pinJu = new JLabel();  
  15.  JButton cmdNewGame = new JButton();  
  16.  JButton exit = new JButton();  
  17.  JButton about = new JButton();  
  18.    
  19.  int cout=0;  
  20.  
  21.  public static void main(String[] args)  
  22.  {  
  23.   hcj game = new hcj();  
  24.  }  
  25.  
  26.  public hcj()  
  27.  {  
  28.   setTitle("五子棋");  
  29.   contentPane = getContentPane();  
  30.   contentPane.setLayout(null);  
  31.   contentPane.setBackground(new Color(20016090));  
  32.  
  33.   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  34.  
  35.   chessBoard.setBackground(new Color(1312000));  
  36.   // 设置容器大小  
  37.   chessBoard.setPreferredSize(new Dimension(450450));  
  38.   // 填充在以(150,60)这个点为左上角,宽度为450,高度为450的矩形中  
  39.   chessBoard.setBounds(new Rectangle(15060450450));  
  40.   chessBoard.setLayout(new GridLayout(1515));  
  41.  
  42.   int n;  
  43.   for (int i = 0; i < 15 * 15; i++)  
  44.   {  
  45.    n = Block.ALL;  
  46.  
  47.    // 判断的先后顺序,确定了最后的n是属于哪条边  
  48.    if (i % 15 == 0)  
  49.     n = n & ~Block.LINELEFT; // 14  
  50.  
  51.    if (i % 15 == 14)  
  52.     n = n & ~Block.LINERIGHT; // 13  
  53.  
  54.    if (i / 15 == 0)  
  55.     n = n & ~Block.LINETOP; // 11  
  56.  
  57.    if (i / 15 == 14// 7  
  58.     n = n & ~Block.LINEBOTTOM;  
  59.  
  60.    blocks[i] = new Block(n, i / 15, i % 15);  
  61.  
  62.    blocks[i].addChessmanListener(this);  
  63.  
  64.    if ((i - 1) % 4 == 3 && i / 15 % 4 == 3)  
  65.     blocks[i].setStar(true);  
  66.  
  67.    chessBoard.add(blocks[i]);  
  68.   }  
  69.  
  70.   labHeiQi.setFont(new java.awt.Font("Dialog"116));  
  71.   labHeiQi.setIconTextGap(50);  
  72.   labHeiQi.setText("黑棋");  
  73.   labHeiQi.setBounds(new Rectangle(2001510040));  
  74.     
  75.   pinJu.setFont(new java.awt.Font("Dialog"116));  
  76.   pinJu.setIconTextGap(50);  
  77.   pinJu.setText("平局");  
  78.   pinJu.setBounds(new Rectangle(2701510040));  
  79.  
  80.   labBaiQi.setFont(new java.awt.Font("Dialog"116));  
  81.   labBaiQi.setIconTextGap(50);  
  82.   labBaiQi.setText("白棋");  
  83.   labBaiQi.setBounds(new Rectangle(3301510040));  
  84.  
  85.   cmdNewGame.setBounds(new Rectangle(202010030));  
  86.   cmdNewGame.setFont(new java.awt.Font("黑体"016));  
  87.   cmdNewGame.setText("新游戏");  
  88.  
  89.   exit.setBounds(new Rectangle(207010030));  
  90.   exit.setFont(new java.awt.Font("黑体"016));  
  91.   exit.setText("退出");  
  92.  
  93.   about.setBounds(new Rectangle(2012010030));  
  94.   about.setFont(new java.awt.Font("黑体"016));  
  95.   about.setText("版本信息");  
  96.  
  97.   // 新游戏开始  
  98.   cmdNewGame.addActionListener(new ActionListener()  
  99.   {  
  100.    public void actionPerformed(ActionEvent e)  
  101.    {  
  102.     // 判断当前棋子,如果有棋子 就要重新清空  
  103.     if (Block.getPerson() != 0)  
  104.     {  
  105.      for (int i = 0; i < 15 * 15; i++)  
  106.      {  
  107.       if (blocks[i].getHas() != 0)  
  108.        blocks[i].reSet();  
  109.      }  
  110.     }  
  111.  
  112.     labBaiQi.setText("白棋");  
  113.     labHeiQi.setText("黑棋");  
  114.     pinJu.setVisible(false);  
  115.     Block.StartGame();  
  116.    }  
  117.   });  
  118.  
  119.   about.addActionListener(new ActionListener()  
  120.   {  
  121.    public void actionPerformed(ActionEvent e)  
  122.    {  
  123.     AboutFrm af1 = new AboutFrm();  
  124.    }  
  125.   });  
  126.  
  127.   exit.addActionListener(new ActionListener()  
  128.   {  
  129.    public void actionPerformed(ActionEvent e)  
  130.    {  
  131.     System.exit(0);  
  132.    }  
  133.   });  
  134.  
  135.   Block.setPersonLabel(labHeiQi, labBaiQi);  
  136.  
  137.   contentPane.add(cmdNewGame);  
  138.   contentPane.add(exit);  
  139.   contentPane.add(about);  
  140.   contentPane.add(chessBoard);  
  141.   contentPane.add(labBaiQi);  
  142.   contentPane.add(labHeiQi);  
  143.   contentPane.add(pinJu);  
  144.     
  145.   pinJu.setVisible(false);  
  146.   setSize(800600);  
  147.   setResizable(false);  
  148.   setLocation(28070);  
  149.   setVisible(true);  
  150.  }  
  151.  
  152.  // 判断是否已经产生胜负 有四种情况  
  153.  public void chessmanPress(ChessmanEvent e)  
  154.  {  
  155.   int up, down, left, right;  
  156.  
  157.   up = down = e.getRow();  
  158.   left = right = e.getCollumn();  
  159.  
  160.   // 判断竖直方向  
  161.   do 
  162.   {  
  163.    up++;  
  164.   } while (up < 15 
  165.     && blocks[up * 15 + e.getCollumn()].getHas() == e.getHas());  
  166.   do 
  167.   {  
  168.    down--;  
  169.   } while (down >= 0 
  170.     && blocks[down * 15 + e.getCollumn()].getHas() == e.getHas());  
  171.  
  172.   if ((up - down) > 5)  
  173.   {  
  174.    for (int i = down + 1; i < up; i++)  
  175.     blocks[i * 15 + e.getCollumn()].setWinChessman();  
  176.    Block.end();  
  177.   }  
  178.   else 
  179.   {  
  180.    // 判断左右方向  
  181.    do 
  182.    {  
  183.     right++;  
  184.    } while (right < 15 
  185.      && blocks[right + e.getRow() * 15].getHas() == e.getHas());  
  186.    do 
  187.    {  
  188.     left--;  
  189.    } while (left >= 0 
  190.      && blocks[left + e.getRow() * 15].getHas() == e.getHas());  
  191.  
  192.    if ((right - left) > 5)  
  193.    {  
  194.     for (int i = left + 1; i < right; i++)  
  195.      blocks[i + e.getRow() * 15].setWinChessman();  
  196.     Block.end();  
  197.    }  
  198.    else 
  199.    {  
  200.  
  201.     up = down = e.getRow();  
  202.     left = right = e.getCollumn();  
  203.  
  204.     // 判断倾斜方向  
  205.     do 
  206.     {  
  207.      right++;  
  208.      down++;  
  209.     } while (right < 15 && down < 15 
  210.       && blocks[right + down * 15].getHas() == e.getHas());  
  211.     do 
  212.     {  
  213.      left--;  
  214.      up--;  
  215.     } while (left >= 0 && up >= 0 
  216.       && blocks[left + up * 15].getHas() == e.getHas());  
  217.  
  218.     if ((right - left) > 5)  
  219.     {  
  220.      for (int i = left + 1; i < right; i++)  
  221.      {  
  222.       up++;  
  223.       blocks[i + up * 15].setWinChessman();  
  224.      }  
  225.      Block.end();  
  226.     }  
  227.     else 
  228.     {  
  229.      up = down = e.getRow();  
  230.      left = right = e.getCollumn();  
  231.  
  232.      // 判断倾斜方向  
  233.      do 
  234.      {  
  235.       right++;  
  236.       down--;  
  237.      } while (right < 15 && down >= 0 
  238.        && blocks[right + down * 15].getHas() == e.getHas());  
  239.      do 
  240.      {  
  241.       left--;  
  242.       up++;  
  243.      } while (left >= 0 && up < 15 
  244.        && blocks[left + up * 15].getHas() == e.getHas());  
  245.  
  246.      if ((right - left) > 5)  
  247.      {  
  248.       for (int i = left + 1; i < right; i++)  
  249.       {  
  250.        up--;  
  251.        blocks[i + up * 15].setWinChessman();  
  252.       }  
  253.       Block.end();  
  254.      }  
  255.     }     
  256.    }  
  257.      
  258.    for (int j = 0; j < 15 * 15; j++)  
  259.    {  
  260.     if (blocks[j].getHas() != 0)  
  261.     {  
  262.      cout++;  
  263.     }  
  264.    }  
  265.    if(cout==225)  
  266.    {  
  267.     pinJu.setVisible(true);  
  268.     labHeiQi.setVisible(false);  
  269.     labBaiQi.setVisible(false);      
  270.  
  271.    }  
  272.    cout = 0;  
  273.   }  
  274.  
  275.   if (Block.isEnd())  
  276.   {  
  277.       if (e.getHas() == 1)  
  278.    {  
  279.     labHeiQi.setText("黑棋胜");  
  280.     labBaiQi.setVisible(false);  
  281.     labHeiQi.setVisible(true);  
  282.    }  
  283.    else if(e.getHas() == 2)  
  284.    {  
  285.     labBaiQi.setText("白棋胜");  
  286.     labHeiQi.setVisible(false);  
  287.     labBaiQi.setVisible(true);  
  288.    }  
  289.   }  
  290.  }  
  291. }  
  292.  
  293. class Block extends JPanel  
  294. {  
  295.  static Block last, last2;  
  296.  
  297.  public static final int LINELEFT = 1 << 0// 左边线 1  
  298.  public static final int LINERIGHT = 1 << 1// 右边线 2  
  299.  public static final int LINETOP = 1 << 2// 上边线 4  
  300.  public static final int LINEBOTTOM = 1 << 3// 下边线 8  
  301.  
  302.  public static final int ALL = LINELEFT + LINERIGHT + LINETOP + LINEBOTTOM; // 15  
  303.  
  304.  public static int bWidth = 30;  
  305.  
  306.  private static int p1Count = 0, p2Count = 0;  
  307.  private static JLabel labP1, labP2;  
  308.  private static int person = 0;  
  309.  
  310.  private int type; // 处于那个位置上  
  311.  
  312.  private boolean mouseIn;  
  313.  
  314.  private boolean winChessman = false;  
  315.  
  316.  private boolean star = false// 该点是否是星点  
  317.  
  318.  private static boolean start = true// 是否开始新游戏  
  319.  
  320.  private ChessmanEvent chessmanEvent;  
  321.  private ChessmanListener chessmanListener;  
  322.  
  323.  int has = 0;  
  324.  int x = 0, y = 0;  
  325.  
  326.  Block(int bType, int row, int collumn)  
  327.  {  
  328.   type = bType;  
  329.  
  330.   this.x = row;  
  331.   this.y = collumn;  
  332.  
  333.   this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); // 设置鼠标性状为手型  
  334.  
  335.   // 处理当鼠标进入游戏区域后点击方格的处理方法  
  336.   this.addMouseListener(new MouseAdapter()  
  337.   {  
  338.    public void mousePressed(MouseEvent e)  
  339.    {  
  340.     if (start && has == 0)  
  341.     {  
  342.      person = 2 - (person + 1) % 2// 处理此次按下的结果是为白色还是黑色  
  343.  
  344.      has = person;  
  345.  
  346.      if (has == 2// 如果是白色  
  347.      {  
  348.       p2Count++;  
  349.       labP1.setVisible(true);  
  350.       labP2.setVisible(false);  
  351.      } else if (has == 1// 如果是黑色  
  352.      {  
  353.       p1Count++;  
  354.       labP2.setVisible(true);  
  355.       labP1.setVisible(false);  
  356.      }  
  357.  
  358.      chessmanEvent = new ChessmanEvent(has, x, y);  
  359.      chessmanListener.chessmanPress(chessmanEvent);  
  360.  
  361.      // 内容有改变则重画  
  362.      last2 = last;  
  363.      last = Block.this;  
  364.      if (last2 != null)  
  365.       last2.repaint();  
  366.     }  
  367.    }  
  368.   });  
  369.  
  370.   // 处理鼠标的性状  
  371.   this.addMouseListener(new MouseAdapter()  
  372.   {  
  373.    // 处理鼠标进入游戏区域的情况  
  374.    public void mouseEntered(MouseEvent e)  
  375.    {  
  376.     if (!start)  
  377.      Block.this.setCursor(Cursor  
  378.        .getPredefinedCursor(Cursor.DEFAULT_CURSOR)); // 默认的游标状态(通常为一个箭头)  
  379.     else if (has == 0)  
  380.      Block.this.setCursor(Cursor  
  381.        .getPredefinedCursor(Cursor.HAND_CURSOR)); // 设置鼠标性状为手型  
  382.  
  383.     mouseIn = true;  
  384.     repaint();  
  385.    }  
  386.  
  387.    // 处理鼠标离开游戏区域的情况  
  388.    public void mouseExited(MouseEvent e)  
  389.    {  
  390.     mouseIn = false;  
  391.     if (has != 0)  
  392.      Block.this.setCursor(Cursor  
  393.        .getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); // 设置鼠标性状为十字型  
  394.  
  395.     repaint();  
  396.    }  
  397.   });  
  398.  }  
  399.  
  400.  // 是否为星点  
  401.  public boolean isStar()  
  402.  {  
  403.   return star;  
  404.  }  
  405.  
  406.  // 设为星点  
  407.  public void setStar(boolean star)  
  408.  {  
  409.   this.star = star;  
  410.  }  
  411.  
  412.  // 添加监听器  
  413.  public void addChessmanListener(ChessmanListener c)  
  414.  {  
  415.   chessmanListener = c;  
  416.  }  
  417.  
  418.  // 绘制图面  
  419.  public void paintComponent(Graphics g)  
  420.  {  
  421.   super.paintComponent(g);  
  422.   // 把传入的Graphics容器转换为一个可用的 Graphics2D 对象  
  423.   Graphics2D g2d = (Graphics2D) g;  
  424.   int w;  
  425.   w = bWidth;  
  426.  
  427.   if ((type & LINELEFT) == 0 || (type & LINERIGHT) == 0// 如果是左右边线  
  428.    g2d.setStroke(new BasicStroke(3)); // 创建一个笔划来描述形状的外形  
  429.   else 
  430.    // 如果不是左右边线  
  431.    g2d.setStroke(new BasicStroke(1));  
  432.  
  433.   // 上面的线  
  434.   if ((type & LINETOP) == LINETOP)  
  435.    g2d.drawLine(w / 20, w / 2, w / 2);  
  436.  
  437.   // 下面的线  
  438.   if ((type & LINEBOTTOM) == LINEBOTTOM)  
  439.    g2d.drawLine(w / 2, w / 2, w / 2, w);  
  440.  
  441.   if ((type & LINETOP) == 0 || (type & LINEBOTTOM) == 0)  
  442.    g2d.setStroke(new BasicStroke(3));  
  443.   else 
  444.    g2d.setStroke(new BasicStroke(1));  
  445.  
  446.   // 左边的线  
  447.   if ((type & LINELEFT) == LINELEFT)  
  448.    g2d.drawLine(0, w / 2, w / 2, w / 2);  
  449.  
  450.   // 右边的线  
  451.   if ((type & LINERIGHT) == LINERIGHT)  
  452.    g2d.drawLine(w / 2, w / 2, w, w / 2);  
  453.  
  454.   if (star)  
  455.    g.fillRect(w / 2 - 2, w / 2 - 255);  
  456.  
  457.   if (has == 1)  
  458.   {  
  459.    g.setColor(Color.BLACK); // 设置颜色 黑色  
  460.    g.fillOval(33, bWidth - 6, bWidth - 6); // 填充  
  461.   } else if (has == 2)  
  462.   {  
  463.    g.setColor(Color.LIGHT_GRAY);  
  464.    g.fillOval(33, bWidth - 6, bWidth - 6);  
  465.   } else if (start && mouseIn)  
  466.   {  
  467.    if (person == 2 || person == 0)  
  468.    {  
  469.     g.setColor(Color.BLACK);  
  470.     g.fillOval(33, bWidth - 6, bWidth - 6);  
  471.    } else if (person == 1)  
  472.    {  
  473.     g.setColor(Color.LIGHT_GRAY);  
  474.     g.fillOval(33, bWidth - 6, bWidth - 6);  
  475.    }  
  476.   }  
  477.  
  478.   g2d.setStroke(new BasicStroke(2)); // 设置线宽  
  479.   g.setColor(Color.RED); // 设置颜色  
  480.  
  481.   // 判断是否结束比赛  
  482.   if (winChessman)  
  483.   {  
  484.    g.drawOval(99, bWidth - 17, bWidth - 17);  
  485.   } else if (last == Block.this)  
  486.   {  
  487.    g.drawLine(bWidth / 2 - 5, bWidth / 2, bWidth / 2 + 5, bWidth / 2);  
  488.    g.drawLine(bWidth / 2, bWidth / 2 - 5, bWidth / 2, bWidth / 2 + 5);  
  489.   }  
  490.  }  
  491.  
  492.  // 返回该格的棋子,黑为1,白为2  
  493.  public int getHas()  
  494.  {  
  495.   return has;  
  496.  }  
  497.  
  498.  // 返回当前所下的棋子,黑为1,白为2  
  499.  static public int getPerson()  
  500.  {  
  501.   return person;  
  502.  }  
  503.  
  504.  // 标记当前格子为胜棋,重画  
  505.  public void setWinChessman()  
  506.  {  
  507.   winChessman = true;  
  508.   this.repaint();  
  509.  }  
  510.  
  511.  // 重设当前格为空,重画  
  512.  public void reSet()  
  513.  {  
  514.   has = 0;  
  515.   winChessman = false;  
  516.   repaint();  
  517.  }  
  518.  
  519.  // 开始游戏  
  520.  static public void StartGame()  
  521.  {  
  522.   last = null;  
  523.   p1Count = p2Count = 0;  
  524.   person = 0;  
  525.   start = true;  
  526.   labP1.setVisible(true);  
  527.   labP2.setVisible(false);  
  528.  }  
  529.  
  530.  // 结束游戏  
  531.  static public void end()  
  532.  {  
  533.   start = false;  
  534.  }  
  535.  
  536.  // 是否结束  
  537.  static public boolean isEnd()  
  538.  {  
  539.   return !start;  
  540.  }  
  541.  
  542.  static public void setPersonLabel(JLabel p1, JLabel p2)  
  543.  {  
  544.   labP1 = p1;  
  545.   labP2 = p2;  
  546.  
  547.   // 此刻如果没有放置棋子或者放下的为白色,则显示labp1,否则为labp2  
  548.   if (person == 0 || person == 2)  
  549.   {  
  550.    labP1.setVisible(true);  
  551.    labP2.setVisible(false);  
  552.   } else 
  553.   {  
  554.    labP2.setVisible(true);  
  555.    labP1.setVisible(false);  
  556.   }  
  557.  }  
  558. }  
  559.  
  560. // 实现关于窗体类  
  561. class AboutFrm implements ActionListener  
  562. {  
  563.  static JFrame aboutfrm = new JFrame("关于");  
  564.  
  565.  public AboutFrm()  
  566.  {  
  567.   JLabel j1 = new JLabel("                    简单的五子棋游戏");  
  568.   JTextArea ta1 = new JTextArea("设计者:胡成健");  
  569.   ta1.setEnabled(false);  
  570.   JTextArea ta2 = new JTextArea("院系:集美大学机械工程学院");  
  571.   ta2.setEnabled(false);  
  572.   JTextArea ta3 = new JTextArea("版权所有 Copyright(C) 2012");  
  573.   ta3.setEnabled(false);  
  574.   JButton mbtn = new JButton("谢谢");  
  575.   JPanel mp = new JPanel();  
  576.   JPanel mp2 = new JPanel();  
  577.   aboutfrm.getContentPane().setLayout(new BorderLayout());  
  578.   mp.setLayout(new GridLayout(41));  
  579.   mp.add(j1);  
  580.   mp.add(ta1);  
  581.   mp.add(ta2);  
  582.   mp.add(ta3);  
  583.   mp2.add(mbtn);  
  584.   Container c = aboutfrm.getContentPane();  
  585.   c.add(mp, "North");  
  586.   c.add(mp2, "South");  
  587.   mbtn.addActionListener(this);  
  588.   aboutfrm.setSize(220150);  
  589.   aboutfrm.setLocation(500250);  
  590.   aboutfrm.setResizable(false);  
  591.   aboutfrm.show();  
  592.  }  
  593.  
  594.  public void actionPerformed(ActionEvent e)  
  595.  {  
  596.   AboutFrm.aboutfrm.dispose();  
  597.  }  
  598. }  
  599.  
  600. // 棋子事件监听接口  
  601. interface ChessmanListener  
  602. {  
  603.  public void chessmanPress(ChessmanEvent e);  
  604. }  
  605.  
  606. // 棋子事件  
  607. class ChessmanEvent  
  608. {  
  609.  int has;  
  610.  int row, collumn;  
  611.  
  612.  // 构造函数  
  613.  public ChessmanEvent(int has, int row, int collumn)  
  614.  {  
  615.   this.has = has;  
  616.   this.row = row;  
  617.   this.collumn = collumn;  
  618.  }  
  619.  
  620.  // 返回该格棋子,黑为1,白为2  
  621.  public int getHas()  
  622.  {  
  623.   return has;  
  624.  }  
  625.  
  626.  // 返回该格所在的行  
  627.  public int getRow()  
  628.  {  
  629.   return row;  
  630.  }  
  631.  
  632.  // 返回该格所在的列  
  633.  public int getCollumn()  
  634.  {  
  635.   return collumn;  
  636.  }  
  637. }  
  638.  

 

你可能感兴趣的:(java项目实战,五子棋java)