Java MVC – Wie teile ich ein fertiges Textspiel in MVC?

Ich habe stundenlang hier gesessen und versucht, das herauszufinden, also ein bisschen Sympathie für diese große Frage. 🙂

Das Ziel: Ich möchte meinen fertigen Code einfach in MVC (Model View Controller) teilen. Ich habe die Spiellogiken gemacht und Text basiert – der Code funktioniert gut.

Das Problem : Nun, ich möchte diesen Code in MVC implementieren, aber wo erklären Sie für das MODELL, dass es textbasiert verwendet werden soll? Weil die VIEW nur ​​für das Layout (grafisch) korrekt ist? Es fällt mir wirklich schwer, herauszufinden, wo ich anfangen soll. Irgendwelche Hinweise wären so nett!

Hier ist mein Spiellogik-Code:

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 = digits0 && 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(); } } 

Hier ist, wie ich meine DriveView bis jetzt definiert: (nur versuchen, einen Knopf zum Arbeiten zu machen)

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

}

Und DriveController, der mir beim Kompilieren Fehler gibt

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

}

Ihr Spielmodell kann mehrere Ansichten haben: eine GUI-Ansicht, eine Konsolenansicht, eine Statusansicht usw. Normalerweise sieht jede Ansicht auf Änderungen im Modell zu und fragt dann das Modell nach den Informationen ab, die es zum Rendern benötigt bestimmte Ansicht. Dieses einfache Spiel wurde speziell entwickelt, um die Konzepte zu veranschaulichen. Der Abschnitt namens “Design” wird detaillierter ausgeführt.

Nachtrag: Dieser Entwurf entspricht ungefähr dieser Architektur , die unten symbolisiert ist.

MVC-Diagramm

 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(...); } } 

Um einen Stich zu machen (und das ist eine Art Overkill), würde ich eine Spielstatus-Bean machen, die den Zustand repräsentieren würde, in dem sich das Spiel gerade befindet. das wäre ein “Modellobjekt”. Betrachtet man den Code, würde er wahrscheinlich String [] mellan enthalten. Dann hätte ich ein Datenzugriffsobjekt, das einen Verweis auf die Spielstatus-Bean enthält und Methoden zum Aktualisieren des Spielzustands hätte.

Die Spiellogik für verschiedene Aktionen würde sich in einem Dienstobjekt befinden, das eine Referenz auf das Datenzugriffsobjekt hat, und die Steuerung hätte eine Referenz auf das Dienstobjekt. Es würde die verschiedenen Aktionsmethoden aufrufen, abhängig davon, welche Interaktion von der Schnittstelle, der Ansicht, empfangen wurde.

Wie ich schon sagte, das ist eine Art Overkill.