陕西国际商贸学院Java实训报告专业:计算机科学与技术班级:姓名:学号:指导老师:前言Java自问世以来,以其得天独厚的优势,在IT业界掀起了研究、开发它的浪潮,显示了鹏程万里的美好前景。
作为一种与底层硬件无关的、“编写一次,到处运行”的高级语言和计算平台,Java天生就具有将网络上的各个平台连成一体的能力,真正实现了“网络就是计算机”的理念。
以Java为代表的网络的成长,改变了我们的联系方式、生活方式、学习方式和经营方式。
它的来到使我们目睹了一场类似印刷术的重大变革。
毫无疑问,它将影响人类社会的发展,这就是:Java加速人类进入网络时代!本次课程设计是配合JAVA程序设计课程,帮助我们深入学习掌握JAVA语言,熟练运用这个工具来编写的。
通过课程设计各个项目的综合训练,不仅培养学生实际分析问题、编程和动手能力,而且还提高了学生的综合素质。
本课程设计尝试使用一些较生动的示例和设计项目,激发学生学习兴趣,引导学生主动学习以及正确理解、接受需要重点掌握的知识点,为参加项目开发及更深入学习做好准备。
本次课程设计主要是用JAVA实现围棋系统,能够实现画笔、画直线、画圆形、并修改该画笔的大小以及颜色。
该围棋程序还需具有悔棋功能以及选择棋盘大小的功能。
2014年6月11日目录一、实训目的及要求 (4)二、概要设计 (5)三、详细设计 (6)四、功能分析 (7)五、测试数据及运行结果 (10)六、总结 (14)一、实训目的及要求1. 1 实训目的1.使学生熟练掌握,java编成的基础知识,以及巩固图形界面及绘图知识点。
2.结合软件工程,熟悉软件开发过程。
3.训练了学生学生独立编程以及调试程序的能力。
4.训练学生对于算法的理解和设计能力。
5.加强了学生实际动手能力,以及对于面向对象方法学的理解。
6.巩固图形界面排版,以及界面的设计能力。
7.加强学生对于所学知识的理解及运用。
1.2 实训要求1.需交电子版和纸制板实训报告各一份,电子版海源程序。
2.程序必须可运行。
3.界面必须保证美观。
4.操作简单易学。
5.各项功能不可缺损。
6.报告版面美观,易读。
二、概要设计1. 整个围棋程序分为3个部分:棋盘、棋子、围棋主类软件结构图(见图一):图1 软件结构图2.围棋软件中的棋盘主类都将采用绘制。
3.整个程序界面将采用固定大小。
三、详细设计1.围棋程序顶层数据流程图如下:图2 顶层数据流程图2.功能级数据流图如下:鼠标坐标图3 功能级数据流程图四、功能分析整个围棋程序分为3个部分:棋盘、棋子、围棋主类1.棋盘主类主要功能有:《1》绘制棋谱及落棋,程序实现重写的pint方法如下:public void paint(Graphics g) {offg.setColor(new Color(180, 150, 100));offg.fillRect(0, 0, size, size);//画出棋盘格子offg.setColor(Color.black);for (int i = 0; i < gridNum + 1; i++) {int x1 = left + i * gridLen;int x2 = x1;int y1 = top;int y2 = top + gridNum * gridLen;offg.drawLine(x1, y1, x2, y2);x1 = left;x2 = left + gridNum * gridLen;y1 = top + i * gridLen;y2 = y1;offg.drawLine(x1, y1, x2, y2);}//画出棋子for (int i = 0; i < gridNum + 1; i++)for (int j = 0; j < gridNum + 1; j++) {if (map[i][j] == null)continue;offg.setColor(map[i][j].color == Chesspoint.black ? Color.black: Color.white);offg.fillOval(left + i * gridLen - chessmanLength / 2, top + j* gridLen - chessmanLength / 2, chessmanLength,chessmanLength);}//画出鼠标的位置,即下一步将要下的位置if (mouseLoc != null) {offg.setColor(currentTurn == Chesspoint.black ? Color.gray: new Color(200, 200, 250));offg.fillOval(left + mouseLoc.x * gridLen -chessmanLength / 2, top+ mouseLoc.y * gridLen - chessmanLength / 2,chessmanLength, chessmanLength);}//把画面一次性画出g.drawImage(offscreen, 80, 0, this);}《2》吃子,程序实现见源程序。
《3》悔棋,并保存所有已下的棋子,包括在棋盘上的所有棋子和被提掉的,程序实现悔棋back()方法如下://悔棋public void back() {if (alreadyNum == 0) {controlPanel.setMsg("无子可悔");return;}Object obj = chessman.elementAt(--alreadyNum);if (obj instanceof Chesspoint) {Chesspoint qizi = (Chesspoint) obj;map[qizi.x][qizi.y] = null;currentTurn = qizi.color;} else {Vector v = (Vector) obj;for (int i = 0; i < v.size(); i++) {Chesspoint q = (Chesspoint) (v.elementAt(i));if (i == v.size() - 1) {map[q.x][q.y] = null;int index = chessman.indexOf(v);chessman.setElementAt(q, index);currentTurn = q.color;} else {map[q.x][q.y] = q;}}}controlPanel.setLabel();repaint();}《4》在该类中使用Vector类型保存踢掉的棋子及这个棋子本身。
2.棋子主类主要功能有:获得实际的棋子位置,程序实现如下:public class Chesspoint{public static int black=0,white=1;int x,y;int color;public Chesspoint(int i,int j,int c){x=i;y=j;color=c;}public String toString(){// 储存x,y位置和颜色String c=(color==black?"black":"white");return "["+x+","+y+"]:"+c;}}3. 围棋主类主要功能:(1)对围棋界面外观进行初始化,构造方法Chess实现如下:public Chess() {this.setTitle("围棋程序");this.setLayout(new BorderLayout());jp.setSize(550, 490);jp.setLayout(new BorderLayout());jp.add(Chessboard.controlPanel, "West");jp.add(qipan, "Center");add(jp);jp.setSize(550, 490);this.setResizable(false);this.setLayout(new BorderLayout());this.setSize(550, 490);this.setVisible(true);}(2)创建围棋对象,main方法实现如下:public static void main(String[] args) {//开始下棋程序Chess Igo = new Chess();五、测试数据及运行结果1.初始界面如图图5.1所示:图5.1运行结果图2.18x18棋盘测试如图:图5.2运行结果图3.2.7x7棋盘测试如图:图5.3运行结果图4.悔棋标签反映无子可悔如图:图5.4运行结果图六、总结时光如梭,光阴似箭,java实训一晃而过,通过这一期的实训,虽然实训的时间不长,但是总体上收获挺大的,当我们正式准备学习实训java编程技术时,让我感到非常高兴,因为java一直学的是课本知识,所以实训对于我来说是必须要学会熟练操作的。
当然开始学习后也并非是想象中那样顺利,开始的学习让我异常感到学习任务的艰巨,因为学习中我遇到了很多以前未曾遇到的难点,有时后也难免会失去耐心,但是,通过老师的指导,自己的努力的练习,我顺利的化解了一道道的障碍。
克服了java学习上的一道道难关,现在自己已经基本掌握了java的基础知识。
我很清楚以后的路还很长,再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。
任何业绩的质变都来自于量变的积累,成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成,让我们将事前的忧虑,换为事前的思考和计划吧!在实训的过程中,我深深感觉到自身所学知识的有限。
以后要更加努力学习.源代码:1、Chessboard类import java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.JPanel;public class Chessboard extends JPanel {// 默认的棋盘方格长度及数目public static final int _gridLen = 22, _gridNum = 19;/** 利用Vector保存所有已下的棋子,包括在棋盘上的所有棋子和被踢掉的,若某一次* 落子没有造成踢子,包括所有被这个棋子提掉的棋子及这个棋子本身,Vector 最后*/private Vector chessman;private int alreadyNum; // 已下数目private int currentTurn; // 轮到谁下private int gridNum, gridLen; // 方格长度及数目private int chessmanLength; // 棋子的直径private Chesspoint[][] map; // 在棋盘上的所有棋子private Image offscreen;private Graphics offg;private int size; // 棋盘的宽度及高度private int top =13, left = 13; // 棋盘左边及上边的边距private Point mouseLoc; // 鼠标的位置,即map数组中的下标public static ControlPanel controlPanel; // 控制面板//获得控制板的距离public int getWidth() {return size;}public int getHeight() {return size;}//绘制棋盘外观public Chessboard() {gridNum = _gridNum;gridLen = _gridLen;chessmanLength = gridLen * 9 / 10;size = 2 * left + gridNum * gridLen;addMouseListener(new PutChess());addMouseMotionListener(new MML());setLayout(new BorderLayout());controlPanel = new ControlPanel();startGame();}public void addNotify() {super.addNotify();offscreen = createImage(size, size);offg = offscreen.getGraphics();}public void paint(Graphics g) {offg.setColor(new Color(180, 150, 100));offg.fillRect(0, 0, size, size);//画出棋盘格子offg.setColor(Color.black);for (int i = 0; i < gridNum + 1; i++) {int x1 = left + i * gridLen;int x2 = x1;int y1 = top;int y2 = top + gridNum * gridLen;offg.drawLine(x1, y1, x2, y2);x1 = left;x2 = left + gridNum * gridLen;y1 = top + i * gridLen;y2 = y1;offg.drawLine(x1, y1, x2, y2);}//画出棋子for (int i = 0; i < gridNum + 1; i++)for (int j = 0; j < gridNum + 1; j++) {if (map[i][j] == null)continue;offg.setColor(map[i][j].color == Chesspoint.black ? Color.black: Color.white);offg.fillOval(left +i* gridLen - chessmanLength / 2, top + j* gridLen - chessmanLength / 2, chessmanLength,chessmanLength);}//画出鼠标的位置,即下一步将要下的位置if (mouseLoc != null) {offg.setColor(currentTurn == Chesspoint.black ? Color.gray: new Color(200, 200, 250));offg.fillOval(left + mouseLoc.x * gridLen - chessmanLength/2 , top+ mouseLoc.y * gridLen - chessmanLength / 2,chessmanLength, chessmanLength);}//把画面一次性画出g.drawImage(offscreen, 3, 0, this);}// 更新棋盘public void update(Graphics g) {paint(g);}//下棋子class PutChess extends MouseAdapter { // 放一颗棋子public void mousePressed(MouseEvent evt) {int xoff = left / 2;int yoff = top / 2;int x = (evt.getX() - xoff) / gridLen;int y = (evt.getY() - yoff) / gridLen;if (x < 0 || x > gridNum || y < 0 || y > gridNum)return;if (map[x][y] != null)return;// *****************清除多余的棋子**********************if (alreadyNum < chessman.size()) {int size = chessman.size();for (int i = size - 1; i >= alreadyNum; i--)chessman.removeElementAt(i);}// ****************************************************Chesspoint qizi = new Chesspoint(x, y, currentTurn);map[x][y] = qizi;// ****************************************************chessman.addElement(qizi);alreadyNum++;if (currentTurn == Chesspoint.black)currentTurn = Chesspoint.white;elsecurrentTurn = Chesspoint.black;// **************判断在[x,y]落子后,是否可以提掉对方的子tizi(x, y);// ***************判断是否挤死了自己,若是则已落的子无效if (allDead(qizi).size() != 0) {map[x][y] = null;repaint();controlPanel.setMsg("挤死自己");// ******************back**************chessman.removeElement(qizi);alreadyNum--;if (currentTurn == Chesspoint.black)currentTurn = Chesspoint.white;elsecurrentTurn = Chesspoint.black;return;}mouseLoc = null;// 更新控制面板controlPanel.setLabel();}public void mouseExited(MouseEvent evt) {// 鼠标退出时,清除将要落子的位置mouseLoc = null;repaint();}}private class MML extends MouseMotionAdapter {// 取得将要落子的位置public void mouseMoved(MouseEvent evt) {int xoff = left / 2;int yoff = top / 2;int x = (evt.getX() - xoff) / gridLen;int y = (evt.getY() - yoff) / gridLen;if (x < 0 || x > gridNum || y < 0 || y > gridNum)return;if (map[x][y] != null)return;mouseLoc = new Point(x, y);repaint();}}//判断在[x,y]落子后,是否可以踢掉对方的子public static int[] xdir = { 0, 0, 1, -1 };public static int[] ydir = { 1, -1, 0, 0 };public void tizi(int x, int y) {Chesspoint qizi;if ((qizi = map[x][y]) == null)return;int color = qizi.color;//取得棋子四周围的几个子Vector v = around(qizi);for (int l = 0; l < v.size(); l++) {Chesspoint q = (Chesspoint) (v.elementAt(l));if (q.color == color)continue;//若颜色不同,取得和q连在一起的所有已死的子,//若没有已死的子则返回一个空的VectorVector dead = allDead(q);//移去所有已死的子removeAll(dead);//如果踢子,则保存所有被踢掉的棋子if (dead.size() != 0) {Object obj = chessman.elementAt(alreadyNum - 1);if (obj instanceof Chesspoint) {qizi = (Chesspoint) (chessman.elementAt(alreadyNum - 1));dead.addElement(qizi);} else {Vector vector = (Vector) obj;for (int i = 0; i < vector.size(); i++)dead.addElement(vector.elementAt(i));}// 更新Vector chessman中的第num个元素chessman.setElementAt(dead, alreadyNum - 1);}}repaint();//判断棋子周围是否有空白public boolean sideByBlank(Chesspoint qizi) {for (int l = 0; l < xdir.length; l++) {int x1 = qizi.x + xdir[l];int y1 = qizi.y + ydir[l];if (x1 < 0 || x1 > gridNum || y1 < 0 || y1 > gridNum) continue;if (map[x1][y1] == null)return true;}return false;}//取得棋子四周围的几个子public Vector around(Chesspoint qizi) {Vector v = new Vector();for (int l = 0; l < xdir.length; l++) {int x1 = qizi.x + xdir[l];int y1 = qizi.y + ydir[l];if (x1 < 0 || x1 > gridNum || y1 < 0 || y1 > gridNum|| map[x1][y1] == null)continue;v.addElement(map[x1][y1]);}return v;//取得连在一起的所有已死的子public Vector allDead(Chesspoint q) {Vector v = new Vector();v.addElement(q);int count = 0;while (true) {int origsize = v.size();for (int i = count; i < origsize; i++) {Chesspoint qizi = (Chesspoint) (v.elementAt(i));if (sideByBlank(qizi))return new Vector();Vector around = around(qizi);for (int j = 0; j < around.size(); j++) {Chesspoint a = (Chesspoint) (around.elementAt(j));if (a.color != qizi.color)continue;if (v.indexOf(a) < 0)v.addElement(a);}}if (origsize == v.size())break;elsecount = origsize;}return v;}// 从棋盘上移去中棋子public void removeAll(Vector v) {for (int i = 0; i < v.size(); i++) {Chesspoint q = (Chesspoint) (v.elementAt(i));map[q.x][q.y] = null;}repaint();}//悔棋public void back() {if (alreadyNum == 0) {controlPanel.setMsg("无子可悔");return;}Object obj = chessman.elementAt(--alreadyNum);if (obj instanceof Chesspoint) {Chesspoint qizi = (Chesspoint) obj;map[qizi.x][qizi.y] = null;currentTurn = qizi.color;} else {Vector v = (Vector) obj;for (int i = 0; i < v.size(); i++) {Chesspoint q = (Chesspoint) (v.elementAt(i));if (i == v.size() - 1) {map[q.x][q.y] = null;int index = chessman.indexOf(v);chessman.setElementAt(q, index);currentTurn = q.color;} else {map[q.x][q.y] = q;}}}controlPanel.setLabel();repaint();}//悔棋后再次前进public void forward() {if (alreadyNum == chessman.size()) {controlPanel.setMsg("不能前进");return;}Object obj = chessman.elementAt(alreadyNum++);Chesspoint qizi;if (obj instanceof Chesspoint) {qizi = (Chesspoint) (obj);map[qizi.x][qizi.y] = qizi;} else {Vector v = (Vector) obj;qizi = (Chesspoint) (v.elementAt(v.size() - 1));map[qizi.x][qizi.y] = qizi;}if (qizi.color == Chesspoint.black)currentTurn = Chesspoint.white;elsecurrentTurn = Chesspoint.black;tizi(qizi.x, qizi.y);controlPanel.setLabel();repaint();}//重新开始游戏public void startGame() {chessman = new Vector();alreadyNum = 0;map = new Chesspoint[gridNum + 1][gridNum + 1];currentTurn = Chesspoint.black;controlPanel.setLabel();repaint();}//控制面板类class ControlPanel extends Panel {protected Label lblTurn = new Label("", Label.CENTER);protected Label lblNum = new Label("", Label.CENTER);protected Label lblMsg = new Label("", Label.CENTER);protected Choice choice = new Choice();protected Button back = new Button("悔棋");protected Button start = new Button("重新开局");public int getWidth() {return 50;}public int getHeight() {return size;}//选择棋盘的大小public ControlPanel() {setSize(this.getWidth(), this.getHeight());setLayout(new GridLayout(12, 1, 0, 10));setLabel();choice.add("18 X 18");choice.add("14 X 14");choice.add("12 X 12");choice.add("11 X 11");choice.add(" 7 X 7 ");choice.addItemListener(new ChessAction());add(lblTurn);add(lblNum);add(start);add(choice);add(lblMsg);add(back);back.addActionListener(new BackChess());start.addActionListener(new BackChess());setBackground(new Color(120, 120, 200)); }public Insets getInsets() {return new Insets(5, 5, 5, 5);}//悔棋private class BackChess implements ActionListener {public void actionPerformed(ActionEvent evt) {if (evt.getSource() == back)Chessboard.this.back();else if (evt.getSource() == start)Chessboard.this.startGame();}}// 下棋动作private class ChessAction implements ItemListener {public void itemStateChanged(ItemEvent evt) {String s = (String) (evt.getItem());Chessboard.this.left = Chessboard.this.top =13;int rects = Integer.parseInt(s.substring(0, 2).trim());if (rects != Chessboard.this.gridNum) {if(rects<18){Chessboard.this.left = Chessboard.this.top =Chessboard.this.left+(28-rects);Chessboard.this.gridLen = (_gridLen * _gridNum-Chessboard.this.left) / rects;Chessboard.this.chessmanLength = gridLen * 9 / 10;Chessboard.this.gridNum = rects;Chessboard.this.startGame();}else{Chessboard.this.gridLen = (_gridLen * _gridNum) / rects;Chessboard.this.chessmanLength = gridLen * 9 / 10;Chessboard.this.gridNum = rects;Chessboard.this.startGame();}}}}// 待下方的颜色与步数public void setLabel() {lblTurn.setText(Chessboard.this.currentTurn == Chesspoint.black ? "轮到黑子": "轮到白子");lblTurn.setForeground(Chessboard.this.currentTurn == Chesspoint.black ? Color.black: Color.white);lblNum.setText("第" + (Chessboard.this.alreadyNum + 1) + " 手");lblNum.setForeground(Chessboard.this.currentTurn == Chesspoint.black ? Color.black: Color.white);lblMsg.setText("");}public void setMsg(String msg) {// 提示信息lblMsg.setText(msg);}}}2、Chesspoint类//取得黑白棋子的位置public class Chesspoint{public static int black=0,white=1;int x,y;int color;public Chesspoint(int i,int j,int c){x=i;y=j;color=c;}public String toString(){// 储存x,y位置和颜色String c=(color==black?"black":"white");return "["+x+","+y+"]:"+c;}}3、Chess类import java.awt.*;import javax.swing.JFrame;import javax.swing.JPanel;import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.JFrame;//import sunw.util.EventListener;public class Chess extends JFrame {Chessboard qipan = new Chessboard();private JPanel jp = new JPanel();// 初始化外观public Chess() {this.setTitle("围棋程序");this.setLayout(new BorderLayout());jp.setSize(550, 490);jp.setLayout(new BorderLayout());jp.add(Chessboard.controlPanel, "West");jp.add(qipan, "Center");add(jp);jp.setSize(550, 490);this.setResizable(false);this.setLayout(new BorderLayout());this.setSize(550, 490);this.setVisible(true);}// 得到宽数值public int getWidth() {return qipan.getWidth();}public int getHeight() {return qipan.getHeight();}public static void main(String[] args) { //开始下棋程序Chess Igo = new Chess();}}。