2010-04-21 11 views
8

Şimdi saatlerce burada oturuyoruz, bunu anlamaya çalışıyorum, bu büyük soru için biraz sempati. :)Java MVC - Bitmiş bir metin oyununu MVC'ye nasıl bölersin?

Hedef: Sadece yaptığım kodu MVC (Model View Controller) parçalarına bölmek istiyorum. Oyun mantığını tamamladım ve metin tabanlıyım - kod iyi çalışıyor.

Sorun: Bu kodu MVC'ye uygulamak istiyorum, ancak MODEL'i metin tabanlı kullanması gerekenleri açıklar mı? VIEW sadece düzen için (grafiksel) doğru mu? Nereden başlayacağımı bulmak için gerçekten zor bir zaman geçiriyorum. Herhangi bir işaretçi çok güzel olurdu!

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

Ben bugüne kadar benim Drive View tanımlı nasıl: Burada

oyunum mantıkları kodudur

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

}

(sadece çalışmak için bir düğme yapmaya çalışıyorum) Ve bana hata veren 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); 
     } 
    } 
} 

}

cevap

18

Oyun modeliniz birden çok görünüme sahip olabilir: GUI görünümü, konsol görünümü, durum görünümü, vb. Genellikle her görünüm, modeldeki değişiklikleri dinlemeye ve daha sonra bilgi için modeli sorgular. belirli bir görünümünü oluşturması gerekiyor. Bu basit game, özellikle kavramları göstermek için tasarlanmıştır. "Tasarım" adlı bölüm daha ayrıntılı olarak detaylandırılmıştır.

Zeyilname: Bu taslak aşağıda sembolize, bu architecture kabaca karşılık gelir. [Bağlanmış özellikleri] için

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

Yanıt trashgod için teşekkürler. Biraz şaşkın olduğum bir şey, örneğin DriveMVC.java'yı çalıştırdığımda her şeyin doğru çalıştığını bilmek için bir DriveModel.java DriveView.java DriveController.java ve bir ana DriveMVC.java oluşturduğumu söyleyeyim terminal, GUI görünümünü otomatik olarak başlatmadan önce metin görünümünü yapmama izin veriyor mu? Eve vardığım anda bağlantınıza bir göz atacağım! Teşekkür ederim! – Zopyrus

+0

Mükemmel; Yukarıda bir anahat ekledim. – trashgod

+1

Ayrıca bkz. Bu ilgili [örnek] (http://stackoverflow.com/questions/3066590/gui-problem-after-rewriting-to-mvc/3072979#3072979). – trashgod

2

Kesmek için (ve bu bir tür aşırı sıkıntı), oyunun şu anda içinde bulunduğu durumu temsil edecek bir oyun durumu çekirdeği yapardım; Bu bir "model nesne" olurdu. Kodunuza bakarak muhtemelen String [] mellan içerir. Sonra oyun durumu fasulyesine bir referans içeren bir veri erişim nesnesine sahip olurdum ve oyun durumunu güncellemek için yöntemler olurdu. farklı işlemler için

oyun mantığı veri erişim nesnesine bir başvuru vardır ve denetleyici hizmet nesnesine bir başvuru olurdu bir hizmet nesnesi olacaktır. Arayüzden hangi etkileşimin alındığına bağlı olarak farklı eylem yöntemlerini çağırır.

Dediğim gibi, bu bir çeşit overkill.

+0

+1 (http://download.oracle.com/javase/tutorial/javabeans/properties/bound.html) uygulamak için bir yol olan fasulye, ve MVC'de kullanılan gözlemci deseni. Üzgünüm, bunu daha önce gözden kaçırdım. – trashgod

İlgili konular