2015-03-11 4 views
-2

Вот что мне было поручено сделать для этого кода: базовая реализация простого массива Sudoku. Основная реализация будет иметь представление головоломки Sudoku и способ для пользователя вставить значение, удалить значение, проверить значение для достоверности с текущими данными вдоль строки, столбца и внутри поля и напечатать «массив», с указанными значениями. Функция печати должна указывать, какие значения недействительны с текущими данными, но не обязательно отображать сетку (т. Е. Это может быть только горизонтальный список элементов массива). Элементы массива должны быть пронумерованы таким образом, чтобы верхний левый элемент был arrayname [0,0], верхний правый элемент - arrayname [0,8], нижний левый элемент - arrayname [8,0], а нижний правый - arrayname [ 8,8].Sudoku Game in Java

Возможны следующие методы: Два конструктора - один, который инициализирует полностью пустую сетку, а другой, который инициализирует сетку значениями, показанными выше, по требуемым функциям.

  • public void printMySudoku() - печатают текущие значения массива Sudoku, в том числе пустых мест
  • public boolean insertVal(int r, int c, int val) - возвращает истину, если в состоянии вставить значение, указанное в Вале в массив Sudoku в месте, обозначенное г - строки и с - столбец и вставляет его.
  • public boolean removeVal(int r, int c, int val) - возвращает true, если удаляет значение, указанное в val в массиве Sudoku, в местоположении, указанном r-строкой и c-столбцом, и удаляет его.
  • private boolean checkRow(int r, int c, int val) - возвращает true, если вставить значение val в местоположении, указанном r-строкой и c-столбцом, вдоль этой строки.
  • private boolean checkCol(int r, int c, int val) - возвращает true, если вставить значение val в месте, обозначенном r-row и c-column, вдоль этой COLUMN.
  • private boolean checkBox(int r, int c, int val) - возвращает true, если вставить значение val в месте, указанном r-строкой и c-столбцом внутри этой BOX.

Единственное, что у меня осталось сделать, это создать чек, который печатает заявление, если пользователь вставляет строку, столбец или значение 9 или над. Я несколько раз пытался это сделать, но провалился. Я немного туманна о том, куда его поместить, и нужна помощь в кодировании чека. Я выполнил все свое задание, и это мой личный код. Мне просто нужна помощь с контрольной частью.

Вот мой код, как сейчас (без проверки в нем):

public class Sudoku { 
    public int[][] grid; 

    Sudoku(){ 
     grid = new int[9][9]; //empty 
    } 

    Sudoku(String start){ 
     grid = new int[9][9]; 
     for(int x = 0; x <9; x++){ 
      for(int y =0; y<9; y++){ 
       grid[x][y] = 0; 
      } 
     } 

     grid[0][0] = 5; //top left most 
     grid[0][1] = 3; 
     grid[0][4] = 7; 
     grid[1][0] = 6; 
     grid[1][3] = 1; 
     grid[1][4] = 9; 
     grid[1][5] = 5; 
     grid[2][1] = 9; 
     grid[2][2] = 8; 
     grid[2][7] = 6; 
     grid[3][0] = 8; 
     grid[3][4] = 6; 
     grid[3][8] = 3; 
     grid[4][0] = 4; 
     grid[4][3] = 8; 
     grid[4][5] = 3; 
     grid[4][8] = 1; 
     grid[5][0] = 7; 
     grid[5][4] = 2; 
     grid[5][8] = 6; 
     grid[6][1] = 6; 
     grid[6][6] = 2; 
     grid[6][7] = 8; 
     grid[7][3] = 4; 
     grid[7][4] = 1; 
     grid[7][5] = 9; 
     grid[7][8] = 5; 
     grid[8][4] = 8; 
     grid[8][7] = 7; 
     grid[8][8] = 9; //bottom right most 

    } 

    public void printMySudoku(){ 
     for (int i = 0; i < 9; ++i) { 
      if (i % 3 == 0) 
       System.out.println(" -----------------------"); 
      for (int j = 0; j < 9; ++j) { 
       if (j % 3 == 0) System.out.print("| "); 
       System.out.print(grid[i][j] == 0 
         ? " " 
           : Integer.toString(grid[i][j])); 

       System.out.print(' '); 
      } 
      System.out.println("|"); 
     } 
     System.out.println(" -----------------------"); 
    } 

    public boolean insertVal(int row, int col, int myVal){ 
     System.out.println("Entered insertVal " + "row " + row + "  column " + col + " myVal " + myVal); 
     if(checkRow(row, col, myVal) == false) 
      return false; 

     if(checkCol(row, col, myVal) == false) 
      return false; 

     if(checkBox(row, col, myVal) == false) 
      return false; 

     grid[row][col] = myVal; 


     return true; 

    } 

    public boolean removeVal(int row, int col, int myVal) { 
     grid[row][col] = 0; 

     return true; 
    } 

    private boolean checkRow(int row, int col, int myVal) { 
     for (int a = 0; a < 9; ++a) // row 
      if (myVal == grid[row][a]){ 
       System.out.println(myVal + " Already in Row: " + row); 
       return false; 
      } 
     return true; 

    } 
    private boolean checkCol(int row, int col, int myVal) { 
     for (int b = 0; b < 9; ++b) // column 
      if (myVal == grid[b][col]){ 
       System.out.println(myVal + " Already in Column: " + col); 
       return false; 
      } 
     return true; 

    } 

    private boolean checkBox(int row, int col, int myVal) { 
     int boxRowOffset = (row/3)*3; 
     int boxColOffset = (col/3)*3; 
     for (int c = 0; c < 3; ++c) // box 
      for (int d = 0; d < 3; ++d) 
       if (myVal == grid[boxRowOffset+c][boxColOffset+d]){ 
        System.out.println(myVal + " Already in Box "); 
        return false; 
       } 
     return true; 

    } 
} 

Вот мой тестер:

import java.util.Scanner; 
    public class Play { 


    public static void main(String args[]){ 

     Sudoku i = new Sudoku("start"); 
     i.printMySudoku(); 
     Scanner guess = new Scanner(System.in); 

     int row, col, val; 
     String action; 

     while(true){ 
      System.out.println("Enter I for insert or R for remove: "); 
      action = guess.next(); 

      System.out.println("Row: "); 
      row = guess.nextInt(); 
      System.out.println("Column: "); 
      col = guess.nextInt(); 
      System.out.println("Value: "); 
      val = guess.nextInt(); 

      if(action.equals("I")){ 
       if(i.insertVal(row, col, val)){ 
        System.out.println("Good Job "); 
       } 
       else System.out.println("Try Again "); 
       i.printMySudoku(); 
      } 
      else{ i.removeVal(row, col, val); 
      i.printMySudoku();} 
     } 
    } 
} 

ответ

0

Быстрое решение:

int temp = 0; 

// first, assign the guess to a temporary variable 
if ((temp = guess.nextInt()) > 9) { // is this out of range? 
    System.out.println("You can't do that, it's too big"); 
} else { 
    // assign whichever one you're assigning, row/col/val to temp 
} 

I s Используйте один из этих блоков для каждого задания.

0

Я предлагаю вам включить конкретный способ сделать проверку:

private static int validate(int value) 
{ 
    int validated; 
    if (value<1 || value>9) 
    { 
     validated=-1; 
     System.err.println("Error: Parameter must be between 1 and 9"); 
    } 
    else 
    { 
     validated=value; 
    } 
    return validated; 
} 

...а затем использовать его для проверки всех параметров чтения из сканера, таким образом:

do 
{ 
    System.out.println("Row: "); 
    row = validate(guess.nextInt()); 
} 
while (row<0); 

... то же самое с параметрами седловине и значением (вы можете использовать один и тот же метод проверки для всех их).