Java MVC-如何将一个已完成的文本游戏划分为MVC?
我在这里坐了好几个小时想弄明白这一点,所以对这个大问题有点同情 目标:我只想将完成的代码划分为MVC(模型-视图-控制器)部分。我已经完成了游戏逻辑和基于文本的-代码运行良好 问题:好吧,我想把这段代码实现到MVC中,但是你在哪里解释模型应该使用基于文本的?因为视图仅用于布局(图形)正确吗?我真的很难弄清楚从哪里开始。任何指针都会很好 这是我的游戏逻辑代码:Java MVC-如何将一个已完成的文本游戏划分为MVC?,java,model-view-controller,Java,Model View Controller,我在这里坐了好几个小时想弄明白这一点,所以对这个大问题有点同情 目标:我只想将完成的代码划分为MVC(模型-视图-控制器)部分。我已经完成了游戏逻辑和基于文本的-代码运行良好 问题:好吧,我想把这段代码实现到MVC中,但是你在哪里解释模型应该使用基于文本的?因为视图仅用于布局(图形)正确吗?我真的很难弄清楚从哪里开始。任何指针都会很好 这是我的游戏逻辑代码: import mind.*; import javax.swing.*; import java.util.*; import java.
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();
}
}
}
还有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);
}
}
}
}我想尝试一下(这有点过分了),我会制作一个游戏状态bean来表示游戏当前的状态;这将是一个“模型对象”。查看您的代码,它可能包含字符串[]mellan。然后我将有一个数据访问对象,其中包含对游戏状态bean的引用,并且它将有更新游戏状态的方法
不同操作的游戏逻辑将位于一个服务对象中,该服务对象具有对数据访问对象的引用,而控制器具有对服务对象的引用。它将调用不同的操作方法,具体取决于从接口(视图)接收到的交互
就像我说的,这有点过分了 您的游戏模型可以有多个视图:GUI视图、控制台视图、状态视图等。通常,每个视图都会安排侦听模型中的更改,然后查询模型,以获取呈现其特定视图所需的信息。这个简单的设计就是为了说明这些概念。名为“设计”的部分更详细地阐述了这一点 附录:本大纲大致对应于此,符号如下
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(...);
}
}
谢谢你的回复,垃圾神。有一件事我有点困惑,比如说我创建了一个DriveModel.java DriveView.java DriveController.java和一个主DriveMVC.java。。。要知道一切都正常工作,当我运行DriveMVC.java时,终端允许我在自动启动GUI视图之前先执行文本视图?我一到家就看你的链接!非常感谢。杰出的我在上面添加了一个大纲。另请参见此相关内容。我的理解是,控制器应该只是动作侦听器,为什么您的示例中的控制器扩展了JPanel?
Control
包括用户可以通过其控制视图或模型的组件<代码>JToolBar是另一种选择。有关更多信息,请参见上一个附录。+1了解bean的定义,这是实现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(...);
}
}