Ошибка: не указан аргумент, соответствующий обязательному параметру player1 в GameManager.GameManager(IPlayer, IPlayer)»C#

Место общения программистов C#
Anonymous
Ошибка: не указан аргумент, соответствующий обязательному параметру player1 в GameManager.GameManager(IPlayer, IPlayer)»

Сообщение Anonymous »

Я работаю над игрой «Камень, ножницы, бумага» на C#, используя внедрение зависимостей. Я определил интерфейс [/b] и два класса

Код: Выделить всё

HumanPlayer
[/b] и

Код: Выделить всё

ComputerPlayer
[/b], реализующие этот интерфейс. Однако я столкнулся с ошибкой при попытке создать экземпляр .

Код: Выделить всё

GameManager
[/b] класс.
Сообщение об ошибке:

Код: Выделить всё

There is no argument given that corresponds to the required parameter 'player1' of 'GameManager.GameManager(IPlayer, IPlayer)'
  • Интерфейс IPlayer:

    Код: Выделить всё

    namespace DependencyInjection
    {
    public interface IPlayer
    {
    GameManager.Choice GetChoice();
    }
    }
    
    
  • Класс HumanPlayer (в отдельном файле):

    Код: Выделить всё

    namespace DependencyInjection
    {
    public class HumanPlayer : IPlayer
    {
    public GameManager.Choice GetChoice()
    {
    GameManager.Choice p1;
    do
    {
    Console.Write("Enter Choice: (R)ock, (P)aper, (S)cissors: ");
    string input = Console.ReadLine().ToUpper();
    if (input == "R")
    {
    p1 = GameManager.Choice.Rock;
    break;
    }
    else if (input == "S")
    {
    p1 = GameManager.Choice.Scissors;
    break;
    }
    else if (input == "P")
    {
    p1 = GameManager.Choice.Paper;
    break;
    }
    else
    {
    Console.WriteLine("Invalid choice, try again!");
    }
    } while (true);
    
    Console.WriteLine($"Player 1 picked {p1.ToString()}");
    return p1;
    }
    }
    }
    
    
  • Класс ComputerPlayer (в отдельном файле):

    Код: Выделить всё

    namespace DependencyInjection
    {
    public class ComputerPlayer : IPlayer
    {
    private Random _rng = new Random();
    
    public GameManager.Choice GetChoice()
    {
    int randomChoice = _rng.Next(0, 3);
    return (GameManager.Choice)randomChoice;
    }
    }
    }
    
    
  • Класс GameManager:

    Код: Выделить всё

    namespace DependencyInjection
    {
    public class GameManager
    {
    private IPlayer _player1;
    private IPlayer _player2;
    
    public GameManager(IPlayer player1, IPlayer player2)
    {
    _player1 = player1;
    _player2 = player2;
    }
    
    public RoundResult PlayRound()
    {
    Choice p1 = _player1.GetChoice();
    Choice p2 = _player2.GetChoice();
    
    if (p1 == p2)
    {
    return RoundResult.Draw;
    }
    if ((p1 == Choice.Rock && p2 == Choice.Scissors) ||
    (p1 == Choice.Paper && p2 == Choice.Rock) ||
    (p1 == Choice.Scissors && p2 == Choice.Paper))
    {
    return RoundResult.Player1Win;
    }
    
    return RoundResult.Player2Win;
    }
    
    public enum Choice
    {
    Rock,
    Paper,
    Scissors
    }
    
    public enum RoundResult
    {
    Player1Win,
    Player2Win,
    Draw
    }
    }
    }
    
    
  • Program.cs:

    Код: Выделить всё

    using DependencyInjection;
    using static DependencyInjection.GameManager;
    
    GameManager gm = new GameManager(new HumanPlayer(), new ComputerPlayer());
    
    do
    {
    RoundResult result = gm.PlayRound();
    
    if (result == RoundResult.Player1Win)
    {
    Console.WriteLine("Player 1 Wins");
    }
    else if (result == RoundResult.Player2Win)
    {
    Console.WriteLine("Player 2 Wins");
    }
    else
    {
    Console.WriteLine("It's a draw!");
    }
    
    Console.WriteLine("Do you want to play again? (Y/N):");
    } while (Console.ReadLine().ToUpper() == "Y");
    
    
Я определил интерфейс [/b] и создал два класса,

Код: Выделить всё

HumanPlayer
[/b] и

Код: Выделить всё

ComputerPlayer
[/b], реализующие этот интерфейс. Затем я создал

Код: Выделить всё

GameManager
[/b] класс, требующий двух [/b] в качестве параметров конструктора. В моем

Код: Выделить всё

Program.cs
[/b], я создал экземпляр

Код: Выделить всё

GameManager
[/b] с

Код: Выделить всё

new HumanPlayer()
[/b] и

Код: Выделить всё

new ComputerPlayer()
[/b].

Подробнее здесь: https://stackoverflow.com/questions/791 ... player1-of

Вернуться в «C#»