Проблемы линкора Java - PullRequest
       3

Проблемы линкора Java

0 голосов
/ 22 марта 2012

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

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

  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 + ")");
    }



}

1 Ответ

4 голосов
/ 22 марта 2012

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

У вас есть BattleScene, которая содержит BattleSquares. Каждый BattleSquare может иметь не более 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 и сказать ему, чтобы он обрабатывался сам. Если это попадание, вы обновляете состояние.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...