Есть ли формула без if / else / switch /?и т.д., которые могли бы заменить матрицу решения [,] - PullRequest
2 голосов
/ 05 сентября 2010

Есть ли формула без if / else / switch /?и т. д., которые могут заменить матрицу решения [,] и как это повлияет на производительность / эффективность?

     class Program
{
    private static Random r = new Random();
    // names of the "moves"
    private static string[] rps = { "PAPER", "ROCK", "SCISSORS"};
    // result feedback string to be formatted
    private static string[] feedback = { "{1} Beats {0}, You Loose!","{0} Equals {1}, Draw!",  "{0} Beats {1}, You Win!" };
    // solution matrix ( 0 = loose ; 1 = draw ; 2 = win  // array1: for paper; array2: for rock; array3: for scissors; )
    private static int[,] solution = {{1, 2, 0},{0, 1, 2},{2, 0, 1}};

    /// <summary>
    /// Rock Paper scissors solution w/o calculation or if/case/else/
    /// </summary>
    /// <param name="args">dummy.</param>
    static void Main(string[] args)
    {
            // simulate the players move
            int player = r.Next(3);

            // simulate the computers move
            int computer = r.Next(3);

            // retrieve the result from the matrix
            int result = solution[player, computer];

            //write the result of the match
            Console.WriteLine(String.Format("you : {0} vs {1} : computer", rps[player], rps[computer]));
            Console.WriteLine(String.Format(feedback[result], rps[player], rps[computer]));

    }
}

1 Ответ

3 голосов
/ 05 сентября 2010

Да, есть довольно простая формула:

player computer  solution  (c+4-p)%3
  0       0         1          1
  0       1         2          2
  0       2         0          0
  1       0         0          0
  1       1         1          1
  1       2         2          2
  2       0         2          2
  2       1         0          0
  2       2         1          1

Таким образом, вы можете использовать:

int result = (computer + 4 - player) % 3;

Для доступа к массиву и вычисления значения потребуется примерно одно и то же время.Тем не менее, разница в производительности в этом приложении незначительна.Просто запись результата в консоль занимает намного больше времени, чем использование массива или вычисление значения.Конечно, при вычислении значения вам не нужен массив, но, поскольку он настолько мал, что не имеет большого значения.

Учитывайте также удобочитаемость решения.Формула не имеет логической связи с тем, для чего вы ее используете, это всего лишь средство для достижения конкретного результата, поэтому вам понадобится большой комментарий, объясняющий, чего она добивается ...

Редактировать:

Если вы хотите сосредоточиться на удобочитаемости, вы можете поместить логику в отдельный класс:

public class Play {

  public enum Value { Paper = 0, Rock = 1, Scissors = 2 }

  private Value _value;

  public Play(Random rnd) {
    _value = (Value)rnd.Next(3);
  }

  public bool SameAs(Play other) {
    return _value == other._value;
  }

  public bool Beats(Play other) {
    return
      (_value == Value.Paper && other._value == Value.Rock) ||
      (_value == Value.Rock && other._value == Value.Scissors) ||
      (_value == Value.Scissors && other._value == Value.Paper);
  }

  public override string ToString() {
    switch (_value) {
      case Value.Paper: return "PAPER";
      case Value.Rock: return "ROCK";
      default: return "SCISSORS";
    }
  }

}

Теперь логика проясняется:

Random r = new Random();

Play player = new Play(r);
Play computer = new Play(r);

Console.WriteLine("you : {0} vs {1} : computer", player, computer);

string feedback;
if (player.SameAs(computer)) {
  feedback = "{0} Equals {1}, Draw!";
} else if (player.Beats(computer)) {
  feedback = "{0} Beats {1}, You Win!";
} else {
  feedback = "{1} Beats {0}, You Loose!";
}

Console.WriteLine(feedback, player, computer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...