⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 handicapmove.java

📁 ErGo是一个很早的Java通用围棋服务器(IGS/NNGS)客户端程序。有全部源码和文档
💻 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 + -