2016-12-14 4 views
0

Итак, я нахожусь на заключительном этапе проекта Noughts and Crosses, и я довольно сильно застрял, я выполнил подпрограмму проверки валидации, а также подпрограмму, которая является исключительно основанный на изменении пробела в поле на «X» или «O», , но мой код, похоже, говорит мне, что какая-то часть моего кода не существует в текущем контексте, и я полностью сбит с толкуNaughts and Crosses (Tic Tac Toe), запрос подпрограммы

код:

namespace ConsoleApplication1 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     string[,] grid = new string[3, 3] {{" "," "," "}, 
              {" "," "," "}, 
              {" "," "," "}}; 
     string board = System.IO.File.ReadAllText("E:\\BoardGame.txt"); 
     Console.WriteLine(board); 
     int player = 0; 
     var XCoordinate = 0; 
     var YCoordinate = 0; 
     int x, y; 
     GetMoveCoordinates(ref XCoordinate, ref YCoordinate); 
     if (player == 0) 
     {     
      grid[XCoordinate, YCoordinate] = " X "; 
      player++; 
     } 
     else 
     { 
      grid[XCoordinate, YCoordinate] = " O "; 
      player--; 
     }    
     UpdateGrid(grid, box); 
     if (player == 1) 
     { 
     } 

    } 


    public static void GetMoveCoordinates(ref int XCoordinate, ref int YCoordinate) 
    { 
     int CommaLocation; 
     bool GameHasBeenWon = false; 
     string CoordinatesInput; 
     string XChar, YChar; 
     while (GameHasBeenWon == false) 
     { 
      try 
      { 
       Console.Write("Enter your coordinates: (x,y) "); 
       CoordinatesInput = Console.ReadLine(); 
       CommaLocation = CoordinatesInput.IndexOf(",".ToString()); 
       XChar = CoordinatesInput.Substring(CommaLocation - 1, CommaLocation); 
       YChar = CoordinatesInput.Substring(CommaLocation + 1); 
       XCoordinate = int.Parse(XChar); 
       YCoordinate = int.Parse(YChar); 
      } 
      catch 
      { 
       Console.WriteLine("Invalid Input- Please Try Again"); 
      } 
     } 
    } 


    public static bool CheckValidMove(int XCoordinate, int YCoordinate, string[,] Board) 
    { 
     if ((XCoordinate >= 1) || (XCoordinate <= 3)) 
     { 
      if ((YCoordinate >= 1) || (YCoordinate <= 3)) 
      { 
       if ((Board[XCoordinate, YCoordinate]) == " ") 
       { 
        return true; 
       } 
       else return false; 
      } 
      else return false; 
     } 
     else return false; 
    } 


    public static void UpdateGrid(string[,] grid, string box) 
    { 
     Console.Clear(); 
     for (int x = 0; x < grid.GetLength(0); x++) 
     { 
      for (int y = 0; y < grid.GetLength(1); y++) 
      { 
       box = box.Replace((x + 1) + "," + (y + 1), grid[y, x]); 
      } 
     } 
     // In the case not required as clearning the console default the cursor back to 0,0, but left in 
     // as an example 
     Console.SetCursorPosition(0, 0); 
     Console.WriteLine(box); 
    } 
} 
} 

Но проблема, которую я, кажется, находится под Main, под, если заявление, где код, кажется, сказать мне, что поле в Обновит e (grid, box), не существует в текущем контексте, но он должен делать в последней подпрограмме? Должен ли я делать это в качестве заявления или я что-то упускаю? Также, если у вас есть какие-то советы о том, как убрать код, я бы с радостью его оценил (да, я добавлю параметры win, но сначала хочу нарисовать символы).

Это то, что сетка выглядит следующим образом:

+---+---+---+ 
| | | | 
+---+---+---+ 
| | | | 
+---+---+---+ 
| | | | 
+---+---+---+ 
+0

Что значит «код, кажется, говорит мне, что ящик, не существует в текущем контексте?" – EJoshuaS

+2

Если я правильно читаю (это может помочь вызвать исключение, которое вы видите более явно), вызов' UpdateGrid (grid, box) 'не выполняется. Это было бы потому, что' box' не существует в методе 'Main' (это один из параметров« UpdateGrid »). –

+0

Да, я думаю, что @AndrewWhitaker здесь правильно (если я правильно читаю вопрос). – EJoshuaS

ответ

0

Есть несколько ошибок здесь. Во-первых, в следующем не будет компилироваться:

UpdateGrid(grid, box); 

Как Эндрю Уитакер указывается в комментариях, нет «коробки» переменной в основной метод (вы никогда не объявляла и не инициализируются его). Определите, что это за переменная, и правильно ее инициализируйте, и она снова скомпилируется.

Далее, быстрое стилистическое примечание на следующее:

while (GameHasBeenWon == false) 

явно не сравнить с истинным и ложным - правильным способом сделать это

while (!GameHasBeenWon) 

Следующей строкой на комментарий on имеет несколько ошибок:

(XCoordinate >= 1) || (XCoordinate <= 3) 

Это означает, что XCoordinate> = 1 ИЛИ это меньше или равно до 3, что совсем не то, что вы имели в виду. На самом деле, по этой логике любое целое число имеет силу, так как оно больше 1, равно 1, меньше 3 или равно 3. (Подумайте об этом - для каких целых чисел такое утверждение может быть ложным?) Кроме того, 3 конкретно не действительный индекс, но 0 is. Имейте в виду, что массивы нулевые индексируются. Таким образом, это должно быть на самом деле

(XCoordinate >= 0) && (XCoordinate < 3) 

С точки зрения ваших если заявления:

if ((Board[XCoordinate, YCoordinate]) == " ") 
      { 
       return true; 
      } 
      else return false; 

возвращает true точно, когда (Board[XCoordinate, YCoordinate]) == " " верно и false точно, когда это утверждение неверно. Вы могли бы просто сделать

return (Board[XCoordinate, YCoordinate]) == " "; 

Фактически вы могли бы сделать это для всего выражения «если». (Я не сижу перед IDE прямо сейчас, поэтому извиняюсь, если мой синтаксис здесь не идеальный).

return ((XCoordinate >= 0) && (XCoordinate < 3) && 
     ((YCoordinate >= 0) && (YCoordinate < 3)) && 
     ((Board[XCoordinate, YCoordinate]) == " "));