2013-03-22 73 views
0

所以我正在做一个基本的基本回合棋盘游戏,我试图找出构造它的最佳方式。我已经重组了3次。这是一个mac的可可项目。基于多人游戏热门转向的棋盘游戏的一般OOP范例

游戏开始时每个玩家有5000美元,并有能力购买6种不同的股票。每轮转动从玩家滚动3颗骰子开始,这决定了股票价值如何变化以及如果有股息从中赚取多少钱。游戏结束时,计时器用完,游戏开始前设置。

我在编程的过程中处于正确的位置,我意识到我对这件事的看法可能不会对任何事情有利。 :)去小菜一碟!

我试图坚持整个MVC范式,所以我的骰子角色生成器是我的模型和控制器与界面交互。我对mvc有很好的把握,我感觉。

我的应用程序委托调用与我的“stockwindowcontroller”类进行交互的主要xib,它可以控制其他所有内容。玩家窗口(我还没有完成)会向玩家展示他的资产并给他购买和出售的可能性。如果我按照我现在所拥有的方式进行操作,我必须将其置于stockwindowcontroller类下。

我在想,也许每个人都会把它当成自己的东西,因为有时候会有50转。所以一切都从转向对象中出来。那将意味着再次重做一切,我想确保我不会再次吠叫错误的树......。我从来不擅长概念化面向对象的思想,请原谅我,如果这是非常明显的。

谢谢你的时间!

回答

0

在做mvc时,我通常从命令行视图开始,然后添加东西,直到事情稳定下来。然后添加gui的东西。始终保持命令行视图和控制器,因为它们对测试非常有用。

开始尝试像这样的东西:

编辑:重构代码,以便观察得到通知,当球员钱改变或他被淘汰出。

import java.util.*; 
class DiceRoller { 
    DiceRoller(final int sides) { 
     this(1,sides); 
    } 
    DiceRoller(final int dice,final int sides) { 
     this.sides=sides; 
     this.dice=dice; 
    } 
    int roll() { 
     int sum=0; 
     for(int i=0;i<dice;i++) 
      sum+=random.nextInt(sides)+1; 
     return sum; 
    } 
    final Random random=new Random(); 
    final int dice; 
    final int sides; 
} 
class Stock { 
    Stock(int price) { 
     this.price=price; 
    } 
    int value; 
    int dividend; 
    final int id=ids++; 
    final int price; 
    static int ids; 
    public String toString() { 
     return ""+id+" "+value+" "+dividend; 
    } 
} 
class Player { 
    public void turn() { 
     System.out.print("turn for player "+id); 
     int die1=diceRoller.roll(); 
     System.out.print(", he rolls "+die1); 
     money+=die1-5; // real simple for now 
     System.out.println(", he has "+money); 
    } 
    public String toString() { 
     String s=""+id+" $"+money; 
     if(stocks.size()>0) 
      s+=" stocks"; 
     for(Stock stock:stocks.keySet()) 
      s+=" "+stock+" "+stocks.get(stock); 
     return s; 
    } 
    Map<Stock,Integer> stocks=new LinkedHashMap<Stock,Integer>(); 
    int money=10; 
    final int id=ids++; 
    DiceRoller diceRoller=new DiceRoller(6); 
    static int ids; 
} 
class Model extends Observable { 
    void init(int stocks,int players) { 
     for(int i=0;i<stocks;i++) 
      this.stocks.add(new Stock(random.nextInt(10)+1)); 
     for(int i=0;i<players;i++) 
      this.players.add(new Player()); 
     setChanged(); 
    } 
    void turn(Player player) { 
     player.turn(); 
     setChanged(); 
     notifyObservers(); 
    } 
    void busted(List<Player> busted) { 
     if(busted.size()>0) { 
      players.removeAll(busted); 
      setChanged(); 
      notifyObservers(); 
     } 
    } 
    public String toString() { 
     String s=""; 
     for(Stock stock:stocks) 
      s+="stock "+stock+"\n"; 
     for(Player player:players) 
      s+="player "+player+"\n"; 
     s=s.substring(0,s.length()-1); // removed last line feed 
     return s; 
    } 
    Random random=new Random(); 
    final List<Stock> stocks=new ArrayList<Stock>(); 
    final List<Player> players=new ArrayList<Player>(); 
} 
class CommandLineView implements Observer { 
    @Override public void update(Observable observable,Object hint) { 
     if(observable instanceof Model) 
      display((Model)observable); 
     else throw new RuntimeException("oops"); 
    } 
    void display(Model model) { 
     System.out.println("[update: "+model); 
     System.out.println("end of update]"); 
    } 
} 
class Game { 
    Game() { 
     model=new Model(); 
     view=new CommandLineView(); 
     model.addObserver(view); 
     model.init(4,3); 
     model.notifyObservers(); 
    } 
    void run() { 
     for(round=0;model.players.size()>1;round++) { 
      System.out.println("round "+round); 
      for(Player player:model.players) 
       model.turn(player); 
      List<Player> busted=new ArrayList<Player>(); 
      for(Player player:model.players) 
       if(player.money<=0) { 
        System.out.println("player "+player.id+" busted out."); 
        busted.add(player); 
       } 
      model.busted(busted); 
      if(round>10) { 
       System.out.println("breaking out"); 
       break; 
      } 
     } 
     if(model.players.size()==1) 
      System.out.println("the winner is "+model.players.get(0)); 
    } 
    final Model model; 
    Observer view; 
    int player; 
    int round; 
} 
public class So15578233 { 
    void run() { 
     game=new Game(); 
     game.run(); 
    } 
    public static void main(String[] args) { 
     new So15578233().run(); 
    } 
    Game game; 
} 
+0

那真是令人印象深刻!你几乎立刻就完成了我的游戏内部工作。可悲的是我忘了在我的问题中提到我正在使用目标c,试图制作一个mac应用程序。我对java的语法没有任何经验,虽然它很像c,而且我之前已经搞混了。 – Joonstar 2013-03-22 21:51:14

+0

mvc迷你架构基于观察者设计模式。 ios示例在http://stackoverflow.com/questions/9454074/register-a-class-in-objective-c,http://www.numbergrinder.com/2008/12/patterns-in-objective-c- observer-pattern /,http://www.a-coding.com/2010/10/observer-pattern-in-objective-c.html和http://www.cocoawithlove.com/2008/06/five-approaches -to-听,observing.html – 2013-03-22 23:32:46