Как правило, такие проблемы решаются путем создания машины состояний, то есть того, что знает, в каком состоянии находится игра, и в зависимости от этого состояния обрабатывает следующий ввод. Существует несколько способов программирования конечных автоматов, но один из них - использовать async / await, чтобы компилятор мог это сделать.
Вы можете заключить кнопку в классе, который выполняет задачу при каждом нажатии кнопки:
public class ButtonAwaiter
{
private readonly Button button;
private TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
public ButtonAwaiter(Button button)
{
this.button = button;
this.button.Click += OnClick;
}
private void OnClick(object sender, EventArgs e)
{
tcs.SetResult(true);
tcs = new TaskCompletionSource<bool>();
}
public Task GetTask() => tcs.Task;
}
Замените 'bool' на то, что представляет кнопка.
И ждите, когда первая из кнопок нажата, как:
public async Task DoGameLoop()
{
var b1 = new ButtonAwaiter(button1);
var b2 = new ButtonAwaiter(button2);
while (GameIsInProgress)
{
var pressed = await Task.WhenAny(new[] {b1.GetTask(), b2.GetTask()});
}
}
Этот метод особенно приятно, когда пользователю нужно выполнить некоторую последовательность действий, поскольку он позволяет писать код достаточно простым способом.