河南工业大学实验报告(2015~2016学年-第2学期)课程名称:软件体系结构课程编号:51610192 地点:6313/6316/6308/6320一、实验目的:验证C/S风格的工作机制。
二、实验内容:针对某个应用系统,选用C/S风格作为这个系统的软件体系结构风格。
熟悉C/S风格的工作机制,对所考察的系统进行C/S风格客户端软件体系结构设计的验证。
(针对不同的特定应用系统具体表述)。
三.编程环境Windows 7Visual Studio | Dev-C++Eclipse四.实验代码1.画棋盘// 画横线for (int i = 0; i <= ROWS; i++) {g.drawLine(MARGIN, MARGIN + i * GRID_SPAN, MARGIN + COLS *GRID_SPAN, MARGIN + i * GRID_SPAN);}for (int i = 0; i <= COLS; i++) {// 画竖线g.drawLine(MARGIN + i * GRID_SPAN, MARGIN, MARGIN + i *GRID_SPAN, MARGIN + ROWS * GRID_SPAN);}2.将鼠标点击转为网格索引public void mouseMoved(MouseEvent e) {int x1 = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;// 将鼠标点击的坐标位置转成网格索引int y1 = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;if (x1 < 0 || x1 > ROWS || y1 < 0 || y1 > COLS || gameOver || findChess(x1, y1))setCursor(new Cursor(Cursor.DEFAULT_CURSOR));// 设置成默认状态elsesetCursor(new Cursor(Cursor.HAND_CURSOR));}3.增加棋子// ********************** 增加黑色棋子public Point[] BlackAddChess(int x, int y) {if (!isBlack) {String msg = String.format("黑子已经落子,轮到白子");JOptionPane.showMessageDialog(this, msg);return null;} elsereturn addChess(x, y);}// ********************** 增加白色棋子public Point[] WhiteAddChess(int x, int y) {if (isBlack) {String msg = String.format("白子已经落子,轮到黑子");JOptionPane.showMessageDialog(this, msg);return null;} elsereturn addChess(x, y);}4.悔棋public void goback() {if (chessCount == 0)return;chessList[chessCount - 1] = null;chessCount--;if (chessCount > 0) {xIndex = chessList[chessCount - 1].getX();yIndex = chessList[chessCount - 1].getY();}isBlack = !isBlack;repaint();}5.判断输赢(提供横向向西判断,其余方向类似)private boolean isWin() {int continueCount = 1;// 连续棋子的个数// --------------横向寻找-----> 横向向西寻找for (int x = xIndex - 1; x >= 0; x--) {Color c = isBlack ? Color.black : Color.white;if (getChess(x, yIndex, c) != null) {continueCount++;} elsebreak;}}五.实验结果悔棋前:悔棋后:赢棋:河南工业大学实验报告(2015~2016学年-第2学期)课程名称:软件体系结构课程编号:51610192 地点:6313/6316/6308/6320一、实验目的:验证C/S风格的工作机制。
二、实验内容:针对某个应用系统,选用C/S风格作为这个系统的软件体系结构风格。
熟悉C/S风格的工作机制,对所考察的系统进行C/S风格服务器软件体系结构设计的验证。
(针对不同的特定应用系统具体表述)。
三.编程环境Windows 7Visual Studio | Dev-C++Eclipse四.实验代码1. public Point WhiteNextStep(Point[] chessList){}:根据当前棋局,确定白子的下一个最佳位置public Point WhiteNextStep(Point[] chessList) {ArrayList<ArrayList<Point>> NextPoint = NextCandidatedPoints(chessList);ArrayList<Point> blackList = NextPoint.get(0);ArrayList<Point> whiteList = NextPoint.get(1);int blackLongnum = findTheLongestChessNums(blackList.get(0), chessList);int whiteLongnum = findTheLongestChessNums(whiteList.get(0), chessList);if (whiteLongnum < blackLongnum) {// 白的的连子数比黑子要少,就从黑子的候选结点中选择评价函数最高的结点ArrayList<Point> candicatedPoint = PointEvalution(blackList, chessList, blackLongnum);if (candicatedPoint.size() == 1)return candicatedPoint.get(0);else {// 从候选结点中随机选取int size = candicatedPoint.size();Random rand = new Random();int Index = rand.nextInt(size);return candicatedPoint.get(Index);}} else {// 白子连子数比黑子多,则从自己的候选结点中选择ArrayList<Point> candicatedPoint = PointEvalution(whiteList, chessList, whiteLongnum);if (candicatedPoint.size() == 1)return candicatedPoint.get(0);else {// 从候选结点中随机选取int size = candicatedPoint.size();Random rand = new Random();int Index = rand.nextInt(size);return candicatedPoint.get(Index);}}}2.public Point BlackNextStep(Point[] chesslistB){}:根据当前棋局,确定黑子的下一个最佳位置几乎和上面的一样略3. public Point BlackNextStep(Point[] chesslistB){}:根据当前棋局,找到使棋子最大的连子的位置public int findTheLongestChessNums(Point p, Point[] chesslist) {int longLength = 0;// 1. 横向寻找int longLineLength = lineSearch(p, chesslist);// 2. 纵向寻找int longColLength = rowSearch(p, chesslist);// 3. 右上角寻找int LongRightUpLength = rightupSearch(p, chesslist);// 4. 左上角寻找int LongLeftUpLength = leftupSearch(p, chesslist);// get the maxif (longLineLength >= longColLength)longLength = longLineLength;elselongLength = longColLength;if (LongRightUpLength >= longLength)longLength = LongRightUpLength;if (LongLeftUpLength >= longLength)longLength = LongLeftUpLength;return longLength;}4. public boolean findNeedPoint(int xIndex, int yIndex, Color c, Point[] chesslist){}:能够找到对应的坐标的棋子public boolean findNeedPoint(int xIndex, int yIndex, Color c, Point[] chesslist) { for (Point p : chesslist)if (p != null && xIndex == p.getX() && yIndex == p.getY() && c ==p.getColor())return true;return false;}5. public int numsofthelongchess(Point p, Point[] chesslist, int longnum){}:给定的棋子位置最长连子数的个数public int numsofthelongchess(Point p, Point[] chesslist, int longnum) { int nums = 0;if (lineSearch(p, chesslist) == longnum)nums++;if (rowSearch(p, chesslist) == longnum)nums++;if (rightupSearch(p, chesslist) == longnum)nums++;if (leftupSearch(p, chesslist) == longnum)nums++;return nums;}6. public int lineSearch(Point p, Point[] chesslist){}:根据当前棋子位置,直线搜索连子的数目7. `public int rowSearch(Point p, Point[] chesslist){}`:根据当前棋子位置,垂直搜索连子的数目8. public int rightupSearch(Point p, Point[] chesslist){}`:根据当前棋子位置,右上搜索连子的数目9. public int leftupSearch(Point p, Point[] chesslist){}`:根据当前棋子位置,左上搜索连子的数目注意:左上就包括左下在代码中体现public int rightupSearch(Point p, Point[] chesslist) {int LongRightUpLength = 1;for (int x = p.getX() + 1, y = p.getY() - 1; x <= ChessBoard.COLS && y >= 0;x++, y--) {if (findNeedPoint(x, y, p.getColor(), chesslist))LongRightUpLength++;elsebreak;}for (int x = p.getX() - 1, y = p.getY() + 1; x >= 0 && y <= ChessBoard.ROWS; x--, y++) {if (findNeedPoint(x, y, p.getColor(), chesslist))LongRightUpLength++;elsebreak;}return LongRightUpLength;}10. public void computerVscomputer(ChessBoard chessboard){}`:电脑自动对弈函数实现public void computerVscomputer(ChessBoard chessboard) {boolean flag = true;while (true && chessboard.GetMode() == 2) {// 黑子落Point NextStep;int stepx, stepy;Point[] chesslist = chessboard.getChesslist();if (flag) {chesslist = chessboard.BlackAddChess(chessboard.ROWS / 2, chessboard.COLS / 2);flag = false;} else {NextStep = BlackNextStep(chesslist);stepx = NextStep.getX();stepy = NextStep.getY();chesslist = chessboard.BlackAddChess(stepx, stepy);try {Thread.sleep(1000);} catch (Exception e) {System.out.println("thread error");}}// 白子落NextStep = WhiteNextStep(chesslist);stepx = NextStep.getX();stepy = NextStep.getY();chesslist = chessboard.WhiteAddChess(stepx, stepy);try {Thread.sleep(1000);} catch (Exception e) {System.out.println("thread error");}}}}11. 人机或电脑之间对弈时,需要开启新的线程,这段代码在棋盘类中public void run() {// 机机模式if (this.Mode == 2) {ChessStrategy chessStrategy = new ChessStrategy();puterVscomputer(this);}// 人机模式if (this.Mode == 1) {ChessStrategy chessStrategy = new ChessStrategy();Point t;while (!this.gameOver && this.Mode == 1) {System.out.println("5");if (!this.isBlack) {t = chessStrategy.WhiteNextStep(this.getChesslist());WhiteAddChess(t.getX(), t.getY());}}}}五.实验结果人机对弈人机对弈人执黑子先下,电脑执白子,如图,黑子连子数为3有两条时,电脑白子策略错误(红框白子为电脑下棋位置)人机对弈黑子连子数为3,但是靠近棋盘边界,白子策略错误(红框白子为电脑下棋位置电脑对弈电脑对弈控制台信息河南工业大学实验报告(2015~2016学年-第2学期)课程名称:软件体系结构课程编号:51610192 地点:6313/6316/6308/6320一、实验目的:深入理解UML建模的思想,熟悉UML建模方法。