繁体   English   中英

if/else 语句返回假,即使条件应该为真。 (C#)

[英]If/else statement is returning false, even though the condition should be true. (C#)

我目前正在尝试用 C# 构建一个井字游戏。 现在,我已经完成了整个游戏的大部分设置。 以下是截至 rn 我的项目的完整代码:

// Main code.
Game newGame = new();
newGame.RunGame();


// Classes
internal class Game
{
    private Player[] Players;
    private Updater GameUpdater;
    private Board GameBoard;

    public Game()
    {
        Players = new Player[2] { new(PlayerSymbol.X), new(PlayerSymbol.O) };
        GameUpdater = new();
        GameBoard = new();
    }

    public void RunGame()
    {
        while (true)
        {
            GameBoard.DisplayBoard();
            int currentPlayer = GameUpdater.SendPlayerTurnInfo();
            int playerInput = Players[currentPlayer].GetUserInput(); // The position the player wants to place their X/O
            bool playerInputtedValidNumber = GameUpdater.VerifyUserHasInputValidNumber(playerInput);

            if (playerInputtedValidNumber)
            {
                bool playerInputtedUnusedNumber = GameUpdater.VerifyUserHasInputUnusedSpot(GameBoard.SendBoardPiecesData(--playerInput));

                if (playerInputtedUnusedNumber)
                {
                    PlayerSymbol currentPlayerSymbol = Players[currentPlayer].SendPlayerSymbol(); // The symbol of the current player.
                    GameBoard.UpdateBoardPiecesData(playerInput, currentPlayerSymbol);
                }
                else
                {
                    Console.WriteLine("This position has already been used!");
                    continue;
                }
            }
            else
            {
                Console.WriteLine("Inputted an invalid position!");
                continue;
            }
        }
    }
}

internal class Board
{
    private string[]? BoardPieces;
    private string? BoardDisplay;

    public Board()
    {
        BoardPieces = new string[9] { " ", " ", " ", " ", " ", " ", " ", " ", " " };
        BoardDisplay = $" {BoardPieces[0]} | {BoardPieces[1]} | {BoardPieces[2]} \n---+---+---\n {BoardPieces[3]} | {BoardPieces[4]} | {BoardPieces[5]} \n---+---+---\n {BoardPieces[6]} | {BoardPieces[7]} | {BoardPieces[8]} ";
    }

    public void DisplayBoard()
    {
        Console.WriteLine(BoardDisplay);
    }

    public string SendBoardPiecesData(int userInput)
    {
        return BoardPieces[userInput]; // No issue with null since the number will be automatically checked for null beforehand.
    }

    public void UpdateBoardPiecesData(int userInput, PlayerSymbol playerSymbol)
    {
        BoardPieces[userInput] = $"{playerSymbol}";
        BoardDisplay = $" {BoardPieces[0]} | {BoardPieces[1]} | {BoardPieces[2]} \n---+---+---\n {BoardPieces[3]} | {BoardPieces[4]} | {BoardPieces[5]} \n---+---+---\n {BoardPieces[6]} | {BoardPieces[7]} | {BoardPieces[8]} ";
    }
 }

internal class Updater
{
    private int PlayerIndicator;

    public Updater()
    {
        PlayerIndicator = 1;
    }

    public int SendPlayerTurnInfo()
    {
        if (PlayerIndicator == 1)
        {
            PlayerIndicator = 0;
            return PlayerIndicator;
        } else
        {
            PlayerIndicator = 1;
            return PlayerIndicator;
        }
    }

    public bool VerifyUserHasInputValidNumber(int userInput)
    {
        Console.WriteLine(userInput);
        if (userInput >= 0 || userInput <= 10)
        {
            return false;
        } else
        {
            return true;
        }
    }

    public bool VerifyUserHasInputUnusedSpot(string userInput)
    {
        if (userInput == "X" || userInput == "O") return false;
        else return true;
    }
}

internal class Player
{
    private PlayerSymbol PlayerSymbol;

    public Player(PlayerSymbol playerSymbol)
    {
        PlayerSymbol = playerSymbol;
    }

    public int GetUserInput()
    {
        Console.Write($"It is currently {PlayerSymbol}'s turn. Which position would you like to play at? ");
        string? input = Console.ReadLine();
        bool isNumerical = int.TryParse(input, out int _);

        while (!isNumerical)
        {
            Console.Write("Invalid input, please input a number. ");
            input = Console.ReadLine();
            isNumerical = int.TryParse(input, out int _);
        }

        return int.Parse(input);
    }

    public PlayerSymbol SendPlayerSymbol()
    {
        return PlayerSymbol;
    }
}


// Enumerations
enum PlayerSymbol
{
    X,
    O
}

现在,这段代码的主要问题将在 Updater 类中。

我有一个 VerifyUserHasInputValidNumber(int userInput) 方法,接收玩家输入的数字,并根据它是否适合 1-9 之间的值范围返回真或假。

public bool VerifyUserHasInputValidNumber(int userInput)
    {
        if (userInput >= 0 || userInput <= 10)
        {
            return false;
        } else
        {
            return true;
        }
    }

尽管出于某种原因,即使我可以确认 userInput 参数输入正确(方法第一行中的 Console.WriteLine),它仍然会产生错误并告诉用户他们输入了无效位置。

public void RunGame()
    {
        while (true)
        {
            GameBoard.DisplayBoard();
            int currentPlayer = GameUpdater.SendPlayerTurnInfo();
            int playerInput = Players[currentPlayer].GetUserInput(); // THIS IS THE NUMBER THAT'S BEING INPUTTED INTO THE METHOD THAT I'M HAVING AN ISSUE WITH (the VerifyUserHasInputValidNumber(playerInput); method)
            bool playerInputtedValidNumber = GameUpdater.VerifyUserHasInputValidNumber(playerInput); // Should be true if I input any number between 1-9.

            if (playerInputtedValidNumber) 
            {
                bool playerInputtedUnusedNumber = GameUpdater.VerifyUserHasInputUnusedSpot(GameBoard.SendBoardPiecesData(--playerInput));

                if (playerInputtedUnusedNumber)
                {
                    PlayerSymbol currentPlayerSymbol = Players[currentPlayer].SendPlayerSymbol(); // The symbol of the current player.
                    GameBoard.UpdateBoardPiecesData(playerInput, currentPlayerSymbol);
                }
                else
                {
                    Console.WriteLine("This position has already been used!");
                    continue;
                }
            }
            else
            {
                Console.WriteLine("Inputted an invalid position!"); // THIS, however, is what is being logged into the console.
                continue;
            }
        }
    }

我不知道这是否可能是内存泄漏问题,或者我可能有某种不正确的格式,但如果我能在这个问题上得到任何帮助,我将不胜感激。

这个测试

  if (userInput >= 0 || userInput <= 10)

总是正确的。 你认为什么值会是假的?

我假设你想要

 if (userInput >= 0 && userInput <= 10)
      return true;
 else return false;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM