【发布时间】:2016-01-13 23:27:27
【问题描述】:
我有一个很奇怪的问题。我正在使用递归方法,它应该在 6 个玩家(5 个机器人和 1 个玩家)中旋转,但是一旦它到达 bot 5(这是最后一个)它就不会这样做,它会跳过玩家的回合并继续到机器人 1 、机器人 2 、机器人 3 、机器人 4 、机器人 5 ,然后轮到玩家轮到它,换句话说,它跳过了玩家轮到的一个。我将在此处原始粘贴代码,如果有不清楚的地方在 cmets 中解释。
private async Task Turns()
{
turns = ReturnTurns();
GC.KeepAlive(Updates);
if (!PFturn && Chips > 0)
{
if (Pturn)
{
call -= PreviousCalls.PreviousPlayerCall;
pbTimer.Visible = true;
pbTimer.Value = 1000;
t = 60;
up = int.MaxValue;
Timer.Start();
bRaise.Enabled = true;
bCall.Enabled = true;
bRaise.Enabled = true;
bRaise.Enabled = true;
bFold.Enabled = true;
turnCount++;
B1turn = true;
}
}
if (PFturn || !Pturn || Chips <= 0)
{
if (pStatus.Text.Contains("Fold"))
{
B1turn = true;
}
if (!Pturn)
{
await Flip(0);
}
pbTimer.Visible = false;
bRaise.Enabled = false;
bCall.Enabled = false;
bRaise.Enabled = false;
bRaise.Enabled = false;
bFold.Enabled = false;
Timer.Stop();
if (!B1Fturn && B1turn)
{
int previous = PreviousCalls.PreviousBot1Call;
call -= PreviousCalls.PreviousBot1Call;
if (Properties.Settings.Default.ThinkCheck)
{
AutoCloseMsb.Show("Bot 1 Turn", "Turns", ThinkTime);
}
Combinations(2, 3, ref b1Type, ref b1Power, b1Status);
Ai(2, 3, ref bot1Chips, ref B1turn, ref B1Fturn, b1Status, b1Power, b1Type, ref previous);
await CheckTextBoxes();
B1turn = false;
turnCount++;
B2turn = true;
PreviousCalls.PreviousBot1Call = previous;
}
if (B1Fturn)
{
turns = ReturnTurns();
B2turn = true;
}
await Flip(1);
if (!B2Fturn && B2turn)
{
int previous = PreviousCalls.PreviousBot2Call;
call -= PreviousCalls.PreviousBot2Call;
Combinations(4, 5, ref b2Type, ref b2Power, b2Status);
if (Properties.Settings.Default.ThinkCheck)
{
AutoCloseMsb.Show("Bot 2 Turn", "Turns", ThinkTime);
}
Ai(4, 5, ref bot2Chips, ref B2turn, ref B2Fturn, b2Status, b2Power, b2Type, ref previous);
await CheckTextBoxes();
B2turn = false;
turnCount++;
B3turn = true;
PreviousCalls.PreviousBot2Call = previous;
}
B3turn = true;
if (B2Fturn)
{
turns = ReturnTurns();
B3turn = true;
}
await Flip(2);
if (!B3Fturn && B3turn)
{
int previous = PreviousCalls.PreviousBot3Call;
call -= PreviousCalls.PreviousBot3Call;
Combinations(6, 7, ref b3Type, ref b3Power, b3Status);
if (Properties.Settings.Default.ThinkCheck)
{
AutoCloseMsb.Show("Bot 3 Turn", "Turns", ThinkTime);
}
Ai(6, 7, ref bot3Chips, ref B3turn, ref B3Fturn, b3Status, b3Power, b3Type, ref previous);
await CheckTextBoxes();
B3turn = false;
turnCount++;
B4turn = true;
PreviousCalls.PreviousBot3Call = previous;
}
if (B3Fturn)
{
turns = ReturnTurns();
B4turn = true;
}
await Flip(3);
if (!B4Fturn && B4turn)
{
int previous = PreviousCalls.PreviousBot4Call;
call -= PreviousCalls.PreviousBot4Call;
Combinations(8, 9, ref b4Type, ref b4Power, b4Status);
if (Properties.Settings.Default.ThinkCheck)
{
AutoCloseMsb.Show("Bot 4 Turn", "Turns", ThinkTime);
}
Ai(8, 9, ref bot4Chips, ref B4turn, ref B4Fturn, b4Status, b4Power, b4Type, ref previous);
await CheckTextBoxes();
B4turn = false;
turnCount++;
B5turn = true;
PreviousCalls.PreviousBot4Call = previous;
}
if (B4Fturn)
{
turns = ReturnTurns();
B5turn = true;
}
await Flip(4);
if (!B5Fturn && B5turn)
{
int previous = PreviousCalls.PreviousBot5Call;
call -= PreviousCalls.PreviousBot5Call;
Combinations(10, 11, ref b5Type, ref b5Power, b5Status);
if (Properties.Settings.Default.ThinkCheck)
{
AutoCloseMsb.Show("Bot 5 Turn", "Turns", ThinkTime);
}
Ai(10, 11, ref bot5Chips, ref B5turn, ref B5Fturn, b5Status, b5Power, b5Type, ref previous);
await CheckTextBoxes();
B5turn = false;
turnCount++;
Pturn = true;
PreviousCalls.PreviousBot5Call = previous;
}
if (B5Fturn)
{
turns = ReturnTurns();
Pturn = true;
}
await Flip(5);
if (!restart)
{
await Turns();
}
}
}
【问题讨论】:
-
这有意义吗?如何将递归用于“循环” - 你肯定会在某个时候溢出堆栈......?你不想要一个状态机(或者只是一个循环?)
-
您应该努力制作minimal reproducible example 在此处发帖。这段代码充满了看起来对解决具体问题无关紧要的信息,制作mvce的过程甚至可以帮助你自己找出问题所在。
-
我在
await Turns()行放置了一个断点,一旦到达它,它会向下移动 3 行,然后返回到 if (PFturn || !Pturn || Chips -
我需要一些能在 6 名玩家之间循环直到完成某些声明的东西
-
怎么样...一个循环?不要试图变得聪明或任何东西,但你只是说“我需要一些可以循环的东西”。一个非常简单的状态机可以工作(只需保持当前状态“player,bot1,bot2,bot3,bot4..etc”)并采取相应的行动。它看起来像纸牌游戏,纸牌游戏规则很容易编写,因为它们通常非常有限