#c# #winforms
Вопрос:
Я пытаюсь сделать игру XOX.
Я хотел создать функцию вместо того, чтобы писать код для каждой кнопки отдельно. Я хочу, чтобы он возвращался X
при первом вызове и O
при втором вызове.
Я попробовал это:
string player = "X";
private void changePlayer()
{
XO.Text = player;
if (player == "X")
{
player = "O";
}
if (player == "O")
{
player = "X";
}
}
Комментарии:
1.
player = player == "X" ? "O" : "X"; XO.Text = player;
— Вы должны показать, когда звонитеChangePlayer()
, и указать, какая у вас там проблема.2. если «X», то будет написано «O».
3. «Я попробовал это», и что вам не понравилось в результате? Вы спрашивали резиновую утку ?
Ответ №1:
Вот еще один способ сделать то же самое:
int value = 1;
private void changePlayer(){
if (value == 1) {
XO.Text = "X";
} else {
XO.Text = "O";
}
value *= -1;
}
Комментарии:
1. Разве это не было бы значением *= -1?
2. Да, это опечатка.
Ответ №2:
Я бы хотел сделать что-нибудь столь же простое, как это:
private string CurrentPlayer { get; set; } = "X";
private string ChangePlayer() =>
this.CurrentPlayer = this.CurrentPlayer == "X" ? "O" : "X";
Этот код:
Console.WriteLine(this.CurrentPlayer);
Console.WriteLine(this.ChangePlayer());
Console.WriteLine(this.ChangePlayer());
Console.WriteLine(this.ChangePlayer());
Console.WriteLine(this.ChangePlayer());
Console.WriteLine(this.CurrentPlayer);
…результаты:
X
O
X
O
X
X
Изменение ChangePlayer
с void
на string
позволяет более функционально использовать код. Это позволяет использовать его встроенным, а не для двух вызовов, чтобы получить текущий плеер.
Кроме того, я изменил регистр метода, чтобы он соответствовал стандартам C#.
Честно говоря, я бы, вероятно, пошел на это, чтобы избежать любых возможных плохих значений для игрока.
private Player CurrentPlayer { get; set; } = Player.X;
private Player ChangePlayer() =>
this.CurrentPlayer = this.CurrentPlayer == Player.X ? Player.O : Player.X;
public enum Player { X, O }
Ответ №3:
Единственное, что не так с вашим кодом, это то, что в нем отсутствует else
перед вторым if
Значение равно X, и первое if
значение истинно, поэтому оно превращает X в O. Затем if
проверяется второй, и это теперь верно (когда метод был запущен, этого не было, но действия, выполненные первым if
, сделали его верным), поэтому он немедленно снова превращает O в X.
Два «если» подряд с «противоположными» условиями не обязательно совпадают с «если/иначе»
Ответ №4:
Я попробовал это, и это сработало
int counter = 0;
private void changePlayer()
{
if (counter % 2 == 0)
{
player = "O";
}
else
{
player = "X";
}
counter = 1;
XO.Text = player;
}