如何在c# WinForms中获取玩家的移动

问题描述 投票:0回答:1

我遇到了一个涉及游戏的问题,我需要使用文本框和按钮来获取玩家的移动。这个想法是,当用户在文本框中输入内容并单击按钮时,该值就会被发送到一个“等待”的函数。

请允许我进一步解释:

该游戏是两人游戏。一侧是计算机,另一侧是用户。

*请注意,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 循环不能按我的预期工作,并使程序停止响应:/

那么...我有什么想法可以让这项工作成功吗?

*也对我的英语感到抱歉

c# winforms
1个回答
0
投票
async

函数。具体来说,您需要有一个

async
函数来返回您的移动,因此代码中的问号变得简单:
// instead of: move = ?;
move = await GetPlayerMove();

实现这个助手的方法有很多种,但一种简单的方法是将事件连接到触发玩家移动的任何事物(图像、按钮等),并让它触发 
TaskCompletionSource

,结果你可以返回

GetPlayerMove
助手。
    

© www.soinside.com 2019 - 2024. All rights reserved.