Java MVC – 如何将完成的文本游戏划分为MVC?

现在坐在这里几个小时试图解决这个问题,所以对这个大问题有点同情。 🙂

目标:我只想将完成的代码分成MVC(模型视图控制器)部分。 我已完成游戏逻辑并基于文本 – 代码工作正常。

问题 :嗯,我想将这个代码实现到MVC中,但是在哪里解释它应该使用基于文本的MODEL? 因为VIEW仅用于布局(图形)正确吗? 我真的很难找到从哪里开始。 任何指针都会很棒!

这是我的游戏逻辑代码:

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

以下是我到目前为止定义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); } } } 

}

您的游戏模型可以有多个视图:GUI视图,控制台视图,状态视图等。通常,每个视图都会安排监听模型中的更改,然后查询模型以获取呈现它所需的信息。特别的观点。 这个简单的游戏专门用于说明概念。 名为“设计”的部分详细阐述。

附录:此大纲大致对应于此架构 ,如下所示。

MVC图

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

为了进行刺杀(这有点矫枉过正),我会制作一个游戏状态bean,代表游戏当前所处的状态; 那将是一个“模范对象”。 看看你的代码,它可能包含String [] mellan。 然后我会有一个数据访问对象,其中包含对游戏状态bean的引用,并且它将具有更新游戏状态的方法。

用于不同动作的游戏逻辑将在服务对象中,该服务对象具有对数据访问对象的引用,并且控制器将具有对服务对象的引用。 它将调用不同的操作方法,具体取决于从接口(视图)接收的交互。

就像我说的,这有点矫枉过正。