MVC Java - Как разделить сделанную текстовую игру на MVC?

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

Цель: Я просто хочу разделить свой сделанный код на MVC (Образцовый Контроллер Представления) части. Мне сделали игровые логики и базирующийся текст - код хорошо работает.

Проблема: Ну, я хочу реализовать этот код в MVC, но где действительно объясняют для МОДЕЛИ, что это должно использовать основанный на тексте? Поскольку ПРЕДСТАВЛЕНИЕ только для расположения (графически) исправляют? Мне ДЕЙСТВИТЕЛЬНО нелегко выяснять, где начать вообще. Любые указатели были бы так хороши!

Вот мой игровой код логик:

import mind.*;
import javax.swing.*;
import java.util.*;
import java.lang.*;
import java.awt.*;

public class Drive {
String[] mellan;
boolean gameEnd, checkempty, checkempty2, enemy, enemy2;
String gr,rd,tom;
int digits;

public Drive() {
    // Gamepieces in textform
    gr="G"; rd="R"; tom=" ";


    mellan = new String[7];
    String[] begin = {gr,gr,gr,tom,rd,rd,rd};
    String[] end = {rd,rd,rd,tom,gr,gr,gr};

    //input
    Scanner in = new Scanner(System.in);

    mellan=begin;
    gameEnd=false;
    while (gameEnd == false) {
        for(int i=0; i<mellan.length; i++) {
            System.out.print(mellan[i]);
        }
        System.out.print("        Choose 0-6: ");

        digits = in.nextInt();
        move();
        checkWin();
    }
}

void move() {
    //BOOLEAN for gameruls!!!
    checkempty = digits<6 && mellan[digits+1]==tom;
    checkempty2 = digits>0 && mellan[digits-1]==tom;
    enemy = (mellan[digits]==gr && mellan[digits+1]==rd &&     mellan[digits+2]==tom);
    enemy2 = (mellan[digits]==rd && mellan[digits-1]==gr && mellan[digits-2]==tom);

    if(checkempty) {
        mellan[digits+1]=mellan[digits];
        mellan[digits]=tom;
    } else if (checkempty2) {
        mellan[digits-1]=mellan[digits];
        mellan[digits]=tom;
    } else if (enemy) {
        mellan[digits+2]=mellan[digits];
        mellan[digits]=tom;
    } else if (enemy2) {
        mellan[digits-2]=mellan[digits];
        mellan[digits]=tom;
    }
}

void checkWin() {
    String[] end = {rd,rd,rd,tom,gr,gr,gr};
    for (int i=0; i<mellan.length; i++){
    }
    if (Arrays.equals(mellan,end)) {
        for (int j=0; j<mellan.length; j++) {
            System.out.print(mellan[j]);
        }
        displayWin();
    }
}

void displayWin() {
    gameEnd = true;
    System.out.println("\nNicely Done!");
    return;
}

// Kör Drive!
public static void main(String args[]) {
    new Drive();
}
}

Вот то, как я определил свой DriveView к настоящему времени: (просто пытающийся сделать одну кнопку для работы)

import mind.*;
import javax.swing.*;
import java.util.*;
import java.lang.*;
import java.awt.*;
import java.awt.event.*;

public class DriveView extends JFrame {
JButton ruta1 = new JButton("Green");
JButton ruta2 = new JButton("Green");
JButton rutatom = new JButton("");
JButton ruta6 = new JButton("Red");
private DriveModel m_model;

public DriveView(DriveModel model) {
    m_model = model;

    //Layout for View
    JPanel myPanel = new JPanel();
    myPanel.setLayout(new FlowLayout());
    myPanel.add(ruta1);
    myPanel.add(ruta2);
    myPanel.add(rutatom);
    myPanel.add(ruta6);
    this.setContentPane(myPanel);
    this.pack();
    this.setTitle("Drive");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

void addMouseListener(ActionListener mol) {
    ruta2.addActionListener(mol);
}

}

И DriveController, который дает мне ошибку в компиляции

import mind.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.*;

public class DriveController {
private DriveModel m_model;
private DriveView m_view;

public DriveController(DriveModel model, DriveView view) {
    m_model = model;
    m_view = view;

    view.addMouseListener(new MouseListener());
}

class MouseListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        String mening;
        mening = e.getActionCommand();
        if (mening.equals("Green")) {
            setForeground(Color.red);
        }
    }
}

}

9
задан Zopyrus 21 April 2010 в 23:55
поделиться

2 ответа

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

Приложение: Этот план примерно соответствует этой архитектуре , обозначенной ниже.

MVC diagram

public class MVCOutline {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            //@Override
            public void run() {
                new MVCOutline().create();
            }
        });
    }

    private void create() {
        JFrame f = new JFrame("MVC Outline");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new MainPanel());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

class MainPanel extends JPanel {

    public MainPanel() {
        super(new BorderLayout());
        Model model = new Model();
        View view = new View(model);
        Control  control = new Control(model, view);
        this.add(view, BorderLayout.CENTER);
        this.add(control, BorderLayout.WEST);
    }
}

class Control extends JPanel implements ... {

    private Model model;
    private View view;

    public Control(Model model, View view) {
        this.model = model;
        this.view = view;
    }
}

class View extends JPanel implements Observer {

    private Model model;

    public View(Model model) {
        this.model = model;
        model.addObserver(this);
    }

    public void update(Observable o, Object arg) {
        // update GUI based on model
    }
}

class Model extends Observable {

    public void next() {
        this.notifyObservers(...);
    }
}
17
ответ дан 4 December 2019 в 11:04
поделиться

Чтобы нанести удар (а это своего рода излишество), я бы сделал bean-компонент состояния игры, который бы представлял состояние, в котором сейчас находится игра; это будет «объект модели». Глядя на ваш код, он, вероятно, будет содержать String [] mellan. Тогда у меня будет объект доступа к данным, который содержит ссылку на bean-компонент состояния игры, и у него будут методы для обновления состояния игры.

Игровая логика для различных действий будет в объекте службы, который имеет ссылку на объект доступа к данным, а контроллер будет иметь ссылку на объект службы. Он будет вызывать различные методы действий в зависимости от того, какое взаимодействие было получено от интерфейса, представления.

Как я уже сказал, это своего рода перебор.

2
ответ дан 4 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: