📄 stepgenerater.java
字号:
/* * StepGenerater.java * * Created on 2007-9-29, 10:22:55 * * To change this template, choose Tools | Templates * and open the template in the editor. */package org.yangcq.logic.step;import java.util.Enumeration;import java.util.Stack;import java.util.Vector;/** * * @author Administrator */public final class StepGenerater{ private Stack reversed; //翻棋历史记录 public StepGenerater() { this.reversed = new Stack(); } public Step[] getValidSteps(Step[][] steps,boolean side) { Vector canChessList = new Vector(); // IPlayer curPlayer = board.getCurrentPlayer(); for (int x = 0; x < steps.length; x++) { for (int y = 0; y < steps[x].length; y++) { if (canChess(steps, x, y, side)) { canChessList.addElement(new Step(x, y, new Boolean(side))); } } } if (canChessList.size() < 1) { return null; } Step[] validSteps = new Step[canChessList.size()]; Enumeration em = canChessList.elements(); for (int i = 0; i < canChessList.size(); i++) { validSteps[i] = (Step) em.nextElement(); } return validSteps; } private boolean canChess(Step[][] steps, int x, int y, boolean chessmanBlack) { int xx; int yy; boolean opSide; byte b; if (steps[x][y] != null) { return false; } opSide = !chessmanBlack; xx = x - 1; b = 0; while ((xx > 0) && (steps[xx][y] != null) && (steps[xx][y].getColor().booleanValue() == opSide)) { b = 1; --xx; } if (b > 0 && (xx >= 0) && (steps[xx][y] != null) && (steps[xx][y].getColor().booleanValue() == chessmanBlack)) { return true; } xx = x - 1; yy = y - 1; b = 0; while ((xx > 0) && (yy > 0) && (steps[xx][yy] != null) && (steps[xx][yy].getColor().booleanValue() == opSide)) { b = 1; --xx; --yy; } if ((b > 0) && (xx >= 0) && (yy >= 0) && (steps[xx][yy] != null) && (steps[xx][yy].getColor().booleanValue() == chessmanBlack)) { return true; } xx = x - 1; yy = y + 1; b = 0; while ((xx > 0) && (yy < steps[xx].length - 1) && (steps[xx][yy] != null) && (steps[xx][yy].getColor().booleanValue() == opSide)) { b = 1; --xx; ++yy; } if (b > 0 && (xx >= 0) && (yy < steps[xx].length) && (steps[xx][yy] != null) && (steps[xx][yy].getColor().booleanValue() == chessmanBlack)) { return true; } yy = y - 1; b = 0; while ((yy > 0) && (steps[x][yy] != null) && (steps[x][yy].getColor().booleanValue() == opSide)) { b = 1; --yy; } if (b > 0 && (yy >= 0) && (steps[x][yy] != null) && (steps[x][yy].getColor().booleanValue() == chessmanBlack)) { return true; } yy = y + 1; b = 0; while ((yy < steps.length - 1) && (steps[x][yy] != null) && (steps[x][yy].getColor().booleanValue() == opSide)) { b = 1; ++yy; } if (b > 0 && (yy < steps.length) && (steps[x][yy] != null) && (steps[x][yy].getColor().booleanValue() == chessmanBlack)) { return true; } xx = x + 1; yy = y - 1; b = 0; while ((xx < steps.length - 1) && (yy > 0) && (steps[xx][yy] != null) && (steps[xx][yy].getColor().booleanValue() == opSide)) { b = 1; ++xx; --yy; } if (b > 0 && (xx < steps.length) && (yy >= 0) && (steps[xx][yy] != null) && (steps[xx][yy].getColor().booleanValue() == chessmanBlack)) { return true; } xx = x + 1; b = 0; while ((xx < steps.length - 1) && (steps[xx][y] != null) && (steps[xx][y].getColor().booleanValue() == opSide)) { b = 1; ++xx; } if (b > 0 && (xx < steps.length) && (steps[xx][y] != null) && (steps[xx][y].getColor().booleanValue() == chessmanBlack)) { return true; } xx = x + 1; yy = y + 1; b = 0; while ((xx < steps.length - 1) && (yy < steps.length - 1) && (steps[xx][yy] != null) && (steps[xx][yy].getColor().booleanValue() == opSide)) { b = 1; ++xx; ++yy; } if (b > 0 && (xx < steps.length) && (yy < steps.length) && (steps[xx][yy] != null) && (steps[xx][yy].getColor().booleanValue() == chessmanBlack)) { return true; } return false; } public long chess(Step[][] steps,int x, int y,boolean side)//下棋。 { boolean opSide = !side; int oldSize = this.reversed.size(); int xx; int yy; steps[x][y] = new Step(x, y, new Boolean(side)); //在x,y处下棋 //以下是计算翻棋。 xx = x - 1; while ((xx > 0) && (steps[xx][y] != null) && (steps[xx][y].getColor().booleanValue() == opSide)) { --xx; } if (steps[xx][y] != null && steps[xx][y].getColor().booleanValue() == side) { ++xx; while (xx < x) { steps[xx][y].reverse(); this.reversed.push(steps[xx][y]); ++xx; } } xx = x - 1; yy = y - 1; while ((xx > 0) && (yy > 0) && (steps[xx][yy] != null) && (steps[xx][yy].getColor().booleanValue() == opSide)) { --xx; --yy; } if (steps[xx][yy] != null && steps[xx][yy].getColor().booleanValue() == side) { ++xx; ++yy; while (xx < x) { steps[xx][yy].reverse(); //反过来 this.reversed.push(steps[xx][yy]); ++xx; ++yy; } } xx = x - 1; yy = y + 1; while ((xx > 0) && (yy < steps.length - 1) && (steps[xx][yy] != null) && (steps[xx][yy].getColor().booleanValue() == opSide)) { --xx; ++yy; } if (steps[xx][yy] != null && steps[xx][yy].getColor().booleanValue() == side) { ++xx; --yy; while (xx < x) { steps[xx][yy].reverse(); this.reversed.push(steps[xx][yy]); ++xx; --yy; } } yy = y - 1; while ((yy > 0) && (steps[x][yy] != null) && (steps[x][yy].getColor().booleanValue() == opSide)) { --yy; } if (steps[x][yy] != null && steps[x][yy].getColor().booleanValue() == side) { ++yy; while (yy < y) { steps[x][yy].reverse(); this.reversed.push(steps[x][yy]); ++yy; } } yy = y + 1; while ((yy < steps.length - 1) && (steps[x][yy] != null) && (steps[x][yy].getColor().booleanValue() == opSide)) { ++yy; } if (steps[x][yy] != null && steps[x][yy].getColor().booleanValue() == side) { --yy; while (yy > y) { steps[x][yy].reverse(); this.reversed.push(steps[x][yy]); --yy; } } xx = x + 1; yy = y - 1; while ((xx < steps.length - 1) && (yy > 0) && (steps[xx][yy] != null) && (steps[xx][yy].getColor().booleanValue() == opSide)) { ++xx; --yy; } if (steps[xx][yy] != null && steps[xx][yy].getColor().booleanValue() == side) { --xx; ++yy; while (xx > x) { steps[xx][yy].reverse(); this.reversed.push(steps[xx][yy]); --xx; ++yy; } } xx = x + 1; while ((xx < steps.length - 1) && (steps[xx][y] != null) && (steps[xx][y].getColor().booleanValue() == opSide)) { ++xx; } if (steps[xx][y] != null && steps[xx][y].getColor().booleanValue() == side) { --xx; while (xx > x) { steps[xx][y].reverse(); this.reversed.push(steps[xx][y]); --xx; } } xx = x + 1; yy = y + 1; while ((xx < steps.length - 1) && (yy < steps.length - 1) && (steps[xx][yy] != null) && (steps[xx][yy].getColor().booleanValue() == opSide)) { ++xx; ++yy; } if (steps[xx][yy] != null && steps[xx][yy].getColor().booleanValue() == side) { --xx; --yy; while (xx > x) { steps[xx][yy].reverse(); this.reversed.push(steps[xx][yy]); --xx; --yy; } } return this.reversed.size() - oldSize; } public void unChess(Step[][] steps,int x, int y, long count)//撤消一步棋。 { steps[x][y] = null; while (count > 0) { ((Step) this.reversed.pop()).reverse(); --count; } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -