Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MVC-如何将一个已完成的文本游戏划分为MVC?_Java_Model View Controller - Fatal编程技术网

Java 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.

我在这里坐了好几个小时想弄明白这一点,所以对这个大问题有点同情

目标:我只想将完成的代码划分为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();
}
}
}

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