我遇到了一个涉及游戏的问题,我需要使用文本框和按钮来获取玩家的移动。这个想法是,当用户在文本框中输入内容并单击按钮时,该值就会被发送到一个“等待”的函数。
请允许我进一步解释:该游戏是两人游戏。一侧是计算机,另一侧是用户。
*请注意,winner() 是一个函数,它是我游戏的主要算法,无需解释它,因为问题是其他的
public void StartGame()
{
string player;
int cs = 0, ps = 0;
//chooses the first player
if (winer(n, 0) == true)
{
player = "computer";
}
else
{
player = "human";
}
while ( n > 0)
{
int move;
move = 0;
if (player == "computer")
{
lblTurn.Text = "Not Your Turn";
//Computer's move
for (global::System.Int32 i = z; i >= 1; i--)
{
Boolean breakit;
breakit = false;
if (i <= n)
{
if (n % 2 == 1)
{
if (winer(n - i, cs % 2) == false)
{
MessageBox.Show(winer(n - i, cs % 2).ToString());
move = i;
breakit = true;
}
}
else
{
if (cs % 2 == 0)
{
if (winer(n - i, 1) == false)
{
move = i;
breakit = true;
}
}
else
{
if (winer(n - i, 0) == false)
{
move = i;
breakit = true;
}
}
}
}
if (breakit)
{
break;
}
}
lbLog.Items.Add(string.Format($"The Computer takes {move} pebbles."));
cs += move;
lblComputersum.Text = string.Format($"Computer's Sum: {cs}");
}
else if (player == "human")
{
lblTurn.Text = "Your Turn";
// Human's move
if (n <= z)
{
lblMove.Text = "1 to " + n;
}
else
lblMove.Text = "1 to " + z;
//here is the problem:
move = ?;
lbLog.Items.Add(string.Format($"The Player takes {move} pebbles."));
ps += move;
lblPlayerSum.Text = string.Format($"Players's Sum: {ps}");
}
// Update the game state
n = n - move;
ds = false;
// Switch players
if (player == "computer")
{
player = "human";
}
else
{
player = "computer";
}
}
// Determine the winner
if (cs % 2 == 0)
{
lblTurn.Text = "Computer Won!";
}
else
{
lblTurn.Text = "You Won!";
}
MessageBox.Show(cs.ToString());
}
正如你所看到的,当函数到达这一行时
move = ?;
我希望它等待玩家的移动。
我尝试创建一个 GetPlayerMove()函数来获取玩家的移动,其背后的想法是:
Boolean pressed = false;
然后
private void btnSubmit_Click(object sender, EventArgs e)
{
if (pressed== false)
{
pressed = true;
}
}
和
private int GetPlayerMove()
{
while(pressed==false)
{
if(pressed==true)
{
break;
}
}
return int.Parse(txtMove.Text);
}
但问题是 while 循环不能按我的预期工作,并使程序停止响应:/
那么...我有什么想法可以让这项工作成功吗?
*也对我的英语感到抱歉
async
函数。具体来说,您需要有一个
async
函数来返回您的移动,因此代码中的问号变得简单:// instead of: move = ?;
move = await GetPlayerMove();
实现这个助手的方法有很多种,但一种简单的方法是将事件连接到触发玩家移动的任何事物(图像、按钮等),并让它触发
TaskCompletionSource
,结果你可以返回
GetPlayerMove
助手。