五子棋设计报告(完整版)

《计算机网络》设计报告

题    目:    局域网五子棋设计 

班    级:    计算机08.2班     

姓    名:    颜晓云            

指导教师:    杨松波           

20##年  7  月  15

目    录

1、概论   . - 2 -

2、功能介绍... - 2 -

3、程序流程图... - 2 -

4、实现代码... - 3-

5、总结体会... - 9-

6、参考文献... - 9 -

第一章 绪论

  主要运用了GUI(用户图形界面)和API(应用程序借口)来实现。当然,Event监听器等也是这个程序的重要部分。程序没有用到图片的引用,棋盘和棋子的设计完全是应用坐标来绘制,再加入按钮、及实现本游戏的用户界面布局。程序编写的思路来源于网上和书上的资料,程序在编写过程中遇到的问题主要集中在前期的棋盘绘制和后期的棋子算法。

第二章 功能介绍

(1)程序在设计初就定义黑棋先行,白棋随后。从第一个棋子开始开始相互顺

     序落子。

(2)通过坐标索引算出最先在棋盘的横向、竖向、斜向形成连续的相同色五棋

     子的一方为胜利。

(3)在游戏过程中或下完时可选择重新开始。

(4)赢家对话框提示。

第三章 程序流程图

第四章 实现代码

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.FlowLayout;

import java.awt.Graphics;

import java.awt.Point;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.InputEvent;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

    import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

    public class ChessFrm extends JFrame implements ActionListener {

 int step;

 JButton butnStart = new JButton("重新开始");

 FiveChess chess = new FiveChess();

 FlowLayout flow = new FlowLayout();

 JPanel panelPaint=new JPanel(),panelEast=new JPanel();//panelPaint为画五子棋的面板

 ChessFrm(String s) {

  super(s);

  setBounds(100, 100, 600, 600);

  setLayout(new BorderLayout());

  setVisible(true);

  setResizable(false);

  add(panelPaint);

  panelEast.add(butnStart);

  add(panelEast,BorderLayout.EAST);

  butnStart.addActionListener(this);

  addMouseListener(new MouseAdapter() {

   public void mouseClicked(MouseEvent e) {

    if(e.getModifiers()==InputEvent.BUTTON3_MASK)

     return;

    int x = e.getX()-3;//鼠标单击位置为在整个窗体中的位置,包括标题栏和侧边

    int y = e.getY()-23;

    System.out.println("鼠标单击位置:" + x + "," + y);

    Point index = chess.getIndex(x, y);//得到行列

    if (index != null) {

     drawNode(index.x, index.y);

     step++;

     if (chess.isWin(index.x, index.y)) {

      String str = chess.white ? "黑棋" : "白棋";

      System.out.println(str + "在第" + step + "步赢了");

      int option = JOptionPane.showConfirmDialog(

        ChessFrm.this,

        str + "在第" + step + "步赢了,是否再来一局", "五子棋",

        JOptionPane.YES_NO_OPTION);

      if (option == JOptionPane.YES_OPTION) {

       step = 0;// 重新置为零

       clearExist();//清除已有棋子

       chess.restate();//数据清零

       repaint();

      }

     }

    }

   }

  });

  repaint();

  validate();

  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 }

      public void drawNode(int i, int j) {

  int x = chess.node[i][j].x;

  int y = chess.node[i][j].y;

  int state = chess.node[i][j].state;

  Graphics g = panelPaint.getGraphics();

  if (state == 1)

   g.setColor(Color.black);

  else if (state == 2)

   g.setColor(Color.white);

  g.drawOval(x - 6, y - 6, 12, 12);

  g.fillOval(x - 6, y - 6, 12, 12);

 }

     public void actionPerformed(ActionEvent e) {

  if (e.getSource() == butnStart) {

   if (step != 0) {

    int option = JOptionPane.showConfirmDialog(ChessFrm.this, "是否放弃重来",

      "五子棋", JOptionPane.YES_NO_OPTION);

    if (option == JOptionPane.YES_OPTION) {

     clearExist();

     chess.restate();

     step = 0;

     repaint();

    }

   }

  }

 }

     public void paint(Graphics gg) {// Graphics是在整个窗体描绘

  super.paint(gg);

  Graphics g=panelPaint.getGraphics();

  g.setColor(Color.magenta);

  for (int i = 1; i <= FiveChess.row_column; i++) {

   g.drawLine(10, i * FiveChess.interval, 548, i  * FiveChess.interval);

   g.drawLine(i * FiveChess.interval, 10, i * FiveChess.interval, 540);

  }

  drawExistNode();

 }

      void drawExistNode() {

  Graphics g = panelPaint.getGraphics();

  for (int i = 0; i < FiveChess.row_column; i++)

   for (int j = 0; j < FiveChess.row_column; j++) {

    if (chess.node[i][j].state == 1 || chess.node[i][j].state == 2) {

     if (chess.node[i][j].state == 1)

      g.setColor(Color.black);

     else if (chess.node[i][j].state == 2)

      g.setColor(Color.white);

     g.drawOval(chess.node[i][j].x - 6, chess.node[i][j].y - 6,

       12, 12);

     g.fillOval(chess.node[i][j].x - 6, chess.node[i][j].y - 6,

       12, 12);

    }

   }

 }

      public void clearExist() {

  Graphics g = panelPaint.getGraphics();

  g.clearRect(0, 0, 600, 600);

 }

 public static void main(String[] args) {

  ChessFrm cFrm=new ChessFrm("五子棋");

 }

}

    class FiveChess {

 boolean white;

 public static final int bound = 7;// 在离中心为7的范围内单击为有效单击(即下棋)

 public static final int row_column = 20;

 public static final int interval=26;//五子棋之间的距离

 Node node[][];

     public FiveChess() {

  init();

 }

     private void init() {

  node = new Node[row_column][row_column];

  for (int i = 0; i < row_column; i++)

   for (int j = 0; j < row_column; j++) {

    node[i][j] = new Node();

    node[i][j].x = (i + 1) * interval;

    node[i][j].y = (j + 1) * interval;

   }

 }

      Point getIndex(int x, int y) {

  int i = x / interval - 1;

  int j = y / interval - 1;

  if (i == -1)//边界

   i++;

  if (j == -1)

   j++;

  for (int p = i; p < i + 2; p++)

   for (int q = j; q < j + 2; q++) {

    if (p > row_column - 1 || q > row_column - 1) {

     System.out.println("越界");

     return null;

    }

    if (x > node[p][q].x - bound && x < node[p][q].x + bound

      && y > node[p][q].y - bound && y < node[p][q].y + bound)

     if (node[p][q].state == 0) {// 在范围内且此处没棋,才有效

      node[p][q].state = white ? 2 : 1;

      white = !white;

      return new Point(p, q);

     }

   }

  return null;

 }

     boolean isWin(int i, int j) {

  return (horizontal(i, j) || vertical(i, j) || diagonalSE(i, j) || diagonalNE(

    i, j));

 }

     private boolean vertical(int i, int j) {

  int count = 1;

  int up = j - 1;// 垂直向上方向判断

  while (up >= 0 && node[i][up].state == node[i][j].state) {

   count++;

   up--;// 千万注意自增自减运算

   if (count >= 5)

    return true;

  }

  int down = j + 1;// 接着垂直向下方向判断

  while (down < row_column && node[i][down].state == node[i][j].state) {

   count++;

   down++;

   if (count >= 5)

    return true;

  }

  return false;

 }

      private boolean horizontal(int i, int j) {

  int count = 1;

  int left = i - 1;//水平向左判断

  while (left >= 0 && node[left][j].state == node[i][j].state) {

   count++;

   left--;

   if (count >= 5)

    return true;

  }

  int right = i + 1;//水平向右判断

  while (right < row_column && node[right][j].state == node[i][j].state) {

   count++;

   right++;

   if (count >= 5)

    return true;

  }

  return false;

 }

      private boolean diagonalSE(int i, int j) {

  int count = 1;

  int north = j - 1;

  int west = i - 1;//西北方向判断

  while (north >= 0 && west >= 0

    && node[west][north].state == node[i][j].state) {

   count++;

   north--;

   west--;

   if (count >= 5)

    return true;

  }

  int south = j + 1;

  int east = i + 1;//接着东南方向判断

  while (south < row_column && east < row_column

    && node[east][south].state == node[i][j].state) {

   count++;

   south++;

   east++;

   if (count >= 5)

    return true;

  }

  return false;

 }

      private boolean diagonalNE(int i, int j) {

  int count = 1;

  int north = j - 1;

  int east = i + 1;//东北方向判断

  while (north >= 0 && east < row_column

    && node[east][north].state == node[i][j].state) {

   count++;

   north--;

   east++;

   if (count >= 5)

    return true;

  }

  int west = i - 1;

  int south = j + 1;//接着西南方向判断

  while (west >= 0 && south < row_column

    && node[west][south].state == node[i][j].state) {

   count++;

   west--;

   south++;

   if (count >= 5)

    return true;

  }

  return false;

 }

     void restate() {

  for (int i = 0; i < row_column; i++)

   for (int j = 0; j < row_column; j++) {

    node[i][j].state = 0;

    white = false;

   }

 }

}

    class Node {

 int x;

 int y;

 int state;// 0无棋子,1黑棋,2白棋

}

第五章 总结与体会

   通过这次对JAVA的学习,让我渐渐体会到了JAVA的博大精深。以及怎么学习JAVA,怎么学习计算机语言,怎样对问题进行解决和运用JAVA GUI,查找JAVA API的使用都用了更进一步的理解。

   对于Java中的引用,初始化类等,开始我并不是非常的理解,知道就这么做就能实现相应的功能了,并没有很深刻的去理解它为什么要这么做。但是真正的要用Java去做一个东西不理解它是不行的,而且其间这课设涉及到了Java 中的绝大多数的知识点,如Java图形用户界面设计、Java的异常处理机制、Java中的多线程程序设计、Java输入输出流,要应用这些东西更要求我去好好理解Java的这些规则。

好在有一定的C++基础Java 与C++语法类似,并把C++中一些较低级和较难以理解的功能都去掉了,如多继承、指针等,同时Java增强了部分功能。所以理解起来也比较容易。

但是理解了Java的规则要把这个课设做好也不是那么容易,最难的部分是如何实现各个功能的划分和类的通讯问题。我在这方面就遇到了不少的问题。

总结这次课设,我还是收获不少。虽然界面也不是很美观,有点功能间的连接做的也不是特别的好,但是我能认识到自己的不足,并且在跟同学的交流中也学到了一些他们的设计思路,也知道今后要加强哪些方面的知识。

参考文献:1、《JAVA编程案例精解》 电子工业出版社;

             2、

             3、

相关推荐