这是Tic-Tac-Toe游戏的一部分。 checkmate方法返回一个字符串,该字符串将被另一个函数(此处未显示)用于进行tic-tack-toe move。
这是棋盘,玩家在顶行排成两排:
public static char[] board = { '+', '+', 'E',
'A', 'S', 'D',
'Z', 'X', 'C' };
以下是确定下一步行动的代码:
private static string checkmate()
{
List<char[]> dalist = new List<char[]>
{
new char[3] { board[3], board[4], board[5] },
new char[3] { board[0], board[4], board[8] },
new char[3] { board[2], board[4], board[6] },
new char[3] { board[1], board[4], board[7] },
new char[3] { board[0], board[1], board[2] },
new char[3] { board[6], board[7], board[8] },
new char[3] { board[0], board[3], board[6] },
new char[3] { board[2], board[5], board[8] }
};
foreach (var item in dalist)
{
if (item.Where(x => x == '+').Count() == 2)
return new string(item.Where(x => x != '+').ToArray());
else if (item.Where(x => x == '-').Count() == 2)
return new string(item.Where(x => x != '-').ToArray());
else if (item.Where(x => x == '+').Count() == 1)
return item.Where(x => x != '+').First().ToString();
else
{
Random random = new Random();
int rList = random.Next(0, 3);
int rPosition = random.Next(0, 2);
return dalist.ElementAt(rList).GetValue(rPosition).ToString();
}
}
return "AA";
}
该方法返回一个字母作为字符串,与棋盘上的移动相对应。
该方法通过在tic-tack-toe中创建8种可能的获胜模式列表来分析棋盘,并根据棋盘上的内容进行测试
逻辑四个组件,它们按照foreach循环中的ifelse条件顺序工作。 对于当前,该方法应返回'E'并在第一个if语句处突破循环。相反,程序遍历整个循环并返回最后的else语句? 为什么不识别第一个if条件的匹配?
循环应循环遍历每个8列表项,直到匹配为止。
1)checkmate
如果有一个可用的
2)如果没有将死的移动,此移动将检查对手是否有一个将死的移动并阻挡路径
3)link two
如果没有一个将死的获胜者或阻止,这将在获胜的路径中放置第二个链接
4)将初始随机放置在四个角之一或中间前两轮
答案 0 :(得分:1)
您需要对所有可能的获取动作执行每个单独的测试。并非每次测试都在第一次获胜时移动,然后是第二次获胜移动的每次测试,等等。因此,如果没有任何循环找到匹配项,请在每次测试中包围一个for循环并保持随机块运行。
答案 1 :(得分:0)
如果我理解正确,你认为第一个if语句应该是true,因此函数应该返回。我猜您认为第一个item
是{'+' ,'+', 'E'}
。
但这是不正确的。第一个item
是{'A', 'S', 'D'}
因为当您创建dalist
时,第一个字符数组是{ board[3], board[4], board[5] }
。
EDIT!
我现在看到你的函数保证在for-each循环的第一次迭代时返回,因为每个执行路径都有一个return语句。所以它永远不会到达{'+' ,'+', 'E'}
的行。