1、五子棋设计报告完整版计算机网络设计报告题 目: 局域网五子棋设计 班 级: 计算机08.2班 姓 名: 颜晓云 指导教师: 杨松波 2011年 7 月 15日目 录1、概论 - 2 -2、功能介绍 - 2 -3、程序流程图 - 2 -4、实现代码 - 3-5、总结体会 - 9-6、参考文献 - 9 -第一章 绪论 主要运用了GUI(用户图形界面)和API(应用程序借口)来实现。当然,Event监听器等也是这个程序的重要部分。程序没有用到图片的引用,棋盘和棋子的设计完全是应用坐标来绘制,再加入按钮、及实现本游戏的用户界面布局。程序编写的思路来源于网上和书上的资料,程序在编写过程中遇到的问题主要集
2、中在前期的棋盘绘制和后期的棋子算法。第二章 功能介绍(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.
3、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 JF
4、rame 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 B
5、orderLayout(); 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
6、= 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 + 在第 + ste
7、p + 步赢了); 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.EX
8、IT_ON_CLOSE); public void drawNode(int i, int j) int x = chess.nodeij.x; int y = chess.nodeij.y; int state = chess.nodeij.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
9、- 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(); pu
10、blic 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.int
11、erval, 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.nodeij.state = 1 | chess.nodeij.state = 2) if (chess.nodeij.state = 1) g.setColor(Color.black); else if (chess.n
12、odeij.state = 2) g.setColor(Color.white); g.drawOval(chess.nodeij.x - 6, chess.nodeij.y - 6, 12, 12); g.fillOval(chess.nodeij.x - 6, chess.nodeij.y - 6, 12, 12); public void clearExist() Graphics g = panelPaint.getGraphics(); g.clearRect(0, 0, 600, 600); public static void main(String args) ChessFrm
13、 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 Noderow_columnrow_column; for
14、 (int i = 0; i row_column; i+) for (int j = 0; j row_column; j+) nodeij = new Node(); nodeij.x = (i + 1) * interval; nodeij.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 (in
15、t q = j; q row_column - 1 | q row_column - 1) System.out.println(越界); return null; if (x nodepq.x - bound & x nodepq.y - bound & y = 0 & nodeiup.state = nodeij.state) count+; up-;/ 千万注意自增自减运算 if (count = 5) return true; int down = j + 1;/ 接着垂直向下方向判断 while (down = 5) return true; return false; privat
16、e boolean horizontal(int i, int j) int count = 1; int left = i - 1;/水平向左判断 while (left = 0 & nodeleftj.state = nodeij.state) count+; left-; if (count = 5) return true; int right = i + 1;/水平向右判断 while (right = 5) return true; return false; private boolean diagonalSE(int i, int j) int count = 1; int n
17、orth = j - 1; int west = i - 1;/西北方向判断 while (north = 0 & west = 0 & nodewestnorth.state = nodeij.state) count+; north-; west-; if (count = 5) return true; int south = j + 1; int east = i + 1;/接着东南方向判断 while (south row_column & east = 5) return true; return false; private boolean diagonalNE(int i, i
18、nt j) int count = 1; int north = j - 1; int east = i + 1;/东北方向判断 while (north = 0 & east = 5) return true; int west = i - 1; int south = j + 1;/接着西南方向判断 while (west = 0 & south = 5) return true; return false; void restate() for (int i = 0; i row_column; i+) for (int j = 0; j row_column; j+) nodeij.s
19、tate = 0; white = false; class Node int x; int y; int state;/ 0无棋子,1黑棋,2白棋第五章 总结与体会 通过这次对JAVA的学习,让我渐渐体会到了JAVA的博大精深。以及怎么学习JAVA,怎么学习计算机语言,怎样对问题进行解决和运用JAVA GUI,查找JAVA API的使用都用了更进一步的理解。 对于Java中的引用,初始化类等,开始我并不是非常的理解,知道就这么做就能实现相应的功能了,并没有很深刻的去理解它为什么要这么做。但是真正的要用Java去做一个东西不理解它是不行的,而且其间这课设涉及到了Java 中的绝大多数的知识点,
20、如Java图形用户界面设计、Java的异常处理机制、Java中的多线程程序设计、Java输入输出流,要应用这些东西更要求我去好好理解Java的这些规则。好在有一定的C+基础Java 与C+语法类似,并把C+中一些较低级和较难以理解的功能都去掉了,如多继承、指针等,同时Java增强了部分功能。所以理解起来也比较容易。但是理解了Java的规则要把这个课设做好也不是那么容易,最难的部分是如何实现各个功能的划分和类的通讯问题。我在这方面就遇到了不少的问题。总结这次课设,我还是收获不少。虽然界面也不是很美观,有点功能间的连接做的也不是特别的好,但是我能认识到自己的不足,并且在跟同学的交流中也学到了一些他们的设计思路,也知道今后要加强哪些方面的知识。参考文献:1、JAVA编程案例精解 电子工业出版社; 2、 3、