Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: 0574cfa1ab
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 215 lines (172 sloc) 6.677 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
/*
* Copyright (c) 2007 Philipp Garcia (phil@gotraxx.org)
*
* This file is part of GoTraxx (www.gotraxx.org).
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* This license governs use of the accompanying software. If you use the software, you
* accept this license. If you do not accept the license, do not use the software.
*
* Permission is granted to anyone to use this software for any noncommercial purpose,
* and to alter it and redistribute it freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim that
* you wrote the original software.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. If you bring a patent claim against the original author or any contributor over
* patents that you claim are infringed by the software, your patent license from
* such contributor to the software ends automatically.
*
* 4. This software may not be used in whole, nor in part, to enter any competition
* without written permission from the original author.
*
* 5. This notice may not be removed or altered from any source distribution.
*
*/


using System;
using System.Collections.Generic;
using System.Text;

namespace GoTraxx
{
static class GoBoardHelper
{

public static List<int> GetMovesInOpponentsTerritory(GoBoard goBoard, Color playerToMove)
{
// useful for force moves in endgame
List<int> lMoves = new List<int>();

for (int lPoint = 0; lPoint < goBoard.Coord.BoardArea; lPoint++)
{
SafetyStatus lSafetyStatus = goBoard.GetSafetyStatus(lPoint);

if ((lSafetyStatus.IsTerritory) && (lSafetyStatus.Player == playerToMove.Opposite))
if (goBoard.IsLegal(lPoint, playerToMove))
lMoves.Add(lPoint);
}

return lMoves;
}

public static List<int> GetProtectedLiberites(GoBoard goBoard, Color color)
{
List<int> lProtected = new List<int>();

for (int lIndex = 0; lIndex < goBoard.Coord.BoardArea; lIndex++)
if (goBoard.IsProtectedLiberty(lIndex, color))
lProtected.Add(lIndex);

return lProtected;
}

public static List<int> GetNeighborsOfProtectedLiberites(GoBoard goBoard, Color color)
{
List<int> lNeighbors = new List<int>();

for (int lPoint = 0; lPoint < goBoard.Coord.BoardArea; lPoint++)
if (goBoard.IsProtectedLiberty(lPoint, color))
foreach (int lNeighbor in goBoard.Coord.GetNeighbors(lPoint))
if (!lNeighbors.Contains(lNeighbor))
lNeighbors.Add(lNeighbor);

return lNeighbors;
}

public static List<int> GetNeighbors(GoBoard goBoard, List<int> points)
{
List<int> lNeighbors = new List<int>();

foreach (int lPoint in points)
foreach (int lNeighbor in goBoard.Coord.GetNeighbors(lPoint))
if (!lNeighbors.Contains(lNeighbor))
lNeighbors.Add(lNeighbor);

return lNeighbors;
}

// marked to be depreciated
public static List<int> GetLegalSafeMoves(GoBoard goBoard, Color playerToMove)
{
List<int> lMoves = new List<int>();

for (int i = 0; i < goBoard.Coord.BoardArea; i++)
if (goBoard.IsLegal(i, playerToMove))
{
SafetyStatus lSafetyStatus = goBoard.GetSafetyStatus(i);

if (lSafetyStatus.IsUndecided || (lSafetyStatus.IsUnsurroundable && !lSafetyStatus.IsDame))
lMoves.Add(i);
}

return lMoves;
}

// marked to be depreciated
public static List<int> FillDame(GoBoard goBoard, Color playerToMove)
{
List<int> lMoves = new List<int>();
for (int i = 0; i < goBoard.Coord.BoardArea; i++)
{
SafetyStatus lSafetyStatus = goBoard.GetSafetyStatus(i);

if (lSafetyStatus.IsDame || lSafetyStatus.IsUnsurroundable)
lMoves.Add(i);
}

return lMoves;
}

// marked to be depreciated
public static List<int> CaptureDeadStones(GoBoard goBoard, Color playerToMove)
{
List<int> lMoves = new List<int>();
for (int i = 0; i < goBoard.Coord.BoardArea; i++)
if (goBoard.GetSafetyStatus(i).IsDead)
if (goBoard.Cells[i].Color != playerToMove)
lMoves.Add(i);

return lMoves;
}

// marked to be depreciated
public static List<int> GetSafeMovesInOwnTerritory(GoBoard goBoard, Color playerToMove)
{
// useful for force moves in endgame
List<int> lMoves = new List<int>();

for (int lPoint = 0; lPoint < goBoard.Coord.BoardArea; lPoint++)
{
SafetyStatus lSafetyStatus = goBoard.GetSafetyStatus(lPoint);

if ((lSafetyStatus.IsTerritory) && (lSafetyStatus.Player == playerToMove))
if (goBoard.IsLegal(lPoint, playerToMove))
{
goBoard.PlayStone(lPoint, playerToMove, true);

SafetyStatus lSafetyStatusAfter = goBoard.GetSafetyStatus(lPoint);

// check if still safe after move
if (lSafetyStatusAfter.IsAlive) // && (lSafetyStatus.Player == playerToMove))
lMoves.Add(lPoint);

goBoard.Undo();
}

}
return lMoves;
}

// marked to be depreciated
public static int FindAnyMoveInOpponentsTerritory(GoBoard goBoard, Color playerToMove)
{
// useful for force moves in endgame
for (int lPoint = 0; lPoint < goBoard.Coord.BoardArea; lPoint++)
{
SafetyStatus lSafetyStatus = goBoard.GetSafetyStatus(lPoint);

if ((lSafetyStatus.IsTerritory) && (lSafetyStatus.Player == playerToMove.Opposite))
if (goBoard.IsLegal(lPoint, playerToMove))
return lPoint;
}

return CoordinateSystem.PASS;
}

// marked to be depreciated
public static int FindAnySafeInOwnTerritory(GoBoard goBoard, Color playerToMove)
{
// useful for force moves in endgame
for (int lPoint = 0; lPoint < goBoard.Coord.BoardArea; lPoint++)
{
SafetyStatus lSafetyStatus = goBoard.GetSafetyStatus(lPoint);

if ((lSafetyStatus.IsTerritory) && (lSafetyStatus.Player == playerToMove))
if (goBoard.IsLegal(lPoint, playerToMove))
{
goBoard.PlayStone(lPoint, playerToMove, true);

SafetyStatus lSafetyStatusAfter = goBoard.GetSafetyStatus(lPoint);

goBoard.Undo();

// it's still safe after move, so return it
if ((lSafetyStatus.IsAlive) && (lSafetyStatus.Player == playerToMove))
return lPoint;
}
}

return CoordinateSystem.PASS;
}

}
}
Something went wrong with that request. Please try again.