📄 handicapmove.java
字号:
package ergo.logic;
// $Id: HandicapMove.java,v 1.2 1999/08/13 01:17:48 sigue Exp $
/*
* Copyright (C) 1999 Carl L. Gay and Antranig M. Basman.
* See the file copyright.txt, distributed with this software,
* for further information.
*/
import ergo.util.*;
import java.io.PrintWriter;
public class HandicapMove extends Move {
int stones;
PositionVector positions;
public HandicapMove (Move parent, int timeleft, int num,
boolean isVar, int rocks, int gameSize) {
super(parent, timeleft, num, Move.BLACK, isVar);
stones = rocks;
placedPositions(gameSize);
}
// This constructor used by SGF reader since the handicap stones
// may be placed in non-standard positions.
public HandicapMove (Move parent, int timeleft, int num,
boolean isVar, PositionVector positions) {
super(parent, timeleft, num, Move.BLACK, isVar);
stones = positions.size();
this.positions = positions;
}
public void writeSGF (PrintWriter out, Game game, int n) {
if (!(parent instanceof RootMove))
out.print(";");
if (stones >= 2) { // HA[0] and HA[1] illegal in SGF
out.print("HA[" + stones + "]AB");
for (int i = 0; i < positions.size(); i++)
out.print(positions.elementAt(i).asSGF(game.size()));
out.print("\n");
n = SGF.nodesPerLine;
}
if (game.isNetGame())
writeTimeLeft(out);
super.writeSGF(out, game, n);
}
public boolean isLegal (Game game, boolean fast, ILMV result) {
if (!super.isLegal(game, fast, result))
return false;
else if (parent instanceof RootMove) {
if (!fast) {
result.newGroups = new SimpleGroupVector(stones);
for (int i = 0; i < positions.size(); i++) {
SimpleGroup g = new SimpleGroup(color);
Position p = positions.elementAt(i);
PositionVector libs = game.getLiberties(p);
g.addPosition(p);
for (int j = 0; j < libs.size(); j++)
g.addLiberty(libs.elementAt(j));
result.newGroups.addElement(g);
}
}
return true;
}
else {
result.failureReason
= "A handicap may only be placed on the first move.";
return false;
}
}
public PositionVector placedPositions (int size) {
if (positions == null) {
positions = new PositionVector(stones);
int lo = (size == 9) ? 2 : 3;
int hi = size - lo - 1;
int mid = size / 2;
positions.addElement(new Position(hi, hi));
if (stones >= 2)
positions.addElement(new Position(lo, lo));
if (stones >= 3)
positions.addElement(new Position(hi, lo));
if (stones >= 4) {
positions.addElement(new Position(lo, hi));
if ((stones % 2) == 1) // odd?
positions.addElement(new Position(mid, mid));
}
if (stones >= 6) {
positions.addElement(new Position(mid, lo));
positions.addElement(new Position(mid, hi));
}
if (stones >= 8) {
positions.addElement(new Position(lo, mid));
positions.addElement(new Position(hi, mid));
}
}
return positions;
}
public PositionVector placedPositions () {
return positions;
}
public SimpleGroupVector capturedGroups () {
return null;
}
public int numberOfStones () { return stones; }
public String toString () {
return "Handicap " + stones;
}
public boolean equals (Move m) {
return (m instanceof HandicapMove
&& numberOfStones() == m.numberOfStones());
}
public boolean occupiesPosition (Position pos) {
for (int i = 0; i < positions.size(); i++)
if (pos.equals(positions.elementAt(i)))
return true;
return false;
}
public SimpleGroupVector newGroups (Game game) {
SimpleGroupVector groups = new SimpleGroupVector(stones);
for (int i = 0; i < stones; ++i) {
groups.addElement(game.composeGroups(game.groupsAbutting(
positions.elementAt(i), color), color, positions.elementAt(i)));
}
return groups;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -