Я хочу создать функцию. Я хочу, чтобы он возвращал «X» при первом вызове и «O» при втором вызове

#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;
    }