2016-01-08 4 views
1

Я строю игру в Судоку. Я пришел сюда, чтобы получить помощь, потому что я полностью застрял в своем коде. Я не прошу вас закончить мой код, я знаю, что это не ваша работа. Всего несколько советов, как что делать дальше, было бы здорово!Является ли этот метод MVC хорошим способом программирования игры в судоку?

Я использую MVC и Swing Components для GUI, чтобы сделать код светлее. Я разделил каждое поле и метод, чтобы понять, что делать дальше, но я в замешательстве. Я особенно возникают проблемы с пониманием, как сделать следующие методы:

  • initializeGrid

  • chooseGameDifficulty

  • makeMove

  • cancelMove

Модель

public class GameSudokuModel { 



    // states -- fields 
    Scanner userInput = new Scanner (System.in); // accept user input 

    // int levelDifficulty = 0; // level of difficulties 

    int [] gridSize ; // Sudoku 9x9 == 81 cells -- used to initialize grid or solve puzzle -- 

    int [] subGridSize ; // a sub-grid = 9 cells 

    int gameMove = 0; // calculate the total number of moves per game // ++makeMove and --cancelMove 
    int [] gameCell = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // a cell contain a list of choices numbers 1-9 

    int currentGameTime = 0; // calculates the total time to complete a puzzle 

    String currentPlayerName = userInput.nextLine(); // player name 
    // end of fields 





    //behaviors -- methods 

    /****************************************************** 
    * 
    * Method calculateGameTime (initialiserGrille) 
    * 
    * 
    * Calculates time 
    * 
    * The stopwatch starts when the player makes ​​his first move 
    * 
    * 
    * 
    ******************************************************/ 



    public class calculateGameTime{ 

} 





    /****************************************************** 
    * 
    * Method initializeGrid (initialiserGrille) 
    * 
    * 
    * Used to initialize a grid 
    * 
    * Reset the grid (back to the original Sudoku grid) using the list of moves . 
    * 
    * 
    * 
    * 
    * 
    ******************************************************/ 


    public class initializeGrid { 

    } 





    /****************************************************** 
    * 
    * Method levelDifficulty 
    * 
    * 
    * Established the parameters of level of difficulty 
    * 
    * 
    * @param beginner 
    * @param expert 
    * @return 
    ******************************************************/ 


    public int levelDifficulty (int beginner, int expert){ 

    while(true) 
    { 
    int levelDifficulty = 0; 

    levelDifficulty= userInput.nextInt(); 
    System.out.println (" "); 

    if(levelDifficulty < beginner || levelDifficulty> expert){ 
     System.out.print (" You must choose 1, 2 or 3." + "Please try again : "); 
     System.out.println (" "); 


    } 

    else 

     return levelDifficulty; 

    } 


} 




    /**************************************************** 
    * Method chooseGameDifficulty (chosisirNiveauDifficulte) 
    * 
    * The method makes possible to choose the level of complexity of a grid 
    * 
    * (1) beginner: the player starts the game with a grid made ​​up to 75% (81 * 0.75) 
    * 
    * (2) Intermediate : the player starts the game with a grid made ​​up to 50% (81 * 0.50) 
    * 
    * (3) Expert : the player starts the game with a grid made ​​up to 25% (81 * 0.25) 
    * 
    * Numbers are set randomly on the grid every new game 
    * 
    * @param beginner 
    * @param intermediate 
    * @param expert 
    ******************************************************/ 


public void chooseGameDifficulty(int beginner, int intermediate, int expert){ 

    boolean entreeValide; 
    int levelDifficulty; 
    String reponse; 
    levelDifficulty= levelDifficulty(beginner,expert); // call function levelDifficulty() 

     if(levelDifficulty==beginner) 
      //get easy level grid (getter) 

      //set easy level grid (setter) 


    if(levelDifficulty==intermediate) 
     //get intermediate level grid (getter) 

      //set intermediate level grid (setter) 


    if(levelDifficulty==expert) 
     //get expert level grid (getter) 

      //set easy expert grid (setter) 
      } 



    /**************************************************** 
    * Method solvePuzzle (resoudrePuzzle) 
    * 
    * This method makes possible to solve the entire grid meaning all the 81 cells 
    * 
    ******************************************************/ 


    public class solvePuzzle { 
    } 




    /**************************************************** 
    * Method makeMove (fairePlacement) 
    * 
    * Save a record of the player's actions on the grid. 
    * 
    * 
    * 
    * (1) make move on the grid ; 
    * (2) save moves in an array list 
    * 
    ******************************************************/ 



    public class makeMove { 




     //choose a cell , enter a number on the cell and confirm the selection 



     // adds move to the array list 
     int makeMove = gameMove++; 
    } 




    /**************************************************** 
    * Method cancelMove (annulerPlacement) 
    * 
    * 
    * 
    * (1) retrieve the last instance in the arraylist (using the remove method and the size method to determine the number of elements) 
    * (2) cancel the move in the grid. 
    * 
    ******************************************************/ 


    public class cancelMove { 


     //choose a cell , remove the number on the cell and confirm the cancellation 



     //substracts move from array list 
     int cancelMove = gameMove--; 

    } 






} 
+1

Ну, я бы начал, избавившись от статических ссылок – MadProgrammer

+0

Модель хранит и управляет состоянием, если данные и содержит правила, определяющие, как это изменилось; представление представляет состояние модели; контроллер управляет взаимодействием вида и модели; поэтому из вашего фрагмента кода нет, это не совсем то, что я считаю mvc – MadProgrammer

+0

Если это предположительно, чтобы быть программой на основе gui, почему у вас есть сканер для ввода пользователя и почему он находится в модели? – MadProgrammer

ответ

3

initializeGrid и chooseGameDifficulty не очень черты модели. Модель поддерживает текущее состояние данных и использует правила для управления им.

Технически эти функции должны быть функциями какого-то завода, что данный сложный уровень будет возвращать экземпляр модели

public class SudokuFactory { 
    public enum Difficulty { 
     HARD, 
     MODERATE, 
     EASY 
    } 

    public SudokuModel createModel(Difficulty difficult) { 
     // Make a new model based on the rules for your difficulty 
     // settings 
    } 
} 

модель будет затем просто содержать информацию и функциональные возможности для управления его

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

В представлении будет получена информация от пользователя (например, уровень сложности), который будет использоваться контроллером для создания новой модели. Затем модель будет передана новому контроллеру, который будет генерировать новое представление, которое должно отображать текущее состояние модели.

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

Вы должны также предпочитают использовать interfaces over implementation

Итак, основываясь на моем (довольно жалкий) понимания судоку вы могли бы использовать модель так просто, как ...

public interface SudokuModel { 
    public void setValueAt(int value, int row, int col) throws IllegalArgumentException; 
    public int getValueAt(int row, int col); 
} 

Теперь, мне, лично, я бы реализация, которая имела два буфера, один из которых представляет реальную игру/решение и один, который представляет данные игрока (предварительно заполненные на основе уровня сложности), теперь у вас может быть один буфер, но вы бы постоянно просматривали сетку, чтобы узнать, было ли новое значение действительным, и я просто слишком ленив;)