c#的麻雀搜索算法代码
时间: 2023-09-02 08:07:46 浏览: 117
以下是C#语言实现的麻雀搜索算法示例代码:
```csharp
public class MahjongAI
{
public List<Tile> SearchMahjong(List<Tile> handTiles, Tile winningTile)
{
List<Tile> result = new List<Tile>();
// 先排序
handTiles.Sort();
// 判断是否听牌
if (IsReadyHand(handTiles, winningTile))
{
result.Add(winningTile);
return result;
}
// 非听牌,进行麻雀搜索
foreach (var tile in handTiles)
{
// 如果当前牌已经被使用过
if (tile.Used)
{
continue;
}
// 添加当前牌到结果中
result.Add(tile);
tile.Used = true;
// 递归搜索
List<Tile> tempResult = SearchMahjong(handTiles, winningTile);
// 如果搜索结果不为空,则返回结果
if (tempResult != null && tempResult.Count > 0)
{
return tempResult;
}
// 如果搜索结果为空,则回溯
result.Remove(tile);
tile.Used = false;
}
// 搜索失败,返回空
return null;
}
private bool IsReadyHand(List<Tile> handTiles, Tile winningTile)
{
// 将赢牌加入手牌
handTiles.Add(winningTile);
// 如果手牌数量不为 14,则不为听牌
if (handTiles.Count != 14)
{
handTiles.Remove(winningTile);
return false;
}
// 判断是否为七对子
if (IsSevenPairs(handTiles))
{
handTiles.Remove(winningTile);
return true;
}
// 判断是否为普通和牌
if (IsNormalWin(handTiles))
{
handTiles.Remove(winningTile);
return true;
}
handTiles.Remove(winningTile);
return false;
}
private bool IsSevenPairs(List<Tile> handTiles)
{
int pairCount = 0;
foreach (var tile in handTiles)
{
// 如果当前牌已经被使用过
if (tile.Used)
{
continue;
}
// 如果当前牌和下一张牌相同,则为一对
if (tile == handTiles[handTiles.IndexOf(tile) + 1])
{
pairCount++;
tile.Used = true;
}
}
// 如果对子数量为 7,则为七对子
return pairCount == 7;
}
private bool IsNormalWin(List<Tile> handTiles)
{
// 判断是否存在雀头
for (int i = 0; i < handTiles.Count - 1; i++)
{
if (handTiles[i] == handTiles[i + 1])
{
List<Tile> tempTiles = new List<Tile>(handTiles);
tempTiles.RemoveAt(i);
tempTiles.RemoveAt(i);
// 判断是否能够和牌
if (CanWin(tempTiles))
{
return true;
}
}
}
return false;
}
private bool CanWin(List<Tile> handTiles)
{
if (handTiles.Count == 0)
{
return true;
}
for (int i = 0; i < handTiles.Count - 2; i++)
{
// 如果当前牌已经被使用过
if (handTiles[i].Used)
{
continue;
}
// 如果当前牌和下一个牌以及下下个牌相同,则将这三张牌从手牌中移除,继续搜索
if (handTiles[i] == handTiles[i + 1] && handTiles[i] == handTiles[i + 2])
{
handTiles[i].Used = true;
handTiles[i + 1].Used = true;
handTiles[i + 2].Used = true;
bool result = CanWin(handTiles);
handTiles[i].Used = false;
handTiles[i + 1].Used = false;
handTiles[i + 2].Used = false;
if (result)
{
return true;
}
}
// 如果当前牌、下一个牌和下下个牌构成顺子,则将这三张牌从手牌中移除,继续搜索
if (handTiles[i].IsSequentialTile(handTiles[i + 1]) && handTiles[i + 1].IsSequentialTile(handTiles[i + 2]))
{
handTiles[i].Used = true;
handTiles[i + 1].Used = true;
handTiles[i + 2].Used = true;
bool result = CanWin(handTiles);
handTiles[i].Used = false;
handTiles[i + 1].Used = false;
handTiles[i + 2].Used = false;
if (result)
{
return true;
}
}
}
return false;
}
}
```
这里假设 `Tile` 类为麻将牌类,拥有 `Used` 属性表示是否已经使用过,以及 `IsSequentialTile()` 方法判断两张牌是否构成顺子。在 `MahjongAI` 类中实现了麻雀搜索算法以及判断听牌的方法,同时也实现了判断是否为七对子、是否存在雀头、是否能够和牌的方法。
阅读全文