2012-03-21 13 views
-3

Мне нужно разработать игру надзорными играми в течение пятницы, но курс, который я делаю, кажется, пропустил несколько вещей, потому что, хотя мне удалось выполнить все остальные задания, этот окончательный проект невероятно выше моего понимания, но я должен что-то сделать.Проблемы с линейными ядрами Java

я иметь следующий графический код, который дает мне мои игровые сетки, но я не имею абсолютно не знаю как сделать следующие вещи

  1. присвоить корабль к некоторым клеткам - и цвет этих клеток, чтобы отразить это
  2. как сделать фактический хит, мисс, затонувший и обновлять сетку

я думаю, если я могу по крайней мере сделать это я могу дублировать код для процессора, но им SOOOOOOO застрял так что любая помощь будет очень ценнапожалуйста, ребята работают с некоторой магией :)

/** 
* BattleGui: 
* 
*/ 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 
import java.io.*; 

public class BattleGui implements ActionListener 
{ 
    // Default filename to use for saving and loading files 
    // Possible improvement: replace with a FileChooser 
    private final static String DEFAULT_FILENAME = "battlegui.txt"; 
    private int GRID_SIZE = 8; 
    private JButton [] buttonArray; 

    public JMenuBar createMenu() 
    { 
     JMenuBar menuBar = new JMenuBar();; 
     JMenu menu = new JMenu("Battle Menu"); 
     JMenuItem menuItem; 

     menuBar.add(menu); 

     // A group of JMenuItems. You can create other menu items here if desired 
     menuItem = new JMenuItem("New Game"); 
     menuItem.addActionListener(this); 
     menu.add(menuItem); 

     menuItem = new JMenuItem("Load Game"); 
     menuItem.addActionListener(this); 
     menu.add(menuItem); 

     menuItem = new JMenuItem("Save Game"); 
     menuItem.addActionListener(this); 
     menu.add(menuItem); 

     menuItem = new JMenuItem("Quit"); 
     menuItem.addActionListener(this); 
     menu.add(menuItem);   

     //a submenu 
     menu.addSeparator(); 
     return menuBar; 
    } 

    public Container createContentPaneCPU() 
    { 
     int numButtons = GRID_SIZE * GRID_SIZE; 
     JPanel grid = new JPanel(new GridLayout(GRID_SIZE,GRID_SIZE)); 
     buttonArray = new JButton[numButtons]; 


     for (int i=0; i<numButtons; i++) 
     { 
      buttonArray[i] = new JButton(" "); 

      // This label is used to identify which button was clicked in the action listener 
      buttonArray[i].setActionCommand("" + i); // String "0", "1" etc. 
      buttonArray[i].addActionListener(this); 
      grid.add(buttonArray[i]); 

     } 
     return grid; 
    } 

    public Container createContentPane() 
    { 
     int numButtons = GRID_SIZE * GRID_SIZE; 
     JPanel grid = new JPanel(new GridLayout(GRID_SIZE,GRID_SIZE)); 
     buttonArray = new JButton[numButtons]; 

     for (int i=0; i<numButtons; i++) 
     { 
      buttonArray[i] = new JButton(" "); 

      // This label is used to identify which button was clicked in the action listener 
      //buttonArray[i].setActionCommand("" + i); // String "0", "1" etc. 
      // buttonArray[i].addActionListener(this); 
      grid.add(buttonArray[i]); 
     } 
     return grid; 
    }  

    /** 
    * This method handles events from the Menu and the board. 
    * 
    */ 
    public void actionPerformed(ActionEvent e) 
    { 
     String classname = getClassName(e.getSource()); 
     JComponent component = (JComponent)(e.getSource()); 

     if (classname.equals("JMenuItem")) 
     { 
      JMenuItem menusource = (JMenuItem)(e.getSource()); 
      String menutext = menusource.getText(); 

      // Determine which menu option was chosen 
      if (menutext.equals("Load Game")) 
      { 
       /* BATTLEGUI Add your code here to handle Load Game **********/ 
       LoadGame(); 
      } 
      else if (menutext.equals("Save Game")) 
      { 
       /* BATTLEGUI Add your code here to handle Save Game **********/ 
       SaveGame(); 
      } 
      else if (menutext.equals("New Game")) 
      { 
       /* BATTLEGUI Add your code here to handle Save Game **********/ 
       NewGame(); 
      } 
     } 
     // Handle the event from the user clicking on a command button 
     else if (classname.equals("JButton")) 
     { 
      JButton button = (JButton)(e.getSource()); 
      int bnum = Integer.parseInt(button.getActionCommand()); 
      int row = bnum/GRID_SIZE; 
      int col = bnum % GRID_SIZE; 
      System.out.println(e.getSource()); 

      /* BATTLEGUI Add your code here to handle user clicking on the grid ***********/ 
      button.setBackground(Color.GREEN); 
      fireShot(row, col); 
     } 
    } 



    /** 
    * Returns the class name 
    */ 
    protected String getClassName(Object o) 
    { 
     String classString = o.getClass().getName(); 
     int dotIndex = classString.lastIndexOf("."); 
     return classString.substring(dotIndex+1); 
    } 

    /** 
    * Create the GUI and show it. 
    * For thread safety, this method should be invoked from the event-dispatching thread. 
    */ 
    private static void createAndShowGUI() 
    { 
     // Create and set up the window. 
     JFrame frame = new JFrame("Battleships"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     int maxGap = 20; 
     int ButtonWidth = 20; 
     int ButtonHeight = 1; 


     BattleGui battlegui = new BattleGui(); 
     frame.setJMenuBar(battlegui.createMenu()); 
     JPanel gui = new JPanel(new GridLayout(2,2,20,5)); 
     gui.setBorder(new EmptyBorder(5,5,5,5)); 
     //Set up components preferred size 
     JButton b = new JButton("Just fake button"); 
     Dimension buttonSize = b.getPreferredSize(); 

     gui.add(new JButton("Player")); 
     gui.add(new JButton("CPU")); 
     b.setPreferredSize(new Dimension(ButtonWidth, ButtonHeight)); 
     gui.add(battlegui.createContentPane()); 
     gui.add(battlegui.createContentPaneCPU()); 
     frame.setContentPane(gui); 
     // Create and set up the content pane. 
     /* 
     BattleGui battlegui = new BattleGui(); 
     frame.setJMenuBar(battlegui.createMenu()); 
     frame.setContentPane(battlegui.createContentPane()); 
     */ 

     // Display the window, setting the size 
     frame.setSize(800, 600); 
     frame.setVisible(true); 
    } 

    /** 
    * Sets a Gui grid square at row, col to display a character 
    */ 
    public boolean setGuiSquare(int row, int col, char c) 
    { 
     int bnum = row * GRID_SIZE + col; 
     if (bnum >= (GRID_SIZE*GRID_SIZE)) 
     { 
      return false; 
     } 
     else 
     { 
      buttonArray[bnum].setText(Character.toString(c)); 
     } 
     return true; 
    } 

    /** 
    * This is a standard main function for a Java GUI 
    */ 
    public static void main(String[] args) 
    { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 

       createAndShowGUI(); 
       //Deploy(); 
      } 
     }); 
    } 

    //************************************************************************ 
    //*** BATTLEGUI: Modify the methods below to respond to Menu and Mouse click events 

    /** 
    * This method is called from the Menu event: New Game. 
    * BATTLEGUI 
    */ 
    public void NewGame() 
    { 
     System.out.println("New game selected"); 

    } 


    /** 
    * This method is called from the Menu event: Load Game. 
    * BATTLEGUI 
    */ 
    public void LoadGame() 
    { 
      System.out.println("Load game selected"); 
    } 


    /** 
    * This method is called from the Menu event: Save Game. 
    * BATTLEGUI 
    */ 
    public void SaveGame() 
    { 
      System.out.println("Save game selected"); 
    } 

    /** 
    * This method is called from the Mouse Click event. 
    * BATTLEGUI 
    */ 
    public void fireShot(int row, int col) 
    { 
      System.out.println("Fire shot selected: at (" + row + ", " + col + ")"); 
    } 



} 
+0

https://stackoverflow.com/questions/28400111/battleships-game-android-tutorial – Qgenerator

ответ

4

Я бы предложил, сделайте шаг назад и подумайте о проблемном домене.

У вас есть BattleScene, в котором содержатся BattleSquares. Каждый битварский квадрат может иметь почти 1 корабль и может иметь цвет. У вас также есть объекты корабля (которые могут принадлежать определенному игроку, указывает, поврежден ли он или нет) ...

BattleSquare необходимо решить, является ли он Hit или Miss, поскольку он содержит всю информацию. Он знает, что у него есть корабль или нет.

/**true if had a ship, false if it was a miss 
    */ 
public class BattleSquare{  
     public boolean processHit(){ 
      if (hasShip()){ 
       ship.setState(DESTROYED); 
       return true; 
      } 
      return false; 
     } 
     public void setShip(Ship ship){ .... } 
     public boolean hasShip() { ... } } ... methods for color too 

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

Аналогично, ваш BattleScene будет содержать List BattleSquares. Когда вы стреляете, вы можете индивидуально искать конкретный BattleSquare и рассказывать об этом самому. Если это удар, вы обновляете состояние.

Идея заключается в том, что ваши классы моделей отвечают только за управление состоянием. Классы контроллера могут запускать события, которые перехватываются представлениями, которые обновляют модели и обновляются сами.

надеюсь, что это поможет.

+0

его фактическая клеточная нагрузка, которая действительно получает меня здесь, я могу писать логику внутри и вокруг, но я понятия не имею, как выбрать скажем, ячейку 1-го столбца 2, а затем покрасить ее, таким образом, я мог бы заниматься развертыванием кораблей, а также фактическим воспроизведением игры, выбрав цвет на основе того, появятся ли координаты в массиве – JazziJeff

+0

, вам нужно указать модель сетка, чтобы покрасить себя. View автоматически обновит его. Если это имеет смысл, возможно, используйте JTable. Напишите TableModel, вы можете использовать средство отображения ячеек для цвета на основе атрибута. Существует полный учебник по адресу http://docs.oracle.com/javase/tutorial/uiswing/components/table.html. Это только в том случае, если имеет смысл использовать ячейки таблицы вместо сетки, которую вы пытаетесь сделать. Я подозреваю, что это задание можно использовать. – Nasir

Смежные вопросы