《计算机网络》设计报告
题 目: 局域网五子棋设计
班 级: 计算机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、
五子棋-课程设计报告单位分院(系)专业学号学生姓名指导教师完成日期20xx年05月日摘要五子棋的历史:五子棋是一种两人对弈的纯策略…
五子棋程序设计报告班级:姓名:学号:指导老师:20XX/1/07一、课程设计题目与要求题目:网络五子棋游戏。功能要求:该软件应包括…
计算机网络设计报告题目班级姓名指导教师局域网五子棋设计计算机082班颜晓云杨松波20xx年7月15日目录1概论错误未定义书签2功能…
封面Java语言程序设计课程设计报告分院电信分院班级电子商务1班姓名何芳林学号20xx0210460123指导教师吴军良课设时间2…
五子棋游戏课程设计报告(含源代码可以运行)目录第一章需求分析.11.1总体分析.11.2初始化.11.3主循环控制模块.11.4玩…
人工智能课程设计I目录第一章需求分析111总体分析112初始化113主循环控制模块114玩家下子115盘面分析填写棋型表216对方…
程序设计实验报告作者姓名学号联系方式指导教师学科专业提交日期1程序设计实验报告目录1引言311五子棋介绍312选题背景和动机313…
石家庄铁道大学课程设计课程设计题目五子棋单位分院系专业学号学生姓名指导教师完成日期20xx年05月日摘要程序说明本程序是一款棋类益…
五子棋程序设计报告班级:姓名:学号:指导老师:20XX/1/07一、课程设计题目与要求题目:网络五子棋游戏。功能要求:该软件应包括…
枣庄学院信息科学与工程学院课程设计任务书题目学号姓名专业计算机科学与技术课程java语言程序设计指导教师刘梦琳职称讲师完成时间20…
C语言课程设计报告题目简单的c五子棋设计者方阳专业班级软件工程1303班学号311309060324指导老师所属系部计算机学院20…