2014-11-12 3 views
0

Вот как все выглядит сейчас.tic tac toe Jcreator застрял

И тогда есть детали, которые вы вынуждены добавлять и больше деталей и больше деталей и больше деталей и больше, и все больше и больше, и все больше и больше, и все больше и больше, и все больше и больше

import java.util.Scanner; 

public class Tictactoe { 
    static char[][] MakeMove(char[][] spelplan, char spelare, int rad, int kolumn) { 
     spelplan[rad][kolumn] = spelare; 
     char[][] board = new char[4][4]; 
     System.out.println(spelplan[rad][kolumn]); 
     return spelplan; 
    } 

    static boolean CheckMove(char[][] spelplan, int x, int y) { 
     if (spelplan[x][y] != ' ') { 
      return false; 
     } else { 
      return true; 
     } 
    } 

    static void SkrivUtSpelplan(char[][] spelplan) { 
     System.out.println("-------"); 
     System.out.println("|" + spelplan[1][1] + "|" + spelplan[1][2] + "|" + spelplan[1][3] + "|"); 
     System.out.println("|-+-+-|"); 
     System.out.println("|" + spelplan[2][1] + "|" + spelplan[2][2] + "|" + spelplan[2][3] + "|"); 
     System.out.println("|-+-+-|"); 
     System.out.println("|" + spelplan[3][1] + "|" + spelplan[3][2] + "|" + spelplan[3][3] + "|"); 
     System.out.println("-------"); 
    } 

    static boolean KollaVinst(char[][] spelplan) { 
     return false; 
    } 

    public static void main(String[] args) { 
     char spelplan[][] = new char[4][4]; 
     char spelare; 
     int rad = 3, kolumn = 3, i = 0; 
     for (int x = 1; x < 4; x++) { 
      for (int y = 1; y < 4; y++) { 
       spelplan[x][y] = ' '; 
      } 
     } 

     System.out.println("-------"); 
     System.out.println("| | | |"); 
     System.out.println("|-+-+-|"); 
     System.out.println("| | | |"); 
     System.out.println("|-+-+-|"); 
     System.out.println("| | | |"); 
     System.out.println("-------"); 

     while (KollaVinst(spelplan) == false) { 

      CheckMove(spelplan, rad, kolumn); 

      for (i = 0; i < 9; i++) { 
       if (i % 2 == 0) { 
        spelare = 'X'; 
       } else { 
        spelare = 'O'; 
       } 

       System.out.println("Spelare 1 skriv vilken rad: 1-3"); 
       int x = new Scanner(System.in).nextInt(); 

       System.out.println("Spelare 1 skriv vilken kolumn: 1-3"); 
       int y = new Scanner(System.in).nextInt(); 

       if (CheckMove(spelplan, x, y) == true) { 
        MakeMove(spelplan, spelare, x, y); 
       } 
       System.out.println(" "); 
       SkrivUtSpelplan(spelplan); 
      } 
     } 
    } 
} 
+0

В чем вы застряли? что вы пытаетесь достичь, это не работает? Кроме того, вы можете рассмотреть возможность публикации этого (когда все будет сделано) на codereview.stackoverflow.com для некоторых предложений о том, как улучшить это. Одно из предложений, которое я могу сделать: запустите все ваши имена методов с помощью строчных букв. Классы: uppercaseFirst, методы lowerCaseFirst – Joeblade

ответ

0

Основываясь на том, что вы писали до сих пор (я действительно надеюсь, что для редактирования, что проясняет то, что вы пытаетесь)

Я предполагаю, что вы пытаетесь построить цикл, который не заканчивается, пока плата не будет законченный. , пока он не будет завершен, от игрока требуется переход. этот шаг сделан (если законным). Затем печатается доска.

ваш код имеет ряд вопросов:

  1. CheckMove (spelplan, рад, kolumn) только когда-либо выполняется с радиан = 3, kolumn = 3. Я бы ожидал, что это будет выполнено с использованием пользовательского ввода.
  2. Повторно использовать переменные цикла. (int i = новый сканер), а затем (для i = i). никогда не делайте этого. i = i в любом случае бессмысленно, и вы в конечном итоге делаете i ++, что означает, что вы теряете вход пользователя.
  3. внутри цикла while вы никогда не делаете makeMove (spelplan, i, j). Я ожидаю, что это произойдет, прежде чем распечатать доску.
  4. Циклы for (i и j) не кажутся полезными. Ваш метод skrivutSpelPlan уже печатает плату, и ее нужно только один раз вызвать. вы не используете переменные цикла i или j.

Я борюсь с желанием выписать предложения/код, поскольку вы указали, что не хотите этого. В псевдокоде, вы хотите, чтобы ваш цикл построен как:

while (!isBoardSolved) { 
    (x,y) = getUserInput(); // this is not java :D don't use it 
    if (isLegalMove(x,y)) { 
     makeMove(x,y); 
    } else { 
     reportError(); 
    } 
    printBoard(); 
} 

в вашем методе printBoard, вы должны цикла. вы в настоящее время имеете hardcoded [0] [1] и т. д., используйте forloop для строки и forloop для col.

Ваш контрольно-пропускной пункт не проверяет плату. он проверяет, что плата [x] [y]! = board [x] [y], которая никогда не верна. (хорошо хорошо технически в многопоточной среде, это может быть правдой, если состояние расы происходит и доступно) Вы должны думать, что делает checkMove.

MakeMove в порядке, за исключением того, что вам не нужно возвращать новое игровое поле. если вы

char[][] board = new char[4][4]; 
MakeMove(board, 'a', x, y); 
System.out.println(board[x][y]); // should print 'a' unless x or y were out of bounds. 

тогда плата обновляется и печатается.

ОК Я стараюсь не испортить ваше удовольствие, просто давая указатели. Пожалуйста, уточните вопрос с подробной информацией о вашей проблеме. где вы застреваете, что вам нужно.

Когда у вас есть эта работа, я рекомендую опубликовать ее до https://codereview.stackexchange.com/ и получить дополнительную информацию о хорошем стиле и практике кодирования.

испытать диагоналей, вы можете использовать:

// y = row number, so y = y + 1 means the row below y 
// x = column number. so x = x + 1 means the column to the right of x 
public boolean isSolved(char[][] board) { 
    // check horizontal rows 
    return isHorizontalSolved(board) || isVerticalSolved(board) || isDiagonalSolved(board); 
} 

public boolean isHorizontalSolved(board) { 
    for (int y = 0; y < board.length; ++y) { 
     // for each row, test if all columns are the same 
     boolean solved = true; 
     char first = board[y][0]; 
     for (int x = 0; x < boards[y].length; ++x) { 
      if (boards[y][x] == ' ' || first != boards[y][x]) { 
       // if an element is not filled in, this row is not solved 
       // if an element in this row is different than any other element, this row is not solved 
       solved = false;   
      } 
     } 
     if (solved == true) { 
      return true; 
     } 
    } 
    return false; 
} 

// check vertical rows 
// leaving this for your own imagination 

// check diagonals 
public boolean isDiagonalSolved(char[][] board) { 
    // check topLeft to bottomRight: 
    char first = board[0][0]; 
    boolean solved = true; 
    for (int y = 0, x = 0; y < board.length && x < board[y].length; ++y, ++x) { 
     if (board[y][x] == ' ' || first != board[y][x]) { 
      // if field is empty or the fields are not all equal to one another 
      solved = false; 
     } 
    } 
    if (solved) { 
     return true; 
    } 

    int topRightX = board[0].length - 1; 
    solved = true; 
    first = board[0][topRightX]; 
    for (int y = 0, x = topRightX; y < board.length && x >= 0; ++y, --x) { 
     if (board[y][x] == ' ' || first != board[y][x]) { 
      // if field is empty or the fields are not all equal to one another 
      solved = false; 
     } 
    } 
    if (solved) { 
     return true; 
    } 

} 

Не могу обещать, что это ошибка меньше, но это примерно то, что я буду делать. для диагоналей, поперечный ход до нижнего правого (0,0) (1,1) (2,2) и вертикальный до нижнего левого угла (0, 2), (1,1) (2,0)

с игровое поле 3 * 3, вы можете жестко записать это, но я привык использовать циклы.

+0

Im сделано почти со всеми теперь, но у меня проблемы с проверкой победителя – Marc

+0

Хорошо ... Я бы предположил, чтобы проверить, выиграл ли кто-либо или есть галстук, вы идете по игровой площадке горизонтально, вертикально и по диагонали и проверьте, есть ли 3 хода одного и того же игрока подряд. горизонтально, вы храните x одинаково, перебираете y. вертикально держите y в одном цикле над x. для диагоналей, x, y = 0, x ++ и y ++. другая диагональ: x = 2; y = 0; Икс--; у ++; если доска одинаковая, 3 раза, у вас есть победитель. – Joeblade

+0

Альтернативой этому является проверка победителя, когда определенный пользователь совершил переход. (переключение между a и b я предполагаю). Если правление «выиграно» после того, как текущий игрок сделал ход, то текущий игрок станет победителем. проверить галстук: при проверке, если никто не выиграл, но вы не найдете никаких пустых полей, это галстук – Joeblade